diff options
432 files changed, 0 insertions, 71698 deletions
diff --git a/sys/man/8/drawterm b/sys/man/8/drawterm deleted file mode 100644 index 5dadc385c..000000000 --- a/sys/man/8/drawterm +++ /dev/null @@ -1,117 +0,0 @@ -.TH DRAWTERM 8 -.SH NAME -drawterm \- connect to Plan 9 CPU servers from other operating systems -.SH SYNOPSIS -.B drawterm -[ -.B -d -] -[ -.B -a -.I authaddr -] -[ -.B -c -.I cpuaddr -] -[ -.B -e -.I encryption-hash-algs -] -[ -.B -k -.I keypattern -] -[ -.B -s -.I secstoreaddr -] -[ -.B -u -.I user -] -[ -.B -C -.I cmd args ... -] -.SH DESCRIPTION -.I Drawterm -is -.I not -a Plan 9 program. -It is a program that users of non-Plan 9 systems can use -to establish graphical -.IR cpu (1) -connections with Plan 9 CPU servers. -Just as a real Plan 9 terminal does, -.I drawterm -serves its local name space -as well as some devices (the keyboard, mouse, and screen) -to a remote CPU server, which mounts this name space -on -.B /mnt/term -and starts a shell. -Typically, either explicitly or via the profile, one uses the shell -to start -.IR rio (1). -.PP -By default, -drawterm -uses the CPU server -.B $cpu -or -.BR cpu . -and the authentication server -.B $auth -or -.BR auth . -The -.BR -a , -.BR -c , -and -.B -s -options specify alternate authentication, CPU and -.I secstore -servers, -respectively. -(Edit the source to set appropriate local defaults.) -.PP -.I Cmd -is a command to be executed remotely. -Options -.LR e , -.LR k , -and -.L u -have the same meaning as in -.IR cpu (1). -.PP -Drawterm has been ported to -FreeBSD, -Irix, -Linux, -NetBSD, -and -Windows. -Binaries can be downloaded from -.BR http://swtch.com/drawterm/ . -.SH SOURCE -.B /sys/src/cmd/unix/drawterm -.SH DIAGNOSTICS -Drawterm prints most diagnostics in its own window. -.SH "SEE ALSO -.IR cpu (1), -.IR rio (1) -.SH BUGS -Although at first -.I drawterm -may seem like a Plan 9 terminal, in fact it is just a way to provide a CPU server -with some terminal devices. -The difference is important because one cannot run terminal-resident programs -when using -.IR drawterm . -The illusion can be improved by delicate adjustments in -.BR /usr/$user/lib/profile . -.PP -It would be nice to be able to change the default servers -without recompiling. diff --git a/sys/src/cmd/unix/drawterm/9ball.ico b/sys/src/cmd/unix/drawterm/9ball.ico Binary files differdeleted file mode 100644 index a478755a5..000000000 --- a/sys/src/cmd/unix/drawterm/9ball.ico +++ /dev/null diff --git a/sys/src/cmd/unix/drawterm/9ball.png b/sys/src/cmd/unix/drawterm/9ball.png Binary files differdeleted file mode 100644 index 8852aa232..000000000 --- a/sys/src/cmd/unix/drawterm/9ball.png +++ /dev/null diff --git a/sys/src/cmd/unix/drawterm/9ball.rc b/sys/src/cmd/unix/drawterm/9ball.rc deleted file mode 100755 index ed41d0db2..000000000 --- a/sys/src/cmd/unix/drawterm/9ball.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "9ball.ico" diff --git a/sys/src/cmd/unix/drawterm/LICENSE b/sys/src/cmd/unix/drawterm/LICENSE deleted file mode 100644 index 31c6256e8..000000000 --- a/sys/src/cmd/unix/drawterm/LICENSE +++ /dev/null @@ -1,245 +0,0 @@ -Copyright (c) 2005 Lucent Technologies -Portions Copyright (c) 2005 Russ Cox, MIT - -The Plan 9 software is provided under the terms of the -Lucent Public License, Version 1.02, reproduced below. - -=================================================================== - -Lucent Public License Version 1.02 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE -PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - - a. in the case of Lucent Technologies Inc. ("LUCENT"), the Original - Program, and - b. in the case of each Contributor, - - i. changes to the Program, and - ii. additions to the Program; - - where such changes and/or additions to the Program were added to the - Program by such Contributor itself or anyone acting on such - Contributor's behalf, and the Contributor explicitly consents, in - accordance with Section 3C, to characterization of the changes and/or - additions as Contributions. - -"Contributor" means LUCENT and any other entity that has Contributed a -Contribution to the Program. - -"Distributor" means a Recipient that distributes the Program, -modifications to the Program, or any part thereof. - -"Licensed Patents" mean patent claims licensable by a Contributor -which are necessarily infringed by the use or sale of its Contribution -alone or when combined with the Program. - -"Original Program" means the original version of the software -accompanying this Agreement as released by LUCENT, including source -code, object code and documentation, if any. - -"Program" means the Original Program and Contributions or any part -thereof - -"Recipient" means anyone who receives the Program under this -Agreement, including all Contributors. - -2. GRANT OF RIGHTS - - a. Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free copyright - license to reproduce, prepare derivative works of, publicly display, - publicly perform, distribute and sublicense the Contribution of such - Contributor, if any, and such derivative works, in source code and - object code form. - - b. Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free patent - license under Licensed Patents to make, use, sell, offer to sell, - import and otherwise transfer the Contribution of such Contributor, if - any, in source code and object code form. The patent license granted - by a Contributor shall also apply to the combination of the - Contribution of that Contributor and the Program if, at the time the - Contribution is added by the Contributor, such addition of the - Contribution causes such combination to be covered by the Licensed - Patents. The patent license granted by a Contributor shall not apply - to (i) any other combinations which include the Contribution, nor to - (ii) Contributions of other Contributors. No hardware per se is - licensed hereunder. - - c. Recipient understands that although each Contributor grants the - licenses to its Contributions set forth herein, no assurances are - provided by any Contributor that the Program does not infringe the - patent or other intellectual property rights of any other entity. Each - Contributor disclaims any liability to Recipient for claims brought by - any other entity based on infringement of intellectual property rights - or otherwise. As a condition to exercising the rights and licenses - granted hereunder, each Recipient hereby assumes sole responsibility - to secure any other intellectual property rights needed, if any. For - example, if a third party patent license is required to allow - Recipient to distribute the Program, it is Recipient's responsibility - to acquire that license before distributing the Program. - - d. Each Contributor represents that to its knowledge it has sufficient - copyright rights in its Contribution, if any, to grant the copyright - license set forth in this Agreement. - -3. REQUIREMENTS - -A. Distributor may choose to distribute the Program in any form under -this Agreement or under its own license agreement, provided that: - - a. it complies with the terms and conditions of this Agreement; - - b. if the Program is distributed in source code or other tangible - form, a copy of this Agreement or Distributor's own license agreement - is included with each copy of the Program; and - - c. if distributed under Distributor's own license agreement, such - license agreement: - - i. effectively disclaims on behalf of all Contributors all warranties - and conditions, express and implied, including warranties or - conditions of title and non-infringement, and implied warranties or - conditions of merchantability and fitness for a particular purpose; - ii. effectively excludes on behalf of all Contributors all liability - for damages, including direct, indirect, special, incidental and - consequential damages, such as lost profits; and - iii. states that any provisions which differ from this Agreement are - offered by that Contributor alone and not by any other party. - -B. Each Distributor must include the following in a conspicuous - location in the Program: - - Copyright (C) 2003, Lucent Technologies Inc. and others. All Rights - Reserved. - -C. In addition, each Contributor must identify itself as the -originator of its Contribution in a manner that reasonably allows -subsequent Recipients to identify the originator of the Contribution. -Also, each Contributor must agree that the additions and/or changes -are intended to be a Contribution. Once a Contribution is contributed, -it may not thereafter be revoked. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain -responsibilities with respect to end users, business partners and the -like. While this license is intended to facilitate the commercial use -of the Program, the Distributor who includes the Program in a -commercial product offering should do so in a manner which does not -create potential liability for Contributors. Therefore, if a -Distributor includes the Program in a commercial product offering, -such Distributor ("Commercial Distributor") hereby agrees to defend -and indemnify every Contributor ("Indemnified Contributor") against -any losses, damages and costs (collectively"Losses") arising from -claims, lawsuits and other legal actions brought by a third party -against the Indemnified Contributor to the extent caused by the acts -or omissions of such Commercial Distributor in connection with its -distribution of the Program in a commercial product offering. The -obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. -In order to qualify, an Indemnified Contributor must: a) promptly -notify the Commercial Distributor in writing of such claim, and b) -allow the Commercial Distributor to control, and cooperate with the -Commercial Distributor in, the defense and any related settlement -negotiations. The Indemnified Contributor may participate in any such -claim at its own expense. - -For example, a Distributor might include the Program in a commercial -product offering, Product X. That Distributor is then a Commercial -Distributor. If that Commercial Distributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Distributor's responsibility -alone. Under this section, the Commercial Distributor would have to -defend claims against the Contributors related to those performance -claims and warranties, and if a court requires any Contributor to pay -any damages as a result, the Commercial Distributor must pay those -damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS -PROVIDED ON AN"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY -WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY -OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely -responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement, including but not limited to -the risks and costs of program errors, compliance with applicable -laws, damage to or loss of data, programs or equipment, and -unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR -ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING -WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR -DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED -HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. EXPORT CONTROL - -Recipient agrees that Recipient alone is responsible for compliance -with the United States export administration regulations (and the -export control laws and regulation of any other countries). - -8. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further -action by the parties hereto, such provision shall be reformed to the -minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against a Contributor with -respect to a patent applicable to software (including a cross-claim or -counterclaim in a lawsuit), then any patent licenses granted by that -Contributor to such Recipient under this Agreement shall terminate as -of the date such litigation is filed. In addition, if Recipient -institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program -itself (excluding combinations of the Program with other software or -hardware) infringes such Recipient's patent(s), then such Recipient's -rights granted under Section 2(b) shall terminate as of the date such -litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of -time after becoming aware of such noncompliance. If all Recipient's -rights under this Agreement terminate, Recipient agrees to cease use -and distribution of the Program as soon as reasonably practicable. -However, Recipient's obligations under this Agreement and any licenses -granted by Recipient relating to the Program shall continue and -survive. - -LUCENT may publish new versions (including revisions) of this -Agreement from time to time. Each new version of the Agreement will be -given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new -version of the Agreement is published, Contributor may elect to -distribute the Program (including its Contributions) under the new -version. No one other than LUCENT has the right to modify this -Agreement. Except as expressly stated in Sections 2(a) and 2(b) above, -Recipient receives no rights or licenses to the intellectual property -of any Contributor under this Agreement, whether expressly, by -implication, estoppel or otherwise. All rights in the Program not -expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and -the intellectual property laws of the United States of America. No -party to this Agreement will bring a legal action under this Agreement -more than one year after the cause of action arose. Each party waives -its rights to a jury trial in any resulting litigation. - diff --git a/sys/src/cmd/unix/drawterm/Make.config b/sys/src/cmd/unix/drawterm/Make.config deleted file mode 100644 index 850c1d731..000000000 --- a/sys/src/cmd/unix/drawterm/Make.config +++ /dev/null @@ -1,2 +0,0 @@ -AUDIO=none -include $(ROOT)/Make.$(CONF) diff --git a/sys/src/cmd/unix/drawterm/Make.irix b/sys/src/cmd/unix/drawterm/Make.irix deleted file mode 100644 index 7a31df2f6..000000000 --- a/sys/src/cmd/unix/drawterm/Make.irix +++ /dev/null @@ -1,24 +0,0 @@ -# Unix -PTHREAD= # for Mac -#PTHREAD=-pthread -AR=ar -AS=as -ASFLAGS=-c -mips3 -RANLIB=true -X11=/usr/X11R6 -#CC=gcc -#CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -I$(X11)/include -D_THREAD_SAFE $(PTHREAD) -O2 -CC=cc -CFLAGS=-g -O2 -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -I$(X11)/include -DIRIX -O=o -OS=posix -GUI=x11 -LDADD=-L$(X11)/lib -lX11 -g -lpthread -LDFLAGS=$(PTHREAD) -TARG=drawterm -MAKE=gmake - -all: default - -libmachdep.a: - (cd posix-mips && $(MAKE)) diff --git a/sys/src/cmd/unix/drawterm/Make.osx b/sys/src/cmd/unix/drawterm/Make.osx deleted file mode 100644 index c74d74be0..000000000 --- a/sys/src/cmd/unix/drawterm/Make.osx +++ /dev/null @@ -1,20 +0,0 @@ -# Mac OS X -PTHREAD= # for Mac -AR=ar -AS=as -RANLIB=ranlib -CC=gcc -CFLAGS=-m32 -Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -D_THREAD_SAFE $(PTHREAD) -O2 -O=o -OS=posix -GUI=osx -LDADD=-ggdb -framework Carbon -framework QuickTime -LDFLAGS=$(PTHREAD) -m32 -TARG=drawterm -AUDIO=none - -all: default - -libmachdep.a: - arch=`uname -m|sed 's/i.86/386/;s/Power Macintosh/power/'`; \ - (cd posix-$$arch && make) diff --git a/sys/src/cmd/unix/drawterm/Make.osx-x11 b/sys/src/cmd/unix/drawterm/Make.osx-x11 deleted file mode 100644 index 10f94b195..000000000 --- a/sys/src/cmd/unix/drawterm/Make.osx-x11 +++ /dev/null @@ -1,21 +0,0 @@ -# Mac OS X -PTHREAD= # for Mac -AR=ar -AS=as -RANLIB=ranlib -X11=/usr/X11R6 -CC=gcc -CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -I$(X11)/include -D_THREAD_SAFE $(PTHREAD) -O2 -O=o -OS=posix -GUI=x11 -LDADD=-L$(X11)/lib -lX11 -ggdb -LDFLAGS=$(PTHREAD) -TARG=drawterm -AUDIO=none - -all: default - -libmachdep.a: - arch=`uname -m|sed 's/i.86/386/;s/Power Macintosh/power/'`; \ - (cd posix-$$arch && make) diff --git a/sys/src/cmd/unix/drawterm/Make.pthread b/sys/src/cmd/unix/drawterm/Make.pthread deleted file mode 100644 index 344265331..000000000 --- a/sys/src/cmd/unix/drawterm/Make.pthread +++ /dev/null @@ -1,22 +0,0 @@ -# Unix -#PTHREAD= # for Mac -PTHREAD=-pthread -DPTHREAD -AR=ar -AS=no-as-here -RANLIB=ranlib -X11=/usr/X11R6 -CC=gcc -CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -I$(X11)/include -D_THREAD_SAFE $(PTHREAD) -O2 -O=o -OS=posix -GUI=x11 -LDADD=-L$(X11)/lib64 -L$(X11)/lib -lX11 -ggdb -LDFLAGS=$(PTHREAD) -TARG=drawterm -# AUDIO=none -AUDIO=unix - -all: default - -libmachdep.a: - (cd posix-port && make) diff --git a/sys/src/cmd/unix/drawterm/Make.sun b/sys/src/cmd/unix/drawterm/Make.sun deleted file mode 100644 index df6d1bc23..000000000 --- a/sys/src/cmd/unix/drawterm/Make.sun +++ /dev/null @@ -1,21 +0,0 @@ -# Sun-specific -PTHREAD= -AR=ar -AS=as -RANLIB=ranlib -X11=/usr/X11R6 -CC=cc -CFLAGS=-xCC -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -g -D_THREAD_SAFE -O=o -OS=posix -GUI=x11 -LDADD=-L$(X11)/lib -lX11 -lrt -lpthread -lsocket -lnsl -LDFLAGS= -TARG=drawterm -AUDIO=none - -all: default - -libmachdep.a: - arch=`uname -m|sed 's/i.86/386/;s/Power Macintosh/power/'`; \ - (cd posix-$$arch && make) diff --git a/sys/src/cmd/unix/drawterm/Make.unix b/sys/src/cmd/unix/drawterm/Make.unix deleted file mode 100644 index 5f9b218d6..000000000 --- a/sys/src/cmd/unix/drawterm/Make.unix +++ /dev/null @@ -1,23 +0,0 @@ -# Unix -#PTHREAD= # for Mac -PTHREAD=-pthread -AR=ar -AS=as -RANLIB=ranlib -X11=/usr/X11R6 -CC=gcc -CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -I$(X11)/include -D_THREAD_SAFE $(PTHREAD) -O2 -O=o -OS=posix -GUI=x11 -LDADD=-L$(X11)/lib64 -L$(X11)/lib -lX11 -ggdb -LDFLAGS=$(PTHREAD) -TARG=drawterm -# AUDIO=none -AUDIO=unix - -all: default - -libmachdep.a: - arch=`uname -m|sed 's/i.86/386/;s/Power Macintosh/power/; s/x86_64/amd64/'`; \ - (cd posix-$$arch && make) diff --git a/sys/src/cmd/unix/drawterm/Make.win32 b/sys/src/cmd/unix/drawterm/Make.win32 deleted file mode 100644 index 004387cac..000000000 --- a/sys/src/cmd/unix/drawterm/Make.win32 +++ /dev/null @@ -1,42 +0,0 @@ -# Windows via mingw32 -# MING=mingw32- is necessary if you're cross-compiling -# on another platform. Otherwise the binaries are just -# named gcc, etc. - -MING=i586-mingw32msvc- -#MING= -AR=$(MING)ar -CC=$(MING)gcc -AS=$(MING)as -RANLIB=$(MING)ranlib -WINDRES=$(MING)windres -CFLAGS=-Wall -Wno-missing-braces -I$(ROOT)/include -I$(ROOT) -I$(ROOT)/kern -c -D_X86_ -DIS_32 -DWINDOWS -DUNICODE -O2 -O=o -FS=fs-win32 -IP=win32 -OS=win32 -GUI=win32 -LDFLAGS=-mwindows -LDADD=-lkernel32 -ladvapi32 -lgdi32 -lmpr -lwsock32 -lmsvcrt -lmingw32 -TARG=drawterm.exe -XOFILES=9ball.$O - -# Windows via MSVC -#AR=??? -#CC=cl -#CFLAGS=-c -nologo -W3 -YX -Zi -MT -Zl -Iinclude -DWINDOWS -#O=obj -#FS=fs-win32 -#IP=win32 -#OS=win32 -#GUI=win32 - -all: default - -# for root -libmachdep.a: - (cd win32-386; make) - -9ball.$O: 9ball.rc 9ball.ico - $(WINDRES) -i 9ball.rc -o 9ball.o - diff --git a/sys/src/cmd/unix/drawterm/Makefile b/sys/src/cmd/unix/drawterm/Makefile deleted file mode 100644 index 28cb693e0..000000000 --- a/sys/src/cmd/unix/drawterm/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -ROOT=. - -include Make.config - -OFILES=\ - main.$O\ - cpu.$O\ - readcons.$O\ - secstore.$O\ - latin1.$O\ - $(OS)-factotum.$O\ - $(XOFILES)\ - -LIBS1=\ - kern/libkern.a\ - exportfs/libexportfs.a\ - libauth/libauth.a\ - libauthsrv/libauthsrv.a\ - libsec/libsec.a\ - libmp/libmp.a\ - libmemdraw/libmemdraw.a\ - libmemlayer/libmemlayer.a\ - libdraw/libdraw.a\ - gui-$(GUI)/libgui.a\ - libc/libc.a\ - -# stupid gcc -LIBS=$(LIBS1) $(LIBS1) $(LIBS1) libmachdep.a - -default: $(TARG) -$(TARG): $(OFILES) $(LIBS) - $(CC) $(LDFLAGS) -o $(TARG) $(OFILES) $(LIBS) $(LDADD) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - -clean: - rm -f *.o */*.o */*.a *.a drawterm drawterm.exe - -kern/libkern.a: - (cd kern; $(MAKE)) - -exportfs/libexportfs.a: - (cd exportfs; $(MAKE)) - -libauth/libauth.a: - (cd libauth; $(MAKE)) - -libauthsrv/libauthsrv.a: - (cd libauthsrv; $(MAKE)) - -libmp/libmp.a: - (cd libmp; $(MAKE)) - -libsec/libsec.a: - (cd libsec; $(MAKE)) - -libmemdraw/libmemdraw.a: - (cd libmemdraw; $(MAKE)) - -libmemlayer/libmemlayer.a: - (cd libmemlayer; $(MAKE)) - -libdraw/libdraw.a: - (cd libdraw; $(MAKE)) - -libc/libc.a: - (cd libc; $(MAKE)) - -gui-$(GUI)/libgui.a: - (cd gui-$(GUI); $(MAKE)) diff --git a/sys/src/cmd/unix/drawterm/README b/sys/src/cmd/unix/drawterm/README deleted file mode 100644 index 8f895910d..000000000 --- a/sys/src/cmd/unix/drawterm/README +++ /dev/null @@ -1,49 +0,0 @@ -INSTALLATION --------------- -To build on Unix, run CONF=unix make. - -To build on Solaris using Sun cc, run CONF=sun make. - -To build on Windows, you need Mingw. See http://www.mingw.org. -Edit Make.config to uncomment the Windows section -and comment out the rest. Then run CONF=windows make. - -(You can download nmake from -http://support.microsoft.com/default.aspx?scid=kb;en-us;Q132084 -Rename it to make.exe and put it in your path somewhere. -) - -I haven't tested the Windows build on Windows itself. -I cross-compile using mingw32 on Linux. - - -BINARIES ---------- -See http://swtch.com/drawterm/ - - -SOURCE ------- -Use Mercurial: hg clone http://code.swtch.com/drawterm -On the web at http://code.swtch.com/drawterm -Tar file at http://swtch.com/drawterm/ -In the Plan 9 distribution: /sys/src/cmd/unix/drawterm/ (sometimes out of date) - - -HELP ----- -Issue tracker: http://code.swtch.com/drawterm/issues - - -TO DO: ------- - -- Should import latest /dev/draw to allow resize of window - -- Should copy 9term code and make console window a real - 9term window instead. - -- Should implement /dev/label. - - - diff --git a/sys/src/cmd/unix/drawterm/args.h b/sys/src/cmd/unix/drawterm/args.h deleted file mode 100644 index d88de0a86..000000000 --- a/sys/src/cmd/unix/drawterm/args.h +++ /dev/null @@ -1,20 +0,0 @@ -extern char *argv0; -#define ARGBEGIN for((argv0? 0: (argv0=*argv)),argv++,argc--;\ - argv[0] && argv[0][0]=='-' && argv[0][1];\ - argc--, argv++) {\ - char *_args, *_argt;\ - Rune _argc;\ - _args = &argv[0][1];\ - if(_args[0]=='-' && _args[1]==0){\ - argc--; argv++; break;\ - }\ - _argc = 0;\ - while(*_args && (_args += chartorune(&_argc, _args)))\ - switch(_argc) -#define ARGEND SET(_argt);USED(_argt); USED(_argc); USED(_args);}USED(argv); USED(argc); -#define ARGF() (_argt=_args, _args="",\ - (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) -#define ARGC() _argc - -#define EARGF(x) (_argt=_args, _args="",\ - (*_argt? _argt: argv[1]? (argc--, *++argv): (x, (char*)0))) diff --git a/sys/src/cmd/unix/drawterm/cpu-bl.c b/sys/src/cmd/unix/drawterm/cpu-bl.c deleted file mode 100644 index 46ea42f82..000000000 --- a/sys/src/cmd/unix/drawterm/cpu-bl.c +++ /dev/null @@ -1,730 +0,0 @@ -/* - * cpu.c - Make a connection to a cpu server - * - * Invoked by listen as 'cpu -R | -N service net netdir' - * by users as 'cpu [-h system] [-c cmd args ...]' - */ - -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <fcall.h> -#include <authsrv.h> -#include <libsec.h> -#include "args.h" -#include "drawterm.h" - -#define Maxfdata 8192 -#define MaxStr 128 - -static void fatal(int, char*, ...); -static void usage(void); -static void writestr(int, char*, char*, int); -static int readstr(int, char*, int); -static char *rexcall(int*, char*, char*); -static char *keyspec = ""; -static AuthInfo *p9any(int); - -#define system csystem -static char *system; -static int cflag; -extern int dbg; -extern char* base; // fs base for devroot - -static char *srvname = "ncpu"; -static char *ealgs = "rc4_256 sha1"; - -/* message size for exportfs; may be larger so we can do big graphics in CPU window */ -static int msgsize = Maxfdata+IOHDRSZ; - -/* authentication mechanisms */ -static int netkeyauth(int); -static int netkeysrvauth(int, char*); -static int p9auth(int); -static int srvp9auth(int, char*); - -char *authserver; - -typedef struct AuthMethod AuthMethod; -struct AuthMethod { - char *name; /* name of method */ - int (*cf)(int); /* client side authentication */ - int (*sf)(int, char*); /* server side authentication */ -} authmethod[] = -{ - { "p9", p9auth, srvp9auth,}, - { "netkey", netkeyauth, netkeysrvauth,}, -// { "none", noauth, srvnoauth,}, - { nil, nil} -}; -AuthMethod *am = authmethod; /* default is p9 */ - -char *p9authproto = "p9any"; - -int setam(char*); - -void -exits(char *s) -{ - print("\ngoodbye\n"); - for(;;) osyield(); -} - -void -usage(void) -{ - fprint(2, "usage: drawterm [-a authserver] [-c cpuserver] [-s secstore] [-u user]\n"); - exits("usage"); -} -int fdd; - -int -mountfactotum(void) -{ - int fd; - - if((fd = dialfactotum()) < 0) - return -1; - if(sysmount(fd, -1, "/mnt/factotum", MREPL, "") < 0){ - fprint(2, "mount factotum: %r\n"); - return -1; - } - if((fd = open("/mnt/factotum/ctl", OREAD)) < 0){ - fprint(2, "open /mnt/factotum/ctl: %r\n"); - return -1; - } - close(fd); - return 0; -} - -void -cpumain(int argc, char **argv) -{ - char dat[MaxStr], buf[MaxStr], cmd[MaxStr], *err, *secstoreserver, *p, *s; - int fd, ms, data; - - /* see if we should use a larger message size */ - fd = open("/dev/draw", OREAD); - if(fd > 0){ - ms = iounit(fd); - if(msgsize < ms+IOHDRSZ) - msgsize = ms+IOHDRSZ; - close(fd); - } - - user = getenv("USER"); - secstoreserver = nil; - authserver = getenv("auth"); - if(authserver == nil) - authserver = "p9auth.cs.bell-labs.com"; - system = getenv("cpu"); - if(system == nil) - system = "plan9.bell-labs.com"; - ARGBEGIN{ - case 'a': - authserver = EARGF(usage()); - break; - case 'c': - system = EARGF(usage()); - break; - case 'd': - dbg++; - break; - case 'e': - ealgs = EARGF(usage()); - if(*ealgs == 0 || strcmp(ealgs, "clear") == 0) - ealgs = nil; - break; - case 'C': - cflag++; - cmd[0] = '!'; - cmd[1] = '\0'; - while((p = ARGF()) != nil) { - strcat(cmd, " "); - strcat(cmd, p); - } - break; - case 'k': - keyspec = EARGF(usage()); - break; - case 'r': - base = EARGF(usage()); - break; - case 's': - secstoreserver = EARGF(usage()); - break; - case 'u': - user = EARGF(usage()); - break; - default: - usage(); - }ARGEND; - - if(argc != 0) - usage(); - - if(user == nil) - user = readcons("user", nil, 0); - - if(mountfactotum() < 0){ - if(secstoreserver == nil) - secstoreserver = authserver; - if(havesecstore(secstoreserver, user)){ - s = secstorefetch(secstoreserver, user, nil); - if(s){ - if(strlen(s) >= sizeof secstorebuf) - sysfatal("secstore data too big"); - strcpy(secstorebuf, s); - } - } - } - - if((err = rexcall(&data, system, srvname))) - fatal(1, "%s: %s", err, system); - - /* Tell the remote side the command to execute and where our working directory is */ - if(cflag) - writestr(data, cmd, "command", 0); - if(getcwd(dat, sizeof(dat)) == 0) - writestr(data, "NO", "dir", 0); - else - writestr(data, dat, "dir", 0); - - /* - * Wait for the other end to execute and start our file service - * of /mnt/term - */ - if(readstr(data, buf, sizeof(buf)) < 0) - fatal(1, "waiting for FS: %r"); - if(strncmp("FS", buf, 2) != 0) { - print("remote cpu: %s", buf); - exits(buf); - } - - if(readstr(data, buf, sizeof buf) < 0) - fatal(1, "waiting for remote export: %r"); - if(strcmp(buf, "/") != 0){ - print("remote cpu: %s" , buf); - exits(buf); - } - write(data, "OK", 2); - - /* Begin serving the gnot namespace */ - exportfs(data, msgsize); - fatal(1, "starting exportfs"); -} - -void -fatal(int syserr, char *fmt, ...) -{ - Fmt f; - char *str; - va_list arg; - - fmtstrinit(&f); - fmtprint(&f, "cpu: "); - va_start(arg, fmt); - fmtvprint(&f, fmt, arg); - va_end(arg); - if(syserr) - fmtprint(&f, ": %r"); - fmtprint(&f, "\n"); - str = fmtstrflush(&f); - write(2, str, strlen(str)); - exits(str); -} - -char *negstr = "negotiating authentication method"; - -char bug[256]; - -char* -rexcall(int *fd, char *host, char *service) -{ - char *na; - char dir[MaxStr]; - char err[ERRMAX]; - char msg[MaxStr]; - int n; - - na = netmkaddr(host, "tcp", "17010"); - if((*fd = dial(na, 0, dir, 0)) < 0) - return "can't dial"; - - /* negotiate authentication mechanism */ - if(ealgs != nil) - snprint(msg, sizeof(msg), "%s %s", am->name, ealgs); - else - snprint(msg, sizeof(msg), "%s", am->name); - writestr(*fd, msg, negstr, 0); - n = readstr(*fd, err, sizeof err); - if(n < 0) - return negstr; - if(*err){ - werrstr(err); - return negstr; - } - - /* authenticate */ - *fd = (*am->cf)(*fd); - if(*fd < 0) - return "can't authenticate"; - return 0; -} - -void -writestr(int fd, char *str, char *thing, int ignore) -{ - int l, n; - - l = strlen(str); - n = write(fd, str, l+1); - if(!ignore && n < 0) - fatal(1, "writing network: %s", thing); -} - -int -readstr(int fd, char *str, int len) -{ - int n; - - while(len) { - n = read(fd, str, 1); - if(n < 0) - return -1; - if(*str == '\0') - return 0; - str++; - len--; - } - return -1; -} - -static int -readln(char *buf, int n) -{ - int i; - char *p; - - n--; /* room for \0 */ - p = buf; - for(i=0; i<n; i++){ - if(read(0, p, 1) != 1) - break; - if(*p == '\n' || *p == '\r') - break; - p++; - } - *p = '\0'; - return p-buf; -} - -/* - * user level challenge/response - */ -static int -netkeyauth(int fd) -{ - char chall[32]; - char resp[32]; - - strecpy(chall, chall+sizeof chall, getuser()); - print("user[%s]: ", chall); - if(readln(resp, sizeof(resp)) < 0) - return -1; - if(*resp != 0) - strcpy(chall, resp); - writestr(fd, chall, "challenge/response", 1); - - for(;;){ - if(readstr(fd, chall, sizeof chall) < 0) - break; - if(*chall == 0) - return fd; - print("challenge: %s\nresponse: ", chall); - if(readln(resp, sizeof(resp)) < 0) - break; - writestr(fd, resp, "challenge/response", 1); - } - return -1; -} - -static int -netkeysrvauth(int fd, char *user) -{ - return -1; -} - -static void -mksecret(char *t, uchar *f) -{ - sprint(t, "%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7], f[8], f[9]); -} - -/* - * plan9 authentication followed by rc4 encryption - */ -static int -p9auth(int fd) -{ - uchar key[16]; - uchar digest[SHA1dlen]; - char fromclientsecret[21]; - char fromserversecret[21]; - int i; - AuthInfo *ai; - - ai = p9any(fd); - if(ai == nil) - return -1; - memmove(key+4, ai->secret, ai->nsecret); - if(ealgs == nil) - return fd; - - /* exchange random numbers */ - for(i = 0; i < 4; i++) - key[i] = fastrand(); - if(write(fd, key, 4) != 4) - return -1; - if(readn(fd, key+12, 4) != 4) - return -1; - - /* scramble into two secrets */ - sha1(key, sizeof(key), digest, nil); - mksecret(fromclientsecret, digest); - mksecret(fromserversecret, digest+10); - - /* set up encryption */ - i = pushssl(fd, ealgs, fromclientsecret, fromserversecret, nil); - if(i < 0) - werrstr("can't establish ssl connection: %r"); - return i; -} - -int -authdial(char *net, char *dom) -{ - int fd; - fd = dial(netmkaddr(authserver, "tcp", "567"), 0, 0, 0); - //print("authdial %d\n", fd); - return fd; -} - -static int -getastickets(Ticketreq *tr, char *trbuf, char *tbuf) -{ - int asfd, rv; - char *dom; - - dom = tr->authdom; - asfd = authdial(nil, dom); - if(asfd < 0) - return -1; - rv = _asgetticket(asfd, trbuf, tbuf); - close(asfd); - return rv; -} - -static int -mkserverticket(Ticketreq *tr, char *authkey, char *tbuf) -{ - int i; - Ticket t; - - if(strcmp(tr->authid, tr->hostid) != 0) - return -1; - memset(&t, 0, sizeof(t)); - memmove(t.chal, tr->chal, CHALLEN); - strcpy(t.cuid, tr->uid); - strcpy(t.suid, tr->uid); - for(i=0; i<DESKEYLEN; i++) - t.key[i] = fastrand(); - t.num = AuthTc; - convT2M(&t, tbuf, authkey); - t.num = AuthTs; - convT2M(&t, tbuf+TICKETLEN, authkey); - return 0; -} - -static int -gettickets(Ticketreq *tr, char *key, char *trbuf, char *tbuf) -{ - if(getastickets(tr, trbuf, tbuf) >= 0) - return 0; - return mkserverticket(tr, key, tbuf); -} - -/* - * prompt user for a key. don't care about memory leaks, runs standalone - */ -static Attr* -promptforkey(char *params) -{ - char *v; - int fd; - Attr *a, *attr; - char *def; - - fd = open("/dev/cons", ORDWR); - if(fd < 0) - sysfatal("opening /dev/cons: %r"); - - attr = _parseattr(params); - fprint(fd, "\n!Adding key:"); - for(a=attr; a; a=a->next) - if(a->type != AttrQuery && a->name[0] != '!') - fprint(fd, " %q=%q", a->name, a->val); - fprint(fd, "\n"); - - for(a=attr; a; a=a->next){ - v = a->name; - if(a->type != AttrQuery || v[0]=='!') - continue; - def = nil; - if(strcmp(v, "user") == 0) - def = getuser(); - a->val = readcons(v, def, 0); - if(a->val == nil) - sysfatal("user terminated key input"); - a->type = AttrNameval; - } - for(a=attr; a; a=a->next){ - v = a->name; - if(a->type != AttrQuery || v[0]!='!') - continue; - def = nil; - if(strcmp(v+1, "user") == 0) - def = getuser(); - a->val = readcons(v+1, def, 1); - if(a->val == nil) - sysfatal("user terminated key input"); - a->type = AttrNameval; - } - fprint(fd, "!\n"); - close(fd); - return attr; -} - -/* - * send a key to the mounted factotum - */ -static int -sendkey(Attr *attr) -{ - int fd, rv; - char buf[1024]; - - fd = open("/mnt/factotum/ctl", ORDWR); - if(fd < 0) - sysfatal("opening /mnt/factotum/ctl: %r"); - rv = fprint(fd, "key %A\n", attr); - read(fd, buf, sizeof buf); - close(fd); - return rv; -} - -int -askuser(char *params) -{ - Attr *attr; - - fmtinstall('A', _attrfmt); - - attr = promptforkey(params); - if(attr == nil) - sysfatal("no key supplied"); - if(sendkey(attr) < 0) - sysfatal("sending key to factotum: %r"); - return 0; -} - -AuthInfo* -p9anyfactotum(int fd, int afd) -{ - return auth_proxy(fd, askuser, "proto=p9any role=client %s", keyspec); -} - -AuthInfo* -p9any(int fd) -{ - char buf[1024], buf2[1024], cchal[CHALLEN], *bbuf, *p, *dom, *u; - char *pass; - char tbuf[TICKETLEN+TICKETLEN+AUTHENTLEN], trbuf[TICKREQLEN]; - char authkey[DESKEYLEN]; - Authenticator auth; - int afd, i, n, v2; - Ticketreq tr; - Ticket t; - AuthInfo *ai; - - if((afd = open("/mnt/factotum/ctl", ORDWR)) >= 0) - return p9anyfactotum(fd, afd); - - if(readstr(fd, buf, sizeof buf) < 0) - fatal(1, "cannot read p9any negotiation"); - bbuf = buf; - v2 = 0; - if(strncmp(buf, "v.2 ", 4) == 0){ - v2 = 1; - bbuf += 4; - } - if((p = strchr(bbuf, ' '))) - *p = 0; - p = bbuf; - if((dom = strchr(p, '@')) == nil) - fatal(1, "bad p9any domain"); - *dom++ = 0; - if(strcmp(p, "p9sk1") != 0) - fatal(1, "server did not offer p9sk1"); - - sprint(buf2, "%s %s", p, dom); - if(write(fd, buf2, strlen(buf2)+1) != strlen(buf2)+1) - fatal(1, "cannot write user/domain choice in p9any"); - if(v2){ - if(readstr(fd, buf, sizeof buf) != 3) - fatal(1, "cannot read OK in p9any"); - if(memcmp(buf, "OK\0", 3) != 0) - fatal(1, "did not get OK in p9any"); - } - for(i=0; i<CHALLEN; i++) - cchal[i] = fastrand(); - if(write(fd, cchal, 8) != 8) - fatal(1, "cannot write p9sk1 challenge"); - - if(readn(fd, trbuf, TICKREQLEN) != TICKREQLEN) - fatal(1, "cannot read ticket request in p9sk1"); - - - convM2TR(trbuf, &tr); - u = user; - pass = findkey(&u, tr.authdom); - if(pass == nil) - again: - pass = getkey(u, tr.authdom); - if(pass == nil) - fatal(1, "no password"); - - passtokey(authkey, pass); - memset(pass, 0, strlen(pass)); - - tr.type = AuthTreq; - strecpy(tr.hostid, tr.hostid+sizeof tr.hostid, u); - strecpy(tr.uid, tr.uid+sizeof tr.uid, u); - convTR2M(&tr, trbuf); - - if(gettickets(&tr, authkey, trbuf, tbuf) < 0) - fatal(1, "cannot get auth tickets in p9sk1"); - - convM2T(tbuf, &t, authkey); - if(t.num != AuthTc){ - print("?password mismatch with auth server\n"); - goto again; - } - memmove(tbuf, tbuf+TICKETLEN, TICKETLEN); - - auth.num = AuthAc; - memmove(auth.chal, tr.chal, CHALLEN); - auth.id = 0; - convA2M(&auth, tbuf+TICKETLEN, t.key); - - if(write(fd, tbuf, TICKETLEN+AUTHENTLEN) != TICKETLEN+AUTHENTLEN) - fatal(1, "cannot send ticket and authenticator back in p9sk1"); - - if((n=readn(fd, tbuf, AUTHENTLEN)) != AUTHENTLEN || - memcmp(tbuf, "cpu:", 4) == 0){ - if(n <= 4) - fatal(1, "cannot read authenticator in p9sk1"); - - /* - * didn't send back authenticator: - * sent back fatal error message. - */ - memmove(buf, tbuf, n); - i = readn(fd, buf+n, sizeof buf-n-1); - if(i > 0) - n += i; - buf[n] = 0; - werrstr(""); - fatal(0, "server says: %s", buf); - } - - convM2A(tbuf, &auth, t.key); - if(auth.num != AuthAs - || memcmp(auth.chal, cchal, CHALLEN) != 0 - || auth.id != 0){ - print("?you and auth server agree about password.\n"); - print("?server is confused.\n"); - fatal(0, "server lies got %llux.%d want %llux.%d", *(vlong*)auth.chal, auth.id, *(vlong*)cchal, 0); - } - //print("i am %s there.\n", t.suid); - ai = mallocz(sizeof(AuthInfo), 1); - ai->secret = mallocz(8, 1); - des56to64((uchar*)t.key, ai->secret); - ai->nsecret = 8; - ai->suid = strdup(t.suid); - ai->cuid = strdup(t.cuid); - memset(authkey, 0, sizeof authkey); - return ai; -} - -/* -static int -noauth(int fd) -{ - ealgs = nil; - return fd; -} - -static int -srvnoauth(int fd, char *user) -{ - strecpy(user, user+MaxStr, getuser()); - ealgs = nil; - return fd; -} -*/ - -void -loghex(uchar *p, int n) -{ - char buf[100]; - int i; - - for(i = 0; i < n; i++) - sprint(buf+2*i, "%2.2ux", p[i]); -// syslog(0, "cpu", buf); -} - -static int -srvp9auth(int fd, char *user) -{ - return -1; -} - -/* - * set authentication mechanism - */ -int -setam(char *name) -{ - for(am = authmethod; am->name != nil; am++) - if(strcmp(am->name, name) == 0) - return 0; - am = authmethod; - return -1; -} - -/* - * set authentication mechanism and encryption/hash algs - * -int -setamalg(char *s) -{ - ealgs = strchr(s, ' '); - if(ealgs != nil) - *ealgs++ = 0; - return setam(s); -} - -*/ diff --git a/sys/src/cmd/unix/drawterm/cpu.c b/sys/src/cmd/unix/drawterm/cpu.c deleted file mode 100644 index 132631721..000000000 --- a/sys/src/cmd/unix/drawterm/cpu.c +++ /dev/null @@ -1,730 +0,0 @@ -/* - * cpu.c - Make a connection to a cpu server - * - * Invoked by listen as 'cpu -R | -N service net netdir' - * by users as 'cpu [-h system] [-c cmd args ...]' - */ - -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <fcall.h> -#include <authsrv.h> -#include <libsec.h> -#include "args.h" -#include "drawterm.h" - -#define Maxfdata 8192 -#define MaxStr 128 - -static void fatal(int, char*, ...); -static void usage(void); -static void writestr(int, char*, char*, int); -static int readstr(int, char*, int); -static char *rexcall(int*, char*, char*); -static char *keyspec = ""; -static AuthInfo *p9any(int); - -#define system csystem -static char *system; -static int cflag; -extern int dbg; -extern char* base; // fs base for devroot - -static char *srvname = "ncpu"; -static char *ealgs = "rc4_256 sha1"; - -/* message size for exportfs; may be larger so we can do big graphics in CPU window */ -static int msgsize = Maxfdata+IOHDRSZ; - -/* authentication mechanisms */ -static int netkeyauth(int); -static int netkeysrvauth(int, char*); -static int p9auth(int); -static int srvp9auth(int, char*); - -char *authserver; - -typedef struct AuthMethod AuthMethod; -struct AuthMethod { - char *name; /* name of method */ - int (*cf)(int); /* client side authentication */ - int (*sf)(int, char*); /* server side authentication */ -} authmethod[] = -{ - { "p9", p9auth, srvp9auth,}, - { "netkey", netkeyauth, netkeysrvauth,}, -// { "none", noauth, srvnoauth,}, - { 0 } -}; -AuthMethod *am = authmethod; /* default is p9 */ - -char *p9authproto = "p9any"; - -int setam(char*); - -void -exits(char *s) -{ - print("\ngoodbye\n"); - for(;;) osyield(); -} - -void -usage(void) -{ - fprint(2, "usage: drawterm [-a authserver] [-c cpuserver] [-s secstore] [-u user]\n"); - exits("usage"); -} -int fdd; - -int -mountfactotum(void) -{ - int fd; - - if((fd = dialfactotum()) < 0) - return -1; - if(sysmount(fd, -1, "/mnt/factotum", MREPL, "") < 0){ - fprint(2, "mount factotum: %r\n"); - return -1; - } - if((fd = open("/mnt/factotum/ctl", OREAD)) < 0){ - fprint(2, "open /mnt/factotum/ctl: %r\n"); - return -1; - } - close(fd); - return 0; -} - -void -cpumain(int argc, char **argv) -{ - char dat[MaxStr], buf[MaxStr], cmd[MaxStr], *err, *secstoreserver, *p, *s; - int fd, ms, data; - - /* see if we should use a larger message size */ - fd = open("/dev/draw", OREAD); - if(fd > 0){ - ms = iounit(fd); - if(msgsize < ms+IOHDRSZ) - msgsize = ms+IOHDRSZ; - close(fd); - } - - user = getenv("USER"); - secstoreserver = nil; - authserver = getenv("auth"); - if(authserver == nil) - authserver = "auth"; - system = getenv("cpu"); - if(system == nil) - system = "cpu"; - ARGBEGIN{ - case 'a': - authserver = EARGF(usage()); - break; - case 'c': - system = EARGF(usage()); - break; - case 'd': - dbg++; - break; - case 'e': - ealgs = EARGF(usage()); - if(*ealgs == 0 || strcmp(ealgs, "clear") == 0) - ealgs = nil; - break; - case 'C': - cflag++; - cmd[0] = '!'; - cmd[1] = '\0'; - while((p = ARGF()) != nil) { - strcat(cmd, " "); - strcat(cmd, p); - } - break; - case 'k': - keyspec = EARGF(usage()); - break; - case 'r': - base = EARGF(usage()); - break; - case 's': - secstoreserver = EARGF(usage()); - break; - case 'u': - user = EARGF(usage()); - break; - default: - usage(); - }ARGEND; - - if(argc != 0) - usage(); - - if(user == nil) - user = readcons("user", nil, 0); - - if(mountfactotum() < 0){ - if(secstoreserver == nil) - secstoreserver = authserver; - if(havesecstore(secstoreserver, user)){ - s = secstorefetch(secstoreserver, user, nil); - if(s){ - if(strlen(s) >= sizeof secstorebuf) - sysfatal("secstore data too big"); - strcpy(secstorebuf, s); - } - } - } - - if((err = rexcall(&data, system, srvname))) - fatal(1, "%s: %s", err, system); - - /* Tell the remote side the command to execute and where our working directory is */ - if(cflag) - writestr(data, cmd, "command", 0); - if(getcwd(dat, sizeof(dat)) == 0) - writestr(data, "NO", "dir", 0); - else - writestr(data, dat, "dir", 0); - - /* - * Wait for the other end to execute and start our file service - * of /mnt/term - */ - if(readstr(data, buf, sizeof(buf)) < 0) - fatal(1, "waiting for FS: %r"); - if(strncmp("FS", buf, 2) != 0) { - print("remote cpu: %s", buf); - exits(buf); - } - - if(readstr(data, buf, sizeof buf) < 0) - fatal(1, "waiting for remote export: %r"); - if(strcmp(buf, "/") != 0){ - print("remote cpu: %s" , buf); - exits(buf); - } - write(data, "OK", 2); - - /* Begin serving the gnot namespace */ - exportfs(data, msgsize); - fatal(1, "starting exportfs"); -} - -void -fatal(int syserr, char *fmt, ...) -{ - Fmt f; - char *str; - va_list arg; - - fmtstrinit(&f); - fmtprint(&f, "cpu: "); - va_start(arg, fmt); - fmtvprint(&f, fmt, arg); - va_end(arg); - if(syserr) - fmtprint(&f, ": %r"); - fmtprint(&f, "\n"); - str = fmtstrflush(&f); - write(2, str, strlen(str)); - exits(str); -} - -char *negstr = "negotiating authentication method"; - -char bug[256]; - -char* -rexcall(int *fd, char *host, char *service) -{ - char *na; - char dir[MaxStr]; - char err[ERRMAX]; - char msg[MaxStr]; - int n; - - na = netmkaddr(host, "tcp", "17010"); - if((*fd = dial(na, 0, dir, 0)) < 0) - return "can't dial"; - - /* negotiate authentication mechanism */ - if(ealgs != nil) - snprint(msg, sizeof(msg), "%s %s", am->name, ealgs); - else - snprint(msg, sizeof(msg), "%s", am->name); - writestr(*fd, msg, negstr, 0); - n = readstr(*fd, err, sizeof err); - if(n < 0) - return negstr; - if(*err){ - werrstr(err); - return negstr; - } - - /* authenticate */ - *fd = (*am->cf)(*fd); - if(*fd < 0) - return "can't authenticate"; - return 0; -} - -void -writestr(int fd, char *str, char *thing, int ignore) -{ - int l, n; - - l = strlen(str); - n = write(fd, str, l+1); - if(!ignore && n < 0) - fatal(1, "writing network: %s", thing); -} - -int -readstr(int fd, char *str, int len) -{ - int n; - - while(len) { - n = read(fd, str, 1); - if(n < 0) - return -1; - if(*str == '\0') - return 0; - str++; - len--; - } - return -1; -} - -static int -readln(char *buf, int n) -{ - int i; - char *p; - - n--; /* room for \0 */ - p = buf; - for(i=0; i<n; i++){ - if(read(0, p, 1) != 1) - break; - if(*p == '\n' || *p == '\r') - break; - p++; - } - *p = '\0'; - return p-buf; -} - -/* - * user level challenge/response - */ -static int -netkeyauth(int fd) -{ - char chall[32]; - char resp[32]; - - strecpy(chall, chall+sizeof chall, getuser()); - print("user[%s]: ", chall); - if(readln(resp, sizeof(resp)) < 0) - return -1; - if(*resp != 0) - strcpy(chall, resp); - writestr(fd, chall, "challenge/response", 1); - - for(;;){ - if(readstr(fd, chall, sizeof chall) < 0) - break; - if(*chall == 0) - return fd; - print("challenge: %s\nresponse: ", chall); - if(readln(resp, sizeof(resp)) < 0) - break; - writestr(fd, resp, "challenge/response", 1); - } - return -1; -} - -static int -netkeysrvauth(int fd, char *user) -{ - return -1; -} - -static void -mksecret(char *t, uchar *f) -{ - sprint(t, "%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7], f[8], f[9]); -} - -/* - * plan9 authentication followed by rc4 encryption - */ -static int -p9auth(int fd) -{ - uchar key[16]; - uchar digest[SHA1dlen]; - char fromclientsecret[21]; - char fromserversecret[21]; - int i; - AuthInfo *ai; - - ai = p9any(fd); - if(ai == nil) - return -1; - memmove(key+4, ai->secret, ai->nsecret); - if(ealgs == nil) - return fd; - - /* exchange random numbers */ - for(i = 0; i < 4; i++) - key[i] = fastrand(); - if(write(fd, key, 4) != 4) - return -1; - if(readn(fd, key+12, 4) != 4) - return -1; - - /* scramble into two secrets */ - sha1(key, sizeof(key), digest, nil); - mksecret(fromclientsecret, digest); - mksecret(fromserversecret, digest+10); - - /* set up encryption */ - i = pushssl(fd, ealgs, fromclientsecret, fromserversecret, nil); - if(i < 0) - werrstr("can't establish ssl connection: %r"); - return i; -} - -int -authdial(char *net, char *dom) -{ - int fd; - fd = dial(netmkaddr(authserver, "tcp", "567"), 0, 0, 0); - //print("authdial %d\n", fd); - return fd; -} - -static int -getastickets(Ticketreq *tr, char *trbuf, char *tbuf) -{ - int asfd, rv; - char *dom; - - dom = tr->authdom; - asfd = authdial(nil, dom); - if(asfd < 0) - return -1; - rv = _asgetticket(asfd, trbuf, tbuf); - close(asfd); - return rv; -} - -static int -mkserverticket(Ticketreq *tr, char *authkey, char *tbuf) -{ - int i; - Ticket t; - - if(strcmp(tr->authid, tr->hostid) != 0) - return -1; - memset(&t, 0, sizeof(t)); - memmove(t.chal, tr->chal, CHALLEN); - strcpy(t.cuid, tr->uid); - strcpy(t.suid, tr->uid); - for(i=0; i<DESKEYLEN; i++) - t.key[i] = fastrand(); - t.num = AuthTc; - convT2M(&t, tbuf, authkey); - t.num = AuthTs; - convT2M(&t, tbuf+TICKETLEN, authkey); - return 0; -} - -static int -gettickets(Ticketreq *tr, char *key, char *trbuf, char *tbuf) -{ - if(getastickets(tr, trbuf, tbuf) >= 0) - return 0; - return mkserverticket(tr, key, tbuf); -} - -/* - * prompt user for a key. don't care about memory leaks, runs standalone - */ -static Attr* -promptforkey(char *params) -{ - char *v; - int fd; - Attr *a, *attr; - char *def; - - fd = open("/dev/cons", ORDWR); - if(fd < 0) - sysfatal("opening /dev/cons: %r"); - - attr = _parseattr(params); - fprint(fd, "\n!Adding key:"); - for(a=attr; a; a=a->next) - if(a->type != AttrQuery && a->name[0] != '!') - fprint(fd, " %q=%q", a->name, a->val); - fprint(fd, "\n"); - - for(a=attr; a; a=a->next){ - v = a->name; - if(a->type != AttrQuery || v[0]=='!') - continue; - def = nil; - if(strcmp(v, "user") == 0) - def = getuser(); - a->val = readcons(v, def, 0); - if(a->val == nil) - sysfatal("user terminated key input"); - a->type = AttrNameval; - } - for(a=attr; a; a=a->next){ - v = a->name; - if(a->type != AttrQuery || v[0]!='!') - continue; - def = nil; - if(strcmp(v+1, "user") == 0) - def = getuser(); - a->val = readcons(v+1, def, 1); - if(a->val == nil) - sysfatal("user terminated key input"); - a->type = AttrNameval; - } - fprint(fd, "!\n"); - close(fd); - return attr; -} - -/* - * send a key to the mounted factotum - */ -static int -sendkey(Attr *attr) -{ - int fd, rv; - char buf[1024]; - - fd = open("/mnt/factotum/ctl", ORDWR); - if(fd < 0) - sysfatal("opening /mnt/factotum/ctl: %r"); - rv = fprint(fd, "key %A\n", attr); - read(fd, buf, sizeof buf); - close(fd); - return rv; -} - -int -askuser(char *params) -{ - Attr *attr; - - fmtinstall('A', _attrfmt); - - attr = promptforkey(params); - if(attr == nil) - sysfatal("no key supplied"); - if(sendkey(attr) < 0) - sysfatal("sending key to factotum: %r"); - return 0; -} - -AuthInfo* -p9anyfactotum(int fd, int afd) -{ - return auth_proxy(fd, askuser, "proto=p9any role=client %s", keyspec); -} - -AuthInfo* -p9any(int fd) -{ - char buf[1024], buf2[1024], cchal[CHALLEN], *bbuf, *p, *dom, *u; - char *pass; - char tbuf[TICKETLEN+TICKETLEN+AUTHENTLEN], trbuf[TICKREQLEN]; - char authkey[DESKEYLEN]; - Authenticator auth; - int afd, i, n, v2; - Ticketreq tr; - Ticket t; - AuthInfo *ai; - - if((afd = open("/mnt/factotum/ctl", ORDWR)) >= 0) - return p9anyfactotum(fd, afd); - - if(readstr(fd, buf, sizeof buf) < 0) - fatal(1, "cannot read p9any negotiation"); - bbuf = buf; - v2 = 0; - if(strncmp(buf, "v.2 ", 4) == 0){ - v2 = 1; - bbuf += 4; - } - if((p = strchr(bbuf, ' '))) - *p = 0; - p = bbuf; - if((dom = strchr(p, '@')) == nil) - fatal(1, "bad p9any domain"); - *dom++ = 0; - if(strcmp(p, "p9sk1") != 0) - fatal(1, "server did not offer p9sk1"); - - sprint(buf2, "%s %s", p, dom); - if(write(fd, buf2, strlen(buf2)+1) != strlen(buf2)+1) - fatal(1, "cannot write user/domain choice in p9any"); - if(v2){ - if(readstr(fd, buf, sizeof buf) != 3) - fatal(1, "cannot read OK in p9any"); - if(memcmp(buf, "OK\0", 3) != 0) - fatal(1, "did not get OK in p9any"); - } - for(i=0; i<CHALLEN; i++) - cchal[i] = fastrand(); - if(write(fd, cchal, 8) != 8) - fatal(1, "cannot write p9sk1 challenge"); - - if(readn(fd, trbuf, TICKREQLEN) != TICKREQLEN) - fatal(1, "cannot read ticket request in p9sk1"); - - - convM2TR(trbuf, &tr); - u = user; - pass = findkey(&u, tr.authdom); - if(pass == nil) - again: - pass = getkey(u, tr.authdom); - if(pass == nil) - fatal(1, "no password"); - - passtokey(authkey, pass); - memset(pass, 0, strlen(pass)); - - tr.type = AuthTreq; - strecpy(tr.hostid, tr.hostid+sizeof tr.hostid, u); - strecpy(tr.uid, tr.uid+sizeof tr.uid, u); - convTR2M(&tr, trbuf); - - if(gettickets(&tr, authkey, trbuf, tbuf) < 0) - fatal(1, "cannot get auth tickets in p9sk1"); - - convM2T(tbuf, &t, authkey); - if(t.num != AuthTc){ - print("?password mismatch with auth server\n"); - goto again; - } - memmove(tbuf, tbuf+TICKETLEN, TICKETLEN); - - auth.num = AuthAc; - memmove(auth.chal, tr.chal, CHALLEN); - auth.id = 0; - convA2M(&auth, tbuf+TICKETLEN, t.key); - - if(write(fd, tbuf, TICKETLEN+AUTHENTLEN) != TICKETLEN+AUTHENTLEN) - fatal(1, "cannot send ticket and authenticator back in p9sk1"); - - if((n=readn(fd, tbuf, AUTHENTLEN)) != AUTHENTLEN || - memcmp(tbuf, "cpu:", 4) == 0){ - if(n <= 4) - fatal(1, "cannot read authenticator in p9sk1"); - - /* - * didn't send back authenticator: - * sent back fatal error message. - */ - memmove(buf, tbuf, n); - i = readn(fd, buf+n, sizeof buf-n-1); - if(i > 0) - n += i; - buf[n] = 0; - werrstr(""); - fatal(0, "server says: %s", buf); - } - - convM2A(tbuf, &auth, t.key); - if(auth.num != AuthAs - || memcmp(auth.chal, cchal, CHALLEN) != 0 - || auth.id != 0){ - print("?you and auth server agree about password.\n"); - print("?server is confused.\n"); - fatal(0, "server lies got %llux.%d want %llux.%d", *(vlong*)auth.chal, auth.id, *(vlong*)cchal, 0); - } - //print("i am %s there.\n", t.suid); - ai = mallocz(sizeof(AuthInfo), 1); - ai->secret = mallocz(8, 1); - des56to64((uchar*)t.key, ai->secret); - ai->nsecret = 8; - ai->suid = strdup(t.suid); - ai->cuid = strdup(t.cuid); - memset(authkey, 0, sizeof authkey); - return ai; -} - -/* -static int -noauth(int fd) -{ - ealgs = nil; - return fd; -} - -static int -srvnoauth(int fd, char *user) -{ - strecpy(user, user+MaxStr, getuser()); - ealgs = nil; - return fd; -} -*/ - -void -loghex(uchar *p, int n) -{ - char buf[100]; - int i; - - for(i = 0; i < n; i++) - sprint(buf+2*i, "%2.2ux", p[i]); -// syslog(0, "cpu", buf); -} - -static int -srvp9auth(int fd, char *user) -{ - return -1; -} - -/* - * set authentication mechanism - */ -int -setam(char *name) -{ - for(am = authmethod; am->name != nil; am++) - if(strcmp(am->name, name) == 0) - return 0; - am = authmethod; - return -1; -} - -/* - * set authentication mechanism and encryption/hash algs - * -int -setamalg(char *s) -{ - ealgs = strchr(s, ' '); - if(ealgs != nil) - *ealgs++ = 0; - return setam(s); -} - -*/ diff --git a/sys/src/cmd/unix/drawterm/drawterm.h b/sys/src/cmd/unix/drawterm/drawterm.h deleted file mode 100644 index be88f7378..000000000 --- a/sys/src/cmd/unix/drawterm/drawterm.h +++ /dev/null @@ -1,13 +0,0 @@ -extern int havesecstore(char *addr, char *owner); -extern char *secstore; -extern char secstorebuf[65536]; -extern char *secstorefetch(char *addr, char *owner, char *passwd); -extern char *authserver; -extern char *readcons(char *prompt, char *def, int secret); -extern int exportfs(int, int); -extern char *user; -extern char *getkey(char*, char*); -extern char *findkey(char**, char*); -extern int dialfactotum(void); -extern char *getuser(void); -extern void cpumain(int, char**); diff --git a/sys/src/cmd/unix/drawterm/drawterm.ico b/sys/src/cmd/unix/drawterm/drawterm.ico Binary files differdeleted file mode 100644 index 376dc442c..000000000 --- a/sys/src/cmd/unix/drawterm/drawterm.ico +++ /dev/null diff --git a/sys/src/cmd/unix/drawterm/drawterm.rc b/sys/src/cmd/unix/drawterm/drawterm.rc deleted file mode 100755 index 451cfeb84..000000000 --- a/sys/src/cmd/unix/drawterm/drawterm.rc +++ /dev/null @@ -1,72 +0,0 @@ -//Microsoft Developer Studio generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDI_ICON1 ICON DISCARDABLE "drawterm.ico"
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE DISCARDABLE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE DISCARDABLE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE DISCARDABLE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/sys/src/cmd/unix/drawterm/drawterm.res b/sys/src/cmd/unix/drawterm/drawterm.res Binary files differdeleted file mode 100644 index b92ed731d..000000000 --- a/sys/src/cmd/unix/drawterm/drawterm.res +++ /dev/null diff --git a/sys/src/cmd/unix/drawterm/exportfs/Makefile b/sys/src/cmd/unix/drawterm/exportfs/Makefile deleted file mode 100644 index e66d8778d..000000000 --- a/sys/src/cmd/unix/drawterm/exportfs/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libexportfs.a - -OFILES=\ - exportfs.$O\ - exportsrv.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/exportfs/exportfs.c b/sys/src/cmd/unix/drawterm/exportfs/exportfs.c deleted file mode 100644 index 568cdbea1..000000000 --- a/sys/src/cmd/unix/drawterm/exportfs/exportfs.c +++ /dev/null @@ -1,511 +0,0 @@ -/* - * exportfs - Export a plan 9 name space across a network - */ -#include <u.h> -#include <libc.h> -#include <fcall.h> -#include <libsec.h> -#include "drawterm.h" -#define Extern -#include "exportfs.h" - -/* #define QIDPATH ((1LL<<48)-1) */ -#define QIDPATH ((((vlong)1)<<48)-1) -vlong newqid = 0; - -void (*fcalls[256])(Fsrpc*); - -/* accounting and debugging counters */ -int filecnt; -int freecnt; -int qidcnt; -int qfreecnt; -int ncollision; -int netfd; - -int -exportfs(int fd, int msgsz) -{ - char buf[ERRMAX], ebuf[ERRMAX]; - Fsrpc *r; - int i, n; - - fcalls[Tversion] = Xversion; - fcalls[Tauth] = Xauth; - fcalls[Tflush] = Xflush; - fcalls[Tattach] = Xattach; - fcalls[Twalk] = Xwalk; - fcalls[Topen] = slave; - fcalls[Tcreate] = Xcreate; - fcalls[Tclunk] = Xclunk; - fcalls[Tread] = slave; - fcalls[Twrite] = slave; - fcalls[Tremove] = Xremove; - fcalls[Tstat] = Xstat; - fcalls[Twstat] = Xwstat; - - srvfd = -1; - netfd = fd; - //dbg = 1; - - strcpy(buf, "this is buf"); - strcpy(ebuf, "this is ebuf"); - DEBUG(DFD, "exportfs: started\n"); - -// rfork(RFNOTEG); - - messagesize = msgsz; - if(messagesize == 0){ - messagesize = iounit(netfd); - if(messagesize == 0) - messagesize = 8192+IOHDRSZ; - } - - Workq = emallocz(sizeof(Fsrpc)*Nr_workbufs); -// for(i=0; i<Nr_workbufs; i++) -// Workq[i].buf = emallocz(messagesize); - fhash = emallocz(sizeof(Fid*)*FHASHSIZE); - - fmtinstall('F', fcallfmt); - - initroot(); - - DEBUG(DFD, "exportfs: %s\n", buf); - - /* - * Start serving file requests from the network - */ - for(;;) { - r = getsbuf(); - if(r == 0) - fatal("Out of service buffers"); - - DEBUG(DFD, "read9p..."); - n = read9pmsg(netfd, r->buf, messagesize); - if(n <= 0) - fatal("eof: n=%d %r", n); - - if(convM2S(r->buf, n, &r->work) == 0){ - iprint("convM2S %d byte message\n", n); - for(i=0; i<n; i++){ - iprint(" %.2ux", r->buf[i]); - if(i%16 == 15) - iprint("\n"); - } - if(i%16) - iprint("\n"); - fatal("convM2S format error"); - } - -if(0) iprint("<- %F\n", &r->work); - DEBUG(DFD, "%F\n", &r->work); - (fcalls[r->work.type])(r); - } -} - -void -reply(Fcall *r, Fcall *t, char *err) -{ - uchar *data; - int m, n; - - t->tag = r->tag; - t->fid = r->fid; - if(err) { - t->type = Rerror; - t->ename = err; - } - else - t->type = r->type + 1; - -if(0) iprint("-> %F\n", t); - DEBUG(DFD, "\t%F\n", t); - - data = malloc(messagesize); /* not mallocz; no need to clear */ - if(data == nil) - fatal(Enomem); - n = convS2M(t, data, messagesize); - if((m=write(netfd, data, n))!=n){ - iprint("wrote %d got %d (%r)\n", n, m); - fatal("write"); - } - free(data); -} - -Fid * -getfid(int nr) -{ - Fid *f; - - for(f = fidhash(nr); f; f = f->next) - if(f->nr == nr) - return f; - - return 0; -} - -int -freefid(int nr) -{ - Fid *f, **l; - char buf[128]; - - l = &fidhash(nr); - for(f = *l; f; f = f->next) { - if(f->nr == nr) { - if(f->mid) { - sprint(buf, "/mnt/exportfs/%d", f->mid); - unmount(0, buf); - psmap[f->mid] = 0; - } - if(f->f) { - freefile(f->f); - f->f = nil; - } - *l = f->next; - f->next = fidfree; - fidfree = f; - return 1; - } - l = &f->next; - } - - return 0; -} - -Fid * -newfid(int nr) -{ - Fid *new, **l; - int i; - - l = &fidhash(nr); - for(new = *l; new; new = new->next) - if(new->nr == nr) - return 0; - - if(fidfree == 0) { - fidfree = emallocz(sizeof(Fid) * Fidchunk); - - for(i = 0; i < Fidchunk-1; i++) - fidfree[i].next = &fidfree[i+1]; - - fidfree[Fidchunk-1].next = 0; - } - - new = fidfree; - fidfree = new->next; - - memset(new, 0, sizeof(Fid)); - new->next = *l; - *l = new; - new->nr = nr; - new->fid = -1; - new->mid = 0; - - return new; -} - -Fsrpc * -getsbuf(void) -{ - static int ap; - int look, rounds; - Fsrpc *wb; - int small_instead_of_fast = 1; - - if(small_instead_of_fast) - ap = 0; /* so we always start looking at the beginning and reuse buffers */ - - for(rounds = 0; rounds < 10; rounds++) { - for(look = 0; look < Nr_workbufs; look++) { - if(++ap == Nr_workbufs) - ap = 0; - if(Workq[ap].busy == 0) - break; - } - - if(look == Nr_workbufs){ - sleep(10 * rounds); - continue; - } - - wb = &Workq[ap]; - wb->pid = 0; - wb->canint = 0; - wb->flushtag = NOTAG; - wb->busy = 1; - if(wb->buf == nil) /* allocate buffers dynamically to keep size down */ - wb->buf = emallocz(messagesize); - return wb; - } - fatal("No more work buffers"); - return nil; -} - -void -freefile(File *f) -{ - File *parent, *child; - -Loop: - f->ref--; - if(f->ref > 0) - return; - freecnt++; - if(f->ref < 0) abort(); - DEBUG(DFD, "free %s\n", f->name); - /* delete from parent */ - parent = f->parent; - if(parent->child == f) - parent->child = f->childlist; - else{ - for(child=parent->child; child->childlist!=f; child=child->childlist) - if(child->childlist == nil) - fatal("bad child list"); - child->childlist = f->childlist; - } - freeqid(f->qidt); - free(f->name); - f->name = nil; - free(f); - f = parent; - if(f != nil) - goto Loop; -} - -File * -file(File *parent, char *name) -{ - Dir *dir; - char *path; - File *f; - - DEBUG(DFD, "\tfile: 0x%p %s name %s\n", parent, parent->name, name); - - path = makepath(parent, name); - dir = dirstat(path); - free(path); - if(dir == nil) - return nil; - - for(f = parent->child; f; f = f->childlist) - if(strcmp(name, f->name) == 0) - break; - - if(f == nil){ - f = emallocz(sizeof(File)); - f->name = estrdup(name); - - f->parent = parent; - f->childlist = parent->child; - parent->child = f; - parent->ref++; - f->ref = 0; - filecnt++; - } - f->ref++; - f->qid.type = dir->qid.type; - f->qid.vers = dir->qid.vers; - f->qidt = uniqueqid(dir); - f->qid.path = f->qidt->uniqpath; - - f->inval = 0; - - free(dir); - - return f; -} - -void -initroot(void) -{ - Dir *dir; - - root = emallocz(sizeof(File)); - root->name = estrdup("."); - - dir = dirstat(root->name); - if(dir == nil) - fatal("root stat"); - - root->ref = 1; - root->qid.vers = dir->qid.vers; - root->qidt = uniqueqid(dir); - root->qid.path = root->qidt->uniqpath; - root->qid.type = QTDIR; - free(dir); - - psmpt = emallocz(sizeof(File)); - psmpt->name = estrdup("/"); - - dir = dirstat(psmpt->name); - if(dir == nil) - return; - - psmpt->ref = 1; - psmpt->qid.vers = dir->qid.vers; - psmpt->qidt = uniqueqid(dir); - psmpt->qid.path = psmpt->qidt->uniqpath; - free(dir); - - psmpt = file(psmpt, "mnt"); - if(psmpt == 0) - return; - psmpt = file(psmpt, "exportfs"); -} - -char* -makepath(File *p, char *name) -{ - int i, n; - char *c, *s, *path, *seg[256]; - - seg[0] = name; - n = strlen(name)+2; - for(i = 1; i < 256 && p; i++, p = p->parent){ - seg[i] = p->name; - n += strlen(p->name)+1; - } - path = malloc(n); - if(path == nil) - fatal("out of memory"); - s = path; - - while(i--) { - for(c = seg[i]; *c; c++) - *s++ = *c; - *s++ = '/'; - } - while(s[-1] == '/') - s--; - *s = '\0'; - - return path; -} - -int -qidhash(vlong path) -{ - int h, n; - - h = 0; - for(n=0; n<64; n+=Nqidbits){ - h ^= path; - path >>= Nqidbits; - } - return h & (Nqidtab-1); -} - -void -freeqid(Qidtab *q) -{ - ulong h; - Qidtab *l; - - q->ref--; - if(q->ref > 0) - return; - qfreecnt++; - h = qidhash(q->path); - if(qidtab[h] == q) - qidtab[h] = q->next; - else{ - for(l=qidtab[h]; l->next!=q; l=l->next) - if(l->next == nil) - fatal("bad qid list"); - l->next = q->next; - } - free(q); -} - -Qidtab* -qidlookup(Dir *d) -{ - ulong h; - Qidtab *q; - - h = qidhash(d->qid.path); - for(q=qidtab[h]; q!=nil; q=q->next) - if(q->type==d->type && q->dev==d->dev && q->path==d->qid.path) - return q; - return nil; -} - -int -qidexists(vlong path) -{ - int h; - Qidtab *q; - - for(h=0; h<Nqidtab; h++) - for(q=qidtab[h]; q!=nil; q=q->next) - if(q->uniqpath == path) - return 1; - return 0; -} - -Qidtab* -uniqueqid(Dir *d) -{ - ulong h; - vlong path; - Qidtab *q; - - q = qidlookup(d); - if(q != nil){ - q->ref++; - return q; - } - path = d->qid.path; - while(qidexists(path)){ - DEBUG(DFD, "collision on %s\n", d->name); - /* collision: find a new one */ - ncollision++; - path &= QIDPATH; - ++newqid; - if(newqid >= (1<<16)){ - DEBUG(DFD, "collision wraparound\n"); - newqid = 1; - } - path |= newqid<<48; - DEBUG(DFD, "assign qid %.16llux\n", path); - } - q = mallocz(sizeof(Qidtab), 1); - if(q == nil) - fatal("no memory for qid table"); - qidcnt++; - q->ref = 1; - q->type = d->type; - q->dev = d->dev; - q->path = d->qid.path; - q->uniqpath = path; - h = qidhash(d->qid.path); - q->next = qidtab[h]; - qidtab[h] = q; - return q; -} - -void -fatal(char *s, ...) -{ - char buf[ERRMAX]; - va_list arg; - - if (s) { - va_start(arg, s); - vsnprint(buf, ERRMAX, s, arg); - va_end(arg); - } - - /* Clear away the slave children */ -// for(m = Proclist; m; m = m->next) -// postnote(PNPROC, m->pid, "kill"); - - DEBUG(DFD, "%s\n", buf); - if (s) - sysfatal(buf); - else - sysfatal(""); -} - diff --git a/sys/src/cmd/unix/drawterm/exportfs/exportfs.h b/sys/src/cmd/unix/drawterm/exportfs/exportfs.h deleted file mode 100644 index 3231573a9..000000000 --- a/sys/src/cmd/unix/drawterm/exportfs/exportfs.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * exportfs.h - definitions for exporting file server - */ - -#define DEBUG if(!dbg){}else fprint -#define DFD 2 -#define fidhash(s) fhash[s%FHASHSIZE] - -#define Proc Exproc - - -typedef struct Fsrpc Fsrpc; -typedef struct Fid Fid; -typedef struct File File; -typedef struct Proc Proc; -typedef struct Qidtab Qidtab; - -struct Fsrpc -{ - int busy; /* Work buffer has pending rpc to service */ - int pid; /* Pid of slave process executing the rpc */ - int canint; /* Interrupt gate */ - int flushtag; /* Tag on which to reply to flush */ - Fcall work; /* Plan 9 incoming Fcall */ - uchar *buf; /* Data buffer */ -}; - -struct Fid -{ - int fid; /* system fd for i/o */ - File *f; /* File attached to this fid */ - int mode; - int nr; /* fid number */ - int mid; /* Mount id */ - Fid *next; /* hash link */ -}; - -struct File -{ - char *name; - int ref; - Qid qid; - Qidtab *qidt; - int inval; - File *parent; - File *child; - File *childlist; -}; - -struct Proc -{ - int pid; - int busy; - Proc *next; -}; - -struct Qidtab -{ - int ref; - int type; - int dev; - vlong path; - vlong uniqpath; - Qidtab *next; -}; - -enum -{ - MAXPROC = 50, - FHASHSIZE = 64, - Nr_workbufs = 50, - Fidchunk = 1000, - Npsmpt = 32, - Nqidbits = 5, - Nqidtab = (1<<Nqidbits), -}; - -#define Enomem Exenomem -#define Ebadfix Exebadfid -#define Enotdir Exenotdir -#define Edupfid Exedupfid -#define Eopen Exeopen -#define Exmnt Exexmnt -#define Emip Exemip -#define Enopsmt Exenopsmt - -extern char Ebadfid[]; -extern char Enotdir[]; -extern char Edupfid[]; -extern char Eopen[]; -extern char Exmnt[]; -extern char Enomem[]; -extern char Emip[]; -extern char Enopsmt[]; - -Extern Fsrpc *Workq; -Extern int dbg; -Extern File *root; -Extern File *psmpt; -Extern Fid **fhash; -Extern Fid *fidfree; -Extern Proc *Proclist; -Extern char psmap[Npsmpt]; -Extern Qidtab *qidtab[Nqidtab]; -Extern ulong messagesize; -Extern int srvfd; - -/* File system protocol service procedures */ -void Xattach(Fsrpc*); -void Xauth(Fsrpc*); -void Xclunk(Fsrpc*); -void Xcreate(Fsrpc*); -void Xflush(Fsrpc*); -void Xnop(Fsrpc*); -void Xremove(Fsrpc*); -void Xstat(Fsrpc*); -void Xversion(Fsrpc*); -void Xwalk(Fsrpc*); -void Xwstat(Fsrpc*); -void slave(Fsrpc*); - -void reply(Fcall*, Fcall*, char*); -Fid *getfid(int); -int freefid(int); -Fid *newfid(int); -Fsrpc *getsbuf(void); -void initroot(void); -void fatal(char*, ...); -char* makepath(File*, char*); -File *file(File*, char*); -void freefile(File*); -void slaveopen(Fsrpc*); -void slaveread(Fsrpc*); -void slavewrite(Fsrpc*); -void blockingslave(void*); -void reopen(Fid *f); -void noteproc(int, char*); -void flushaction(void*, char*); -void pushfcall(char*); -Qidtab* uniqueqid(Dir*); -void freeqid(Qidtab*); -char* estrdup(char*); -void* emallocz(uint); -int readmessage(int, char*, int); - -#define notify(x) -#define noted(x) -#define exits(x) diff --git a/sys/src/cmd/unix/drawterm/exportfs/exportsrv.c b/sys/src/cmd/unix/drawterm/exportfs/exportsrv.c deleted file mode 100644 index dabb6a0e8..000000000 --- a/sys/src/cmd/unix/drawterm/exportfs/exportsrv.c +++ /dev/null @@ -1,676 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> -#define Extern extern -#include "exportfs.h" - -char Ebadfid[] = "Bad fid"; -char Enotdir[] = "Not a directory"; -char Edupfid[] = "Fid already in use"; -char Eopen[] = "Fid already opened"; -char Exmnt[] = "Cannot .. past mount point"; -char Emip[] = "Mount in progress"; -char Enopsmt[] = "Out of pseudo mount points"; -char Enomem[] = "No memory"; -char Eversion[] = "Bad 9P2000 version"; - -int iounit(int x) -{ - return 8192+IOHDRSZ; -} - -void* -emallocz(ulong n) -{ - void *v; - - v = mallocz(n, 1); - if(v == nil) - panic("out of memory"); - return v; -} - - -void -Xversion(Fsrpc *t) -{ - Fcall rhdr; - - if(t->work.msize > messagesize) - t->work.msize = messagesize; - messagesize = t->work.msize; - if(strncmp(t->work.version, "9P2000", 6) != 0){ - reply(&t->work, &rhdr, Eversion); - return; - } - rhdr.version = "9P2000"; - rhdr.msize = t->work.msize; - reply(&t->work, &rhdr, 0); - t->busy = 0; -} - -void -Xauth(Fsrpc *t) -{ - Fcall rhdr; - - reply(&t->work, &rhdr, "exportfs: authentication not required"); - t->busy = 0; -} - -void -Xflush(Fsrpc *t) -{ - Fsrpc *w, *e; - Fcall rhdr; - - e = &Workq[Nr_workbufs]; - - for(w = Workq; w < e; w++) { - if(w->work.tag == t->work.oldtag) { - DEBUG(DFD, "\tQ busy %d pid %d can %d\n", w->busy, w->pid, w->canint); - if(w->busy && w->pid) { - w->flushtag = t->work.tag; - DEBUG(DFD, "\tset flushtag %d\n", t->work.tag); - // if(w->canint) - // postnote(PNPROC, w->pid, "flush"); - t->busy = 0; - return; - } - } - } - - reply(&t->work, &rhdr, 0); - DEBUG(DFD, "\tflush reply\n"); - t->busy = 0; -} - -void -Xattach(Fsrpc *t) -{ - Fcall rhdr; - Fid *f; - - f = newfid(t->work.fid); - if(f == 0) { - reply(&t->work, &rhdr, Ebadfid); - t->busy = 0; - return; - } - - if(srvfd >= 0){ -/* - if(psmpt == 0){ - Nomount: - reply(&t->work, &rhdr, Enopsmt); - t->busy = 0; - freefid(t->work.fid); - return; - } - for(i=0; i<Npsmpt; i++) - if(psmap[i] == 0) - break; - if(i >= Npsmpt) - goto Nomount; - sprint(buf, "%d", i); - f->f = file(psmpt, buf); - if(f->f == nil) - goto Nomount; - sprint(buf, "/mnt/exportfs/%d", i); - nfd = dup(srvfd, -1); - if(amount(nfd, buf, MREPL|MCREATE, t->work.aname) < 0){ - errstr(buf, sizeof buf); - reply(&t->work, &rhdr, buf); - t->busy = 0; - freefid(t->work.fid); - close(nfd); - return; - } - psmap[i] = 1; - f->mid = i; -*/ - }else{ - f->f = root; - f->f->ref++; - } - - rhdr.qid = f->f->qid; - reply(&t->work, &rhdr, 0); - t->busy = 0; -} - -Fid* -clonefid(Fid *f, int new) -{ - Fid *n; - - n = newfid(new); - if(n == 0) { - n = getfid(new); - if(n == 0) - fatal("inconsistent fids"); - if(n->fid >= 0) - close(n->fid); - freefid(new); - n = newfid(new); - if(n == 0) - fatal("inconsistent fids2"); - } - n->f = f->f; - n->f->ref++; - return n; -} - -void -Xwalk(Fsrpc *t) -{ - char err[ERRMAX], *e; - Fcall rhdr; - Fid *f, *nf; - File *wf; - int i; - - f = getfid(t->work.fid); - if(f == 0) { - reply(&t->work, &rhdr, Ebadfid); - t->busy = 0; - return; - } - - nf = nil; - if(t->work.newfid != t->work.fid){ - nf = clonefid(f, t->work.newfid); - f = nf; - } - - rhdr.nwqid = 0; - e = nil; - for(i=0; i<t->work.nwname; i++){ - if(i == MAXWELEM){ - e = "Too many path elements"; - break; - } - - if(strcmp(t->work.wname[i], "..") == 0) { - if(f->f->parent == nil) { - e = Exmnt; - break; - } - wf = f->f->parent; - wf->ref++; - goto Accept; - } - - wf = file(f->f, t->work.wname[i]); - if(wf == 0){ - errstr(err, sizeof err); - e = err; - break; - } - Accept: - freefile(f->f); - rhdr.wqid[rhdr.nwqid++] = wf->qid; - f->f = wf; - continue; - } - - if(nf!=nil && (e!=nil || rhdr.nwqid!=t->work.nwname)) - freefid(t->work.newfid); - if(rhdr.nwqid > 0) - e = nil; - reply(&t->work, &rhdr, e); - t->busy = 0; -} - -void -Xclunk(Fsrpc *t) -{ - Fcall rhdr; - Fid *f; - - f = getfid(t->work.fid); - if(f == 0) { - reply(&t->work, &rhdr, Ebadfid); - t->busy = 0; - return; - } - - if(f->fid >= 0) - close(f->fid); - - freefid(t->work.fid); - reply(&t->work, &rhdr, 0); - t->busy = 0; -} - -void -Xstat(Fsrpc *t) -{ - char err[ERRMAX], *path; - Fcall rhdr; - Fid *f; - Dir *d; - int s; - uchar *statbuf; - - f = getfid(t->work.fid); - if(f == 0) { - reply(&t->work, &rhdr, Ebadfid); - t->busy = 0; - return; - } - if(f->fid >= 0) - d = dirfstat(f->fid); - else { - path = makepath(f->f, ""); - d = dirstat(path); - free(path); - } - - if(d == nil) { - errstr(err, sizeof err); - reply(&t->work, &rhdr, err); - t->busy = 0; - return; - } - - d->qid.path = f->f->qidt->uniqpath; - s = sizeD2M(d); - statbuf = emallocz(s); - s = convD2M(d, statbuf, s); - free(d); - rhdr.nstat = s; - rhdr.stat = statbuf; - reply(&t->work, &rhdr, 0); - free(statbuf); - t->busy = 0; -} - -static int -getiounit(int fd) -{ - int n; - - n = iounit(fd); - if(n > messagesize-IOHDRSZ) - n = messagesize-IOHDRSZ; - return n; -} - -void -Xcreate(Fsrpc *t) -{ - char err[ERRMAX], *path; - Fcall rhdr; - Fid *f; - File *nf; - - f = getfid(t->work.fid); - if(f == 0) { - reply(&t->work, &rhdr, Ebadfid); - t->busy = 0; - return; - } - - - path = makepath(f->f, t->work.name); - f->fid = create(path, t->work.mode, t->work.perm); - free(path); - if(f->fid < 0) { - errstr(err, sizeof err); - reply(&t->work, &rhdr, err); - t->busy = 0; - return; - } - - nf = file(f->f, t->work.name); - if(nf == 0) { - errstr(err, sizeof err); - reply(&t->work, &rhdr, err); - t->busy = 0; - return; - } - - f->mode = t->work.mode; - freefile(f->f); - f->f = nf; - rhdr.qid = f->f->qid; - rhdr.iounit = getiounit(f->fid); - reply(&t->work, &rhdr, 0); - t->busy = 0; -} - -void -Xremove(Fsrpc *t) -{ - char err[ERRMAX], *path; - Fcall rhdr; - Fid *f; - - f = getfid(t->work.fid); - if(f == 0) { - reply(&t->work, &rhdr, Ebadfid); - t->busy = 0; - return; - } - - path = makepath(f->f, ""); - DEBUG(DFD, "\tremove: %s\n", path); - if(remove(path) < 0) { - free(path); - errstr(err, sizeof err); - reply(&t->work, &rhdr, err); - t->busy = 0; - return; - } - free(path); - - f->f->inval = 1; - if(f->fid >= 0) - close(f->fid); - freefid(t->work.fid); - - reply(&t->work, &rhdr, 0); - t->busy = 0; -} - -void -Xwstat(Fsrpc *t) -{ - char err[ERRMAX], *path; - Fcall rhdr; - Fid *f; - int s; - char *strings; - Dir d; - - f = getfid(t->work.fid); - if(f == 0) { - reply(&t->work, &rhdr, Ebadfid); - t->busy = 0; - return; - } - strings = emallocz(t->work.nstat); /* ample */ - if(convM2D(t->work.stat, t->work.nstat, &d, strings) <= BIT16SZ){ - rerrstr(err, sizeof err); - reply(&t->work, &rhdr, err); - t->busy = 0; - free(strings); - return; - } - - if(f->fid >= 0) - s = dirfwstat(f->fid, &d); - else { - path = makepath(f->f, ""); - s = dirwstat(path, &d); - free(path); - } - if(s < 0) { - rerrstr(err, sizeof err); - reply(&t->work, &rhdr, err); - } - else { - /* wstat may really be rename */ - if(strcmp(d.name, f->f->name)!=0 && strcmp(d.name, "")!=0){ - free(f->f->name); - f->f->name = estrdup(d.name); - } - reply(&t->work, &rhdr, 0); - } - free(strings); - t->busy = 0; -} - -void -slave(Fsrpc *f) -{ - Proc *p; - int pid; - static int nproc; - - for(;;) { - for(p = Proclist; p; p = p->next) { - if(p->busy == 0) { - f->pid = p->pid; - p->busy = 1; - pid = (uintptr)rendezvous((void*)(uintptr)p->pid, f); - if(pid != p->pid) - fatal("rendezvous sync fail"); - return; - } - } - - if(++nproc > MAXPROC) - fatal("too many procs"); - - pid = kproc("slave", blockingslave, nil); - DEBUG(DFD, "slave pid %d\n", pid); - if(pid == -1) - fatal("kproc"); - - p = malloc(sizeof(Proc)); - if(p == 0) - fatal("out of memory"); - - p->busy = 0; - p->pid = pid; - p->next = Proclist; - Proclist = p; - -DEBUG(DFD, "parent %d rendez\n", pid); - rendezvous((void*)(uintptr)pid, p); -DEBUG(DFD, "parent %d went\n", pid); - } -} - -void -blockingslave(void *x) -{ - Fsrpc *p; - Fcall rhdr; - Proc *m; - int pid; - - USED(x); - - notify(flushaction); - - pid = getpid(); - -DEBUG(DFD, "blockingslave %d rendez\n", pid); - m = (Proc*)rendezvous((void*)(uintptr)pid, 0); -DEBUG(DFD, "blockingslave %d rendez got %p\n", pid, m); - - for(;;) { - p = rendezvous((void*)(uintptr)pid, (void*)(uintptr)pid); - if((uintptr)p == ~(uintptr)0) /* Interrupted */ - continue; - - DEBUG(DFD, "\tslave: %d %F b %d p %d\n", pid, &p->work, p->busy, p->pid); - if(p->flushtag != NOTAG) - goto flushme; - - switch(p->work.type) { - case Tread: - slaveread(p); - break; - - case Twrite: - slavewrite(p); - break; - - case Topen: - slaveopen(p); - break; - - default: - reply(&p->work, &rhdr, "exportfs: slave type error"); - } - if(p->flushtag != NOTAG) { -flushme: - p->work.type = Tflush; - p->work.tag = p->flushtag; - reply(&p->work, &rhdr, 0); - } - p->busy = 0; - m->busy = 0; - } -} - -int -openmount(int sfd) -{ - werrstr("openmount not implemented"); - return -1; -} - -void -slaveopen(Fsrpc *p) -{ - char err[ERRMAX], *path; - Fcall *work, rhdr; - Fid *f; - Dir *d; - - work = &p->work; - - f = getfid(work->fid); - if(f == 0) { - reply(work, &rhdr, Ebadfid); - return; - } - if(f->fid >= 0) { - close(f->fid); - f->fid = -1; - } - - path = makepath(f->f, ""); - DEBUG(DFD, "\topen: %s %d\n", path, work->mode); - - p->canint = 1; - if(p->flushtag != NOTAG){ - free(path); - return; - } - /* There is a race here I ignore because there are no locks */ - f->fid = open(path, work->mode); - free(path); - p->canint = 0; - if(f->fid < 0 || (d = dirfstat(f->fid)) == nil) { - Error: - errstr(err, sizeof err); - reply(work, &rhdr, err); - return; - } - f->f->qid = d->qid; - free(d); - if(f->f->qid.type & QTMOUNT){ /* fork new exportfs for this */ - f->fid = openmount(f->fid); - if(f->fid < 0) - goto Error; - } - - DEBUG(DFD, "\topen: fd %d\n", f->fid); - f->mode = work->mode; - rhdr.iounit = getiounit(f->fid); - rhdr.qid = f->f->qid; - reply(work, &rhdr, 0); -} - -void -slaveread(Fsrpc *p) -{ - Fid *f; - int n, r; - Fcall *work, rhdr; - char *data, err[ERRMAX]; - - work = &p->work; - - f = getfid(work->fid); - if(f == 0) { - reply(work, &rhdr, Ebadfid); - return; - } - - n = (work->count > messagesize-IOHDRSZ) ? messagesize-IOHDRSZ : work->count; - p->canint = 1; - if(p->flushtag != NOTAG) - return; - data = malloc(n); - if(data == nil) - fatal(Enomem); - - /* can't just call pread, since directories must update the offset */ - r = pread(f->fid, data, n, work->offset); - p->canint = 0; - if(r < 0) { - free(data); - errstr(err, sizeof err); - reply(work, &rhdr, err); - return; - } - - DEBUG(DFD, "\tread: fd=%d %d bytes\n", f->fid, r); - - rhdr.data = data; - rhdr.count = r; - reply(work, &rhdr, 0); - free(data); -} - -void -slavewrite(Fsrpc *p) -{ - char err[ERRMAX]; - Fcall *work, rhdr; - Fid *f; - int n; - - work = &p->work; - - f = getfid(work->fid); - if(f == 0) { - reply(work, &rhdr, Ebadfid); - return; - } - - n = (work->count > messagesize-IOHDRSZ) ? messagesize-IOHDRSZ : work->count; - p->canint = 1; - if(p->flushtag != NOTAG) - return; - n = pwrite(f->fid, work->data, n, work->offset); - p->canint = 0; - if(n < 0) { - errstr(err, sizeof err); - reply(work, &rhdr, err); - return; - } - - DEBUG(DFD, "\twrite: %d bytes fd=%d\n", n, f->fid); - - rhdr.count = n; - reply(work, &rhdr, 0); -} - -void -reopen(Fid *f) -{ - USED(f); - fatal("reopen"); -} - -void -flushaction(void *a, char *cause) -{ - USED(a); - if(strncmp(cause, "sys:", 4) == 0 && !strstr(cause, "pipe")) { - fprint(2, "exportsrv: note: %s\n", cause); - exits("noted"); - } - if(strncmp(cause, "kill", 4) == 0) - noted(NDFLT); - - noted(NCONT); -} diff --git a/sys/src/cmd/unix/drawterm/gui-osx/Makefile b/sys/src/cmd/unix/drawterm/gui-osx/Makefile deleted file mode 100644 index 10547601f..000000000 --- a/sys/src/cmd/unix/drawterm/gui-osx/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libgui.a - -OFILES=\ - alloc.$O\ - cload.$O\ - draw.$O\ - load.$O\ - screen.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/gui-osx/alloc.c b/sys/src/cmd/unix/drawterm/gui-osx/alloc.c deleted file mode 100644 index cc7e97741..000000000 --- a/sys/src/cmd/unix/drawterm/gui-osx/alloc.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -Memimage* -allocmemimage(Rectangle r, ulong chan) -{ - return _allocmemimage(r, chan); -} - -void -freememimage(Memimage *i) -{ - _freememimage(i); -} - -void -memfillcolor(Memimage *i, ulong val) -{ - _memfillcolor(i, val); -} - diff --git a/sys/src/cmd/unix/drawterm/gui-osx/cload.c b/sys/src/cmd/unix/drawterm/gui-osx/cload.c deleted file mode 100644 index 9d658ef85..000000000 --- a/sys/src/cmd/unix/drawterm/gui-osx/cload.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - return _cloadmemimage(i, r, data, ndata); -} diff --git a/sys/src/cmd/unix/drawterm/gui-osx/draw.c b/sys/src/cmd/unix/drawterm/gui-osx/draw.c deleted file mode 100644 index eaac6d58a..000000000 --- a/sys/src/cmd/unix/drawterm/gui-osx/draw.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -void -memimagedraw(Memimage *dst, Rectangle r, Memimage *src, Point sp, Memimage *mask, Point mp, int op) -{ - _memimagedraw(_memimagedrawsetup(dst, r, src, sp, mask, mp, op)); -} - -ulong -pixelbits(Memimage *m, Point p) -{ - return _pixelbits(m, p); -} - -void -memimageinit(void) -{ - _memimageinit(); -} diff --git a/sys/src/cmd/unix/drawterm/gui-osx/keycodes.h b/sys/src/cmd/unix/drawterm/gui-osx/keycodes.h deleted file mode 100644 index 52328ace0..000000000 --- a/sys/src/cmd/unix/drawterm/gui-osx/keycodes.h +++ /dev/null @@ -1,189 +0,0 @@ -/* These are the Macintosh key scancode constants -- from Inside Macintosh */ -#define QZ_ESCAPE 0x35 -#define QZ_F1 0x7A -#define QZ_F2 0x78 -#define QZ_F3 0x63 -#define QZ_F4 0x76 -#define QZ_F5 0x60 -#define QZ_F6 0x61 -#define QZ_F7 0x62 -#define QZ_F8 0x64 -#define QZ_F9 0x65 -#define QZ_F10 0x6D -#define QZ_F11 0x67 -#define QZ_F12 0x6F -#define QZ_PRINT 0x69 -#define QZ_SCROLLOCK 0x6B -#define QZ_PAUSE 0x71 -#define QZ_POWER 0x7F -#define QZ_BACKQUOTE 0x32 -#define QZ_1 0x12 -#define QZ_2 0x13 -#define QZ_3 0x14 -#define QZ_4 0x15 -#define QZ_5 0x17 -#define QZ_6 0x16 -#define QZ_7 0x1A -#define QZ_8 0x1C -#define QZ_9 0x19 -#define QZ_0 0x1D -#define QZ_MINUS 0x1B -#define QZ_EQUALS 0x18 -#define QZ_BACKSPACE 0x33 -#define QZ_INSERT 0x72 -#define QZ_HOME 0x73 -#define QZ_PAGEUP 0x74 -#define QZ_NUMLOCK 0x47 -#define QZ_KP_EQUALS 0x51 -#define QZ_KP_DIVIDE 0x4B -#define QZ_KP_MULTIPLY 0x43 -#define QZ_TAB 0x30 -#define QZ_q 0x0C -#define QZ_w 0x0D -#define QZ_e 0x0E -#define QZ_r 0x0F -#define QZ_t 0x11 -#define QZ_y 0x10 -#define QZ_u 0x20 -#define QZ_i 0x22 -#define QZ_o 0x1F -#define QZ_p 0x23 -#define QZ_LEFTBRACKET 0x21 -#define QZ_RIGHTBRACKET 0x1E -#define QZ_BACKSLASH 0x2A -#define QZ_DELETE 0x75 -#define QZ_END 0x77 -#define QZ_PAGEDOWN 0x79 -#define QZ_KP7 0x59 -#define QZ_KP8 0x5B -#define QZ_KP9 0x5C -#define QZ_KP_MINUS 0x4E -#define QZ_CAPSLOCK 0x39 -#define QZ_a 0x00 -#define QZ_s 0x01 -#define QZ_d 0x02 -#define QZ_f 0x03 -#define QZ_g 0x05 -#define QZ_h 0x04 -#define QZ_j 0x26 -#define QZ_k 0x28 -#define QZ_l 0x25 -#define QZ_SEMICOLON 0x29 -#define QZ_QUOTE 0x27 -#define QZ_RETURN 0x24 -#define QZ_KP4 0x56 -#define QZ_KP5 0x57 -#define QZ_KP6 0x58 -#define QZ_KP_PLUS 0x45 -#define QZ_LSHIFT 0x38 -#define QZ_z 0x06 -#define QZ_x 0x07 -#define QZ_c 0x08 -#define QZ_v 0x09 -#define QZ_b 0x0B -#define QZ_n 0x2D -#define QZ_m 0x2E -#define QZ_COMMA 0x2B -#define QZ_PERIOD 0x2F -#define QZ_SLASH 0x2C -/* These are the same as the left versions - use left by default */ -#if 0 -#define QZ_RSHIFT 0x38 -#endif -#define QZ_UP 0x7E -#define QZ_KP1 0x53 -#define QZ_KP2 0x54 -#define QZ_KP3 0x55 -#define QZ_KP_ENTER 0x4C -#define QZ_LCTRL 0x3B -#define QZ_LALT 0x3A -#define QZ_LMETA 0x37 -#define QZ_SPACE 0x31 -/* These are the same as the left versions - use left by default */ -#if 0 -#define QZ_RMETA 0x37 -#define QZ_RALT 0x3A -#define QZ_RCTRL 0x3B -#endif -#define QZ_LEFT 0x7B -#define QZ_DOWN 0x7D -#define QZ_RIGHT 0x7C -#define QZ_KP0 0x52 -#define QZ_KP_PERIOD 0x41 - -/* Wierd, these keys are on my iBook under MacOS X */ -#define QZ_IBOOK_ENTER 0x34 -#define QZ_IBOOK_LEFT 0x3B -#define QZ_IBOOK_RIGHT 0x3C -#define QZ_IBOOK_DOWN 0x3D -#define QZ_IBOOK_UP 0x3E -#define KEY_ENTER 13 -#define KEY_TAB 9 - -#define KEY_BASE 0x100 - -/* Function keys */ -#define KEY_F (KEY_BASE+64) - -/* Control keys */ -#define KEY_CTRL (KEY_BASE) -#define KEY_BACKSPACE (KEY_CTRL+0) -#define KEY_DELETE (KEY_CTRL+1) -#define KEY_INSERT (KEY_CTRL+2) -#define KEY_HOME (KEY_CTRL+3) -#define KEY_END (KEY_CTRL+4) -#define KEY_PAGE_UP (KEY_CTRL+5) -#define KEY_PAGE_DOWN (KEY_CTRL+6) -#define KEY_ESC (KEY_CTRL+7) - -/* Control keys short name */ -#define KEY_BS KEY_BACKSPACE -#define KEY_DEL KEY_DELETE -#define KEY_INS KEY_INSERT -#define KEY_PGUP KEY_PAGE_UP -#define KEY_PGDOWN KEY_PAGE_DOWN -#define KEY_PGDWN KEY_PAGE_DOWN - -/* Cursor movement */ -#define KEY_CRSR (KEY_BASE+16) -#define KEY_RIGHT (KEY_CRSR+0) -#define KEY_LEFT (KEY_CRSR+1) -#define KEY_DOWN (KEY_CRSR+2) -#define KEY_UP (KEY_CRSR+3) - -/* Multimedia keyboard/remote keys */ -#define KEY_MM_BASE (0x100+384) -#define KEY_POWER (KEY_MM_BASE+0) -#define KEY_MENU (KEY_MM_BASE+1) -#define KEY_PLAY (KEY_MM_BASE+2) -#define KEY_PAUSE (KEY_MM_BASE+3) -#define KEY_PLAYPAUSE (KEY_MM_BASE+4) -#define KEY_STOP (KEY_MM_BASE+5) -#define KEY_FORWARD (KEY_MM_BASE+6) -#define KEY_REWIND (KEY_MM_BASE+7) -#define KEY_NEXT (KEY_MM_BASE+8) -#define KEY_PREV (KEY_MM_BASE+9) -#define KEY_VOLUME_UP (KEY_MM_BASE+10) -#define KEY_VOLUME_DOWN (KEY_MM_BASE+11) -#define KEY_MUTE (KEY_MM_BASE+12) - -/* Keypad keys */ -#define KEY_KEYPAD (KEY_BASE+32) -#define KEY_KP0 (KEY_KEYPAD+0) -#define KEY_KP1 (KEY_KEYPAD+1) -#define KEY_KP2 (KEY_KEYPAD+2) -#define KEY_KP3 (KEY_KEYPAD+3) -#define KEY_KP4 (KEY_KEYPAD+4) -#define KEY_KP5 (KEY_KEYPAD+5) -#define KEY_KP6 (KEY_KEYPAD+6) -#define KEY_KP7 (KEY_KEYPAD+7) -#define KEY_KP8 (KEY_KEYPAD+8) -#define KEY_KP9 (KEY_KEYPAD+9) -#define KEY_KPDEC (KEY_KEYPAD+10) -#define KEY_KPINS (KEY_KEYPAD+11) -#define KEY_KPDEL (KEY_KEYPAD+12) -#define KEY_KPENTER (KEY_KEYPAD+13) - -/* Special keys */ -#define KEY_INTERN (0x1000) -#define KEY_CLOSE_WIN (KEY_INTERN+0) diff --git a/sys/src/cmd/unix/drawterm/gui-osx/load.c b/sys/src/cmd/unix/drawterm/gui-osx/load.c deleted file mode 100644 index 7cca3a6fd..000000000 --- a/sys/src/cmd/unix/drawterm/gui-osx/load.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - return _loadmemimage(i, r, data, ndata); -} diff --git a/sys/src/cmd/unix/drawterm/gui-osx/screen.c b/sys/src/cmd/unix/drawterm/gui-osx/screen.c deleted file mode 100644 index 487c9c179..000000000 --- a/sys/src/cmd/unix/drawterm/gui-osx/screen.c +++ /dev/null @@ -1,765 +0,0 @@ -// in this file, _Rect is os x Rect, -// _Point is os x Point -#undef Point -#define Point _Point -#undef Rect -#define Rect _Rect - -#include <Carbon/Carbon.h> -#include <QuickTime/QuickTime.h> // for full screen - -#undef Rect -#undef Point - -#undef nil - - -#include "u.h" -#include "lib.h" -#include "kern/dat.h" -#include "kern/fns.h" -#include "error.h" -#include "user.h" -#include <draw.h> -#include <memdraw.h> -#include "screen.h" -#include "keyboard.h" -#include "keycodes.h" - -#define rWindowResource 128 - -#define topLeft(r) (((Point *) &(r))[0]) -#define botRight(r) (((Point *) &(r))[1]) - -extern int mousequeue; -static int depth; -Boolean gDone; -RgnHandle gCursorRegionHdl; - -Memimage *gscreen; -Screeninfo screen; - -static int readybit; -static Rendez rend; - -/// -// menu -// -static MenuRef windMenu; -static MenuRef viewMenu; - -enum { - kQuitCmd = 1, - kFullScreenCmd = 2, -}; - -static WindowGroupRef winGroup = NULL; -static WindowRef theWindow = NULL; -static CGContextRef context; -static CGDataProviderRef dataProviderRef; -static CGImageRef fullScreenImage; -static CGRect devRect; -static CGRect bounds; -static PasteboardRef appleclip; -static _Rect winRect; - -Boolean altPressed = false; -Boolean button2 = false; -Boolean button3 = false; - - -static int -isready(void*a) -{ - return readybit; -} - -CGContextRef QuartzContext; - -void winproc(void *a); - -void screeninit(void) -{ - int fmt; - int dx, dy; - ProcessSerialNumber psn = { 0, kCurrentProcess }; - TransformProcessType(&psn, kProcessTransformToForegroundApplication); - SetFrontProcess(&psn); - - memimageinit(); - depth = 32; // That's all this code deals with for now - screen.depth = 32; - fmt = XBGR32; //XRGB32; - - devRect = CGDisplayBounds(CGMainDisplayID()); -// devRect.origin.x = 0; -// devRect.origin.y = 0; -// devRect.size.width = 1024; -// devRect.size.height = 768; - dx = devRect.size.width; - dy = devRect.size.height; - - gscreen = allocmemimage(Rect(0,0,dx,dy), fmt); - dataProviderRef = CGDataProviderCreateWithData(0, gscreen->data->bdata, - dx * dy * 4, 0); - fullScreenImage = CGImageCreate(dx, dy, 8, 32, dx * 4, - CGColorSpaceCreateDeviceRGB(), - kCGImageAlphaNoneSkipLast, - dataProviderRef, 0, 0, kCGRenderingIntentDefault); - - kproc("osxscreen", winproc, 0); - ksleep(&rend, isready, 0); -} - -// No wonder Apple sells so many wide displays! -static OSStatus ApplicationQuitEventHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData); -static OSStatus MainWindowEventHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData); -static OSStatus MainWindowCommandHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData); - -void -window_resized() -{ - GetWindowBounds(theWindow, kWindowContentRgn, &winRect ); - - bounds = CGRectMake(0, 0, winRect.right-winRect.left, winRect.bottom - winRect.top); -} - - -void winproc(void *a) -{ - winRect.left = 30; - winRect.top = 60; - winRect.bottom = (devRect.size.height * 0.75) + winRect.top; - winRect.right = (devRect.size.width * 0.75) + winRect.left; - - ClearMenuBar(); - InitCursor(); - - CreateStandardWindowMenu(0, &windMenu); - InsertMenu(windMenu, 0); - - MenuItemIndex index; - CreateNewMenu(1004, 0, &viewMenu); - SetMenuTitleWithCFString(viewMenu, CFSTR("View")); - AppendMenuItemTextWithCFString(viewMenu, CFSTR("Full Screen"), 0, - kFullScreenCmd, &index); - SetMenuItemCommandKey(viewMenu, index, 0, 'F'); - InsertMenu(viewMenu, GetMenuID(windMenu)); - - DrawMenuBar(); - uint32_t windowAttrs = 0 - | kWindowCloseBoxAttribute - | kWindowCollapseBoxAttribute - | kWindowResizableAttribute - | kWindowStandardHandlerAttribute - | kWindowFullZoomAttribute - ; - - CreateNewWindow(kDocumentWindowClass, windowAttrs, &winRect, &theWindow); - CreateWindowGroup(0, &winGroup); - SetWindowGroup(theWindow, winGroup); - - SetWindowTitleWithCFString(theWindow, CFSTR("Drawterm")); - - if(PasteboardCreate(kPasteboardClipboard, &appleclip) != noErr) - sysfatal("pasteboard create failed"); - - const EventTypeSpec quit_events[] = { - { kEventClassApplication, kEventAppQuit } - }; - const EventTypeSpec commands[] = { - { kEventClassWindow, kEventWindowClosed }, - { kEventClassWindow, kEventWindowBoundsChanged }, - { kEventClassCommand, kEventCommandProcess } - }; - const EventTypeSpec events[] = { - { kEventClassKeyboard, kEventRawKeyDown }, - { kEventClassKeyboard, kEventRawKeyModifiersChanged }, - { kEventClassKeyboard, kEventRawKeyRepeat }, - { kEventClassMouse, kEventMouseDown }, - { kEventClassMouse, kEventMouseUp }, - { kEventClassMouse, kEventMouseMoved }, - { kEventClassMouse, kEventMouseDragged }, - { kEventClassMouse, kEventMouseWheelMoved }, - }; - - InstallApplicationEventHandler ( - NewEventHandlerUPP (ApplicationQuitEventHandler), - GetEventTypeCount(quit_events), - quit_events, - NULL, - NULL); - - InstallApplicationEventHandler ( - NewEventHandlerUPP (MainWindowEventHandler), - GetEventTypeCount(events), - events, - NULL, - NULL); - InstallWindowEventHandler ( - theWindow, - NewEventHandlerUPP (MainWindowCommandHandler), - GetEventTypeCount(commands), - commands, - theWindow, - NULL); - - ShowWindow(theWindow); - ShowMenuBar(); - window_resized(); - SelectWindow(theWindow); - terminit(); - // Run the event loop - readybit = 1; - wakeup(&rend); - RunApplicationEventLoop(); - -} - -static inline int convert_key(UInt32 key, UInt32 charcode) -{ - switch(key) { - case QZ_IBOOK_ENTER: - case QZ_RETURN: return '\n'; - case QZ_ESCAPE: return 27; - case QZ_BACKSPACE: return '\b'; - case QZ_LALT: return Kalt; - case QZ_LCTRL: return Kctl; - case QZ_LSHIFT: return Kshift; - case QZ_F1: return KF+1; - case QZ_F2: return KF+2; - case QZ_F3: return KF+3; - case QZ_F4: return KF+4; - case QZ_F5: return KF+5; - case QZ_F6: return KF+6; - case QZ_F7: return KF+7; - case QZ_F8: return KF+8; - case QZ_F9: return KF+9; - case QZ_F10: return KF+10; - case QZ_F11: return KF+11; - case QZ_F12: return KF+12; - case QZ_INSERT: return Kins; - case QZ_DELETE: return 0x7F; - case QZ_HOME: return Khome; - case QZ_END: return Kend; - case QZ_KP_PLUS: return '+'; - case QZ_KP_MINUS: return '-'; - case QZ_TAB: return '\t'; - case QZ_PAGEUP: return Kpgup; - case QZ_PAGEDOWN: return Kpgdown; - case QZ_UP: return Kup; - case QZ_DOWN: return Kdown; - case QZ_LEFT: return Kleft; - case QZ_RIGHT: return Kright; - case QZ_KP_MULTIPLY: return '*'; - case QZ_KP_DIVIDE: return '/'; - case QZ_KP_ENTER: return '\n'; - case QZ_KP_PERIOD: return '.'; - case QZ_KP0: return '0'; - case QZ_KP1: return '1'; - case QZ_KP2: return '2'; - case QZ_KP3: return '3'; - case QZ_KP4: return '4'; - case QZ_KP5: return '5'; - case QZ_KP6: return '6'; - case QZ_KP7: return '7'; - case QZ_KP8: return '8'; - case QZ_KP9: return '9'; - default: return charcode; - } -} - -void -sendbuttons(int b, int x, int y) -{ - int i; - lock(&mouse.lk); - i = mouse.wi; - if(mousequeue) { - if(i == mouse.ri || mouse.lastb != b || mouse.trans) { - mouse.wi = (i+1)%Mousequeue; - if(mouse.wi == mouse.ri) - mouse.ri = (mouse.ri+1)%Mousequeue; - mouse.trans = mouse.lastb != b; - } else { - i = (i-1+Mousequeue)%Mousequeue; - } - } else { - mouse.wi = (i+1)%Mousequeue; - mouse.ri = i; - } - mouse.queue[i].xy.x = x; - mouse.queue[i].xy.y = y; - mouse.queue[i].buttons = b; - mouse.queue[i].msec = ticks(); - mouse.lastb = b; - unlock(&mouse.lk); - wakeup(&mouse.r); -} - -static Ptr fullScreenRestore; -static int amFullScreen = 0; -static WindowRef oldWindow = NULL; - -static void -leave_full_screen() -{ - if (amFullScreen) { - EndFullScreen(fullScreenRestore, 0); - theWindow = oldWindow; - ShowWindow(theWindow); - amFullScreen = 0; - window_resized(); - Rectangle rect = { { 0, 0 }, - { bounds.size.width, - bounds.size.height} }; - drawqlock(); - flushmemscreen(rect); - drawqunlock(); - } -} - -static void -full_screen() -{ - if (!amFullScreen) { - oldWindow = theWindow; - HideWindow(theWindow); - BeginFullScreen(&fullScreenRestore, 0, 0, 0, &theWindow, 0, 0); - amFullScreen = 1; - window_resized(); - Rectangle rect = { { 0, 0 }, - { bounds.size.width, - bounds.size.height} }; - drawqlock(); - flushmemscreen(rect); - drawqunlock(); - } -} - -// catch quit events to handle quits from menu, Cmd+Q, applescript, and task switcher -static OSStatus ApplicationQuitEventHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData) -{ - exit(0); -// QuitApplicationEventLoop(); - return noErr; -} - -static OSStatus MainWindowEventHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData) -{ - OSStatus result = noErr; - result = CallNextEventHandler(nextHandler, event); - UInt32 class = GetEventClass (event); - UInt32 kind = GetEventKind (event); - static uint32_t mousebuttons = 0; // bitmask of buttons currently down - static uint32_t mouseX = 0; - static uint32_t mouseY = 0; - - if(class == kEventClassKeyboard) { - char macCharCodes; - UInt32 macKeyCode; - UInt32 macKeyModifiers; - - GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, - NULL, sizeof(macCharCodes), NULL, &macCharCodes); - GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, - sizeof(macKeyCode), NULL, &macKeyCode); - GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, - sizeof(macKeyModifiers), NULL, &macKeyModifiers); - switch(kind) { - case kEventRawKeyModifiersChanged: - if (macKeyModifiers == (controlKey | optionKey)) leave_full_screen(); - - switch(macKeyModifiers & (optionKey | cmdKey)) { - case (optionKey | cmdKey): - /* due to chording we need to handle the case when both - * modifier keys are pressed at the same time. - * currently it's only 2-3 snarf and the 3-2 noop - */ - altPressed = true; - if(mousebuttons & 1 || mousebuttons & 2 || mousebuttons & 4) { - mousebuttons |= 2; /* set button 2 */ - mousebuttons |= 4; /* set button 3 */ - button2 = true; - button3 = true; - sendbuttons(mousebuttons, mouseX, mouseY); - } - break; - case optionKey: - altPressed = true; - if(mousebuttons & 1 || mousebuttons & 4) { - mousebuttons |= 2; /* set button 2 */ - button2 = true; - sendbuttons(mousebuttons, mouseX, mouseY); - } - break; - case cmdKey: - if(mousebuttons & 1 || mousebuttons & 2) { - mousebuttons |= 4; /* set button 3 */ - button3 = true; - sendbuttons(mousebuttons, mouseX, mouseY); - } - break; - case 0: - default: - if(button2 || button3) { - if(button2) { - mousebuttons &= ~2; /* clear button 2 */ - button2 = false; - altPressed = false; - } - if(button3) { - mousebuttons &= ~4; /* clear button 3 */ - button3 = false; - } - sendbuttons(mousebuttons, mouseX, mouseY); - } - if(altPressed) { - kbdputc(kbdq, Kalt); - altPressed = false; - } - break; - } - break; - case kEventRawKeyDown: - case kEventRawKeyRepeat: - if(macKeyModifiers != cmdKey) { - int key = convert_key(macKeyCode, macCharCodes); - if (key != -1) kbdputc(kbdq, key); - } else - result = eventNotHandledErr; - break; - default: - break; - } - } - else if(class == kEventClassMouse) { - _Point mousePos; - - GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, - 0, sizeof mousePos, 0, &mousePos); - - switch (kind) { - case kEventMouseWheelMoved: - { - int32_t wheeldelta; - GetEventParameter(event,kEventParamMouseWheelDelta,typeSInt32, - 0,sizeof(wheeldelta), 0, &wheeldelta); - mouseX = mousePos.h - winRect.left; - mouseY = mousePos.v - winRect.top; - sendbuttons(wheeldelta>0 ? 8 : 16, mouseX, mouseY); - break; - } - case kEventMouseUp: - case kEventMouseDown: - { - uint32_t buttons; - uint32_t modifiers; - GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, - 0, sizeof(modifiers), 0, &modifiers); - GetEventParameter(event, kEventParamMouseChord, typeUInt32, - 0, sizeof buttons, 0, &buttons); - /* simulate other buttons via alt/apple key. like x11 */ - if(modifiers & optionKey) { - mousebuttons = ((buttons & 1) ? 2 : 0); - altPressed = false; - } else if(modifiers & cmdKey) - mousebuttons = ((buttons & 1) ? 4 : 0); - else - mousebuttons = (buttons & 1); - - mousebuttons |= ((buttons & 2)<<1); - mousebuttons |= ((buttons & 4)>>1); - - } /* Fallthrough */ - case kEventMouseMoved: - case kEventMouseDragged: - mouseX = mousePos.h - winRect.left; - mouseY = mousePos.v - winRect.top; - sendbuttons(mousebuttons, mouseX, mouseY); - break; - default: - result = eventNotHandledErr; - break; - } - } - return result; -} - - -//default window command handler (from menus) -static OSStatus MainWindowCommandHandler(EventHandlerCallRef nextHandler, - EventRef event, void *userData) -{ - OSStatus result = noErr; - UInt32 class = GetEventClass (event); - UInt32 kind = GetEventKind (event); - - result = CallNextEventHandler(nextHandler, event); - - if(class == kEventClassCommand) - { - HICommand theHICommand; - GetEventParameter( event, kEventParamDirectObject, typeHICommand, - NULL, sizeof( HICommand ), NULL, &theHICommand ); - - switch ( theHICommand.commandID ) - { - case kHICommandQuit: - exit(0); - break; - - case kFullScreenCmd: - full_screen(); - break; - - default: - result = eventNotHandledErr; - break; - } - } - else if(class == kEventClassWindow) - { - WindowRef window; - _Rect rectPort = {0,0,0,0}; - - GetEventParameter(event, kEventParamDirectObject, typeWindowRef, - NULL, sizeof(WindowRef), NULL, &window); - - if(window) - { - GetPortBounds(GetWindowPort(window), &rectPort); - } - - switch (kind) - { - case kEventWindowClosed: - // send a quit carbon event instead of directly calling cleanexit - // so that all quits are done in ApplicationQuitEventHandler - { - EventRef quitEvent; - CreateEvent(NULL, - kEventClassApplication, - kEventAppQuit, - 0, - kEventAttributeNone, - &quitEvent); - EventTargetRef target; - target = GetApplicationEventTarget(); - SendEventToEventTarget(quitEvent, target); - } - break; - - //resize window - case kEventWindowBoundsChanged: - window_resized(); - Rectangle rect = { { 0, 0 }, - { bounds.size.width, - bounds.size.height} }; - drawqlock(); - flushmemscreen(rect); - drawqunlock(); - break; - - default: - result = eventNotHandledErr; - break; - } - } - - return result; -} - -void -flushmemscreen(Rectangle r) -{ - // sanity check. Trips from the initial "terminal" - if (r.max.x < r.min.x || r.max.y < r.min.y) return; - - screenload(r, gscreen->depth, byteaddr(gscreen, ZP), ZP, - gscreen->width*sizeof(ulong)); -} - -uchar* -attachscreen(Rectangle *r, ulong *chan, int *depth, int *width, int *softscreen, void **X) -{ - *r = gscreen->r; - *chan = gscreen->chan; - *depth = gscreen->depth; - *width = gscreen->width; - *softscreen = 1; - - return gscreen->data->bdata; -} - -// PAL - no palette handling. Don't intend to either. -void -getcolor(ulong i, ulong *r, ulong *g, ulong *b) -{ - -// PAL: Certainly wrong to return a grayscale. - *r = i; - *g = i; - *b = i; -} - -void -setcolor(ulong index, ulong red, ulong green, ulong blue) -{ - assert(0); -} - - -static char snarf[3*SnarfSize+1]; -static Rune rsnarf[SnarfSize+1]; - -char* -clipread(void) -{ - CFDataRef cfdata; - OSStatus err = noErr; - ItemCount nItems; - - // Wow. This is ridiculously complicated. - PasteboardSynchronize(appleclip); - if((err = PasteboardGetItemCount(appleclip, &nItems)) != noErr) { - fprint(2, "apple pasteboard GetItemCount failed - Error %d\n", err); - return 0; - } - - uint32_t i; - // Yes, based at 1. Silly API. - for(i = 1; i <= nItems; ++i) { - PasteboardItemID itemID; - CFArrayRef flavorTypeArray; - CFIndex flavorCount; - - if((err = PasteboardGetItemIdentifier(appleclip, i, &itemID)) != noErr){ - fprint(2, "Can't get pasteboard item identifier: %d\n", err); - return 0; - } - - if((err = PasteboardCopyItemFlavors(appleclip, itemID, &flavorTypeArray))!=noErr){ - fprint(2, "Can't copy pasteboard item flavors: %d\n", err); - return 0; - } - - flavorCount = CFArrayGetCount(flavorTypeArray); - CFIndex flavorIndex; - for(flavorIndex = 0; flavorIndex < flavorCount; ++flavorIndex){ - CFStringRef flavorType; - flavorType = (CFStringRef)CFArrayGetValueAtIndex(flavorTypeArray, flavorIndex); - if (UTTypeConformsTo(flavorType, CFSTR("public.utf16-plain-text"))){ - if((err = PasteboardCopyItemFlavorData(appleclip, itemID, - CFSTR("public.utf16-plain-text"), &cfdata)) != noErr){ - fprint(2, "apple pasteboard CopyItem failed - Error %d\n", err); - return 0; - } - CFIndex length = CFDataGetLength(cfdata); - if (length > sizeof rsnarf) length = sizeof rsnarf; - CFDataGetBytes(cfdata, CFRangeMake(0, length), (uint8_t *)rsnarf); - snprint(snarf, sizeof snarf, "%.*S", length/sizeof(Rune), rsnarf); - char *s = snarf; - while (*s) { - if (*s == '\r') *s = '\n'; - s++; - } - CFRelease(cfdata); - return strdup(snarf); - } - } - } - return 0; -} - -int -clipwrite(char *snarf) -{ - CFDataRef cfdata; - PasteboardSyncFlags flags; - - runesnprint(rsnarf, nelem(rsnarf), "%s", snarf); - if(PasteboardClear(appleclip) != noErr){ - fprint(2, "apple pasteboard clear failed\n"); - return 0; - } - flags = PasteboardSynchronize(appleclip); - if((flags&kPasteboardModified) || !(flags&kPasteboardClientIsOwner)){ - fprint(2, "apple pasteboard cannot assert ownership\n"); - return 0; - } - cfdata = CFDataCreate(kCFAllocatorDefault, - (uchar*)rsnarf, runestrlen(rsnarf)*2); - if(cfdata == nil){ - fprint(2, "apple pasteboard cfdatacreate failed\n"); - return 0; - } - if(PasteboardPutItemFlavor(appleclip, (PasteboardItemID)1, - CFSTR("public.utf16-plain-text"), cfdata, 0) != noErr){ - fprint(2, "apple pasteboard putitem failed\n"); - CFRelease(cfdata); - return 0; - } - CFRelease(cfdata); - return 1; -} - - -void -mouseset(Point xy) -{ - CGPoint pnt; - pnt.x = xy.x + winRect.left; - pnt.y = xy.y + winRect.top; - CGWarpMouseCursorPosition(pnt); -} - -void -screenload(Rectangle r, int depth, uchar *p, Point pt, int step) -{ - CGRect rbounds; - rbounds.size.width = r.max.x - r.min.x; - rbounds.size.height = r.max.y - r.min.y; - rbounds.origin.x = r.min.x; - rbounds.origin.y = r.min.y; - - if(depth != gscreen->depth) - panic("screenload: bad ldepth"); - - QDBeginCGContext( GetWindowPort(theWindow), &context); - - // The sub-image is relative to our whole screen image. - CGImageRef subimg = CGImageCreateWithImageInRect(fullScreenImage, rbounds); - - // Drawing the sub-image is relative to the window. - rbounds.origin.y = winRect.bottom - winRect.top - r.min.y - rbounds.size.height; - CGContextDrawImage(context, rbounds, subimg); - CGContextFlush(context); - CGImageRelease(subimg); - QDEndCGContext( GetWindowPort(theWindow), &context); - -} - -// PAL: these don't work. -// SetCursor and InitCursor are marked as deprecated in 10.4, and I can't for the -// life of me find out what has replaced them. -void -setcursor(void) -{ - Cursor crsr; - int i; - - for(i=0; i<16; i++){ - crsr.data[i] = ((ushort*)cursor.set)[i]; - crsr.mask[i] = crsr.data[i] | ((ushort*)cursor.clr)[i]; - } - crsr.hotSpot.h = -cursor.offset.x; - crsr.hotSpot.v = -cursor.offset.y; - SetCursor(&crsr); -} - -void -cursorarrow(void) -{ - InitCursor(); -} diff --git a/sys/src/cmd/unix/drawterm/gui-osx/wstrtoutf.c b/sys/src/cmd/unix/drawterm/gui-osx/wstrtoutf.c deleted file mode 100644 index 2cdc7fd8b..000000000 --- a/sys/src/cmd/unix/drawterm/gui-osx/wstrtoutf.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -wstrutflen(Rune *s) -{ - int n; - - for(n=0; *s; n+=runelen(*s),s++) - ; - return n; -} - -int -wstrtoutf(char *s, Rune *t, int n) -{ - int i; - char *s0; - - s0 = s; - if(n <= 0) - return wstrutflen(t)+1; - while(*t) { - if(n < UTFmax+1 && n < runelen(*t)+1) { - *s = 0; - return i+wstrutflen(t)+1; - } - i = runetochar(s, t); - s += i; - n -= i; - t++; - } - *s = 0; - return s-s0; -} diff --git a/sys/src/cmd/unix/drawterm/gui-win32/Makefile b/sys/src/cmd/unix/drawterm/gui-win32/Makefile deleted file mode 100644 index 10547601f..000000000 --- a/sys/src/cmd/unix/drawterm/gui-win32/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libgui.a - -OFILES=\ - alloc.$O\ - cload.$O\ - draw.$O\ - load.$O\ - screen.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/gui-win32/alloc.c b/sys/src/cmd/unix/drawterm/gui-win32/alloc.c deleted file mode 100644 index cc7e97741..000000000 --- a/sys/src/cmd/unix/drawterm/gui-win32/alloc.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -Memimage* -allocmemimage(Rectangle r, ulong chan) -{ - return _allocmemimage(r, chan); -} - -void -freememimage(Memimage *i) -{ - _freememimage(i); -} - -void -memfillcolor(Memimage *i, ulong val) -{ - _memfillcolor(i, val); -} - diff --git a/sys/src/cmd/unix/drawterm/gui-win32/cload.c b/sys/src/cmd/unix/drawterm/gui-win32/cload.c deleted file mode 100644 index 9d658ef85..000000000 --- a/sys/src/cmd/unix/drawterm/gui-win32/cload.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - return _cloadmemimage(i, r, data, ndata); -} diff --git a/sys/src/cmd/unix/drawterm/gui-win32/draw.c b/sys/src/cmd/unix/drawterm/gui-win32/draw.c deleted file mode 100644 index eaac6d58a..000000000 --- a/sys/src/cmd/unix/drawterm/gui-win32/draw.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -void -memimagedraw(Memimage *dst, Rectangle r, Memimage *src, Point sp, Memimage *mask, Point mp, int op) -{ - _memimagedraw(_memimagedrawsetup(dst, r, src, sp, mask, mp, op)); -} - -ulong -pixelbits(Memimage *m, Point p) -{ - return _pixelbits(m, p); -} - -void -memimageinit(void) -{ - _memimageinit(); -} diff --git a/sys/src/cmd/unix/drawterm/gui-win32/load.c b/sys/src/cmd/unix/drawterm/gui-win32/load.c deleted file mode 100644 index 7cca3a6fd..000000000 --- a/sys/src/cmd/unix/drawterm/gui-win32/load.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - return _loadmemimage(i, r, data, ndata); -} diff --git a/sys/src/cmd/unix/drawterm/gui-win32/screen.c b/sys/src/cmd/unix/drawterm/gui-win32/screen.c deleted file mode 100644 index 0a656f27c..000000000 --- a/sys/src/cmd/unix/drawterm/gui-win32/screen.c +++ /dev/null @@ -1,646 +0,0 @@ -#define _WIN32_WINNT 0x0500 -#include <windows.h> - -#undef Rectangle -#define Rectangle _Rectangle - -#include "u.h" -#include "lib.h" -#include "kern/dat.h" -#include "kern/fns.h" -#include "error.h" -#include "user.h" -#include <draw.h> -#include <memdraw.h> -#include "screen.h" -#include "keyboard.h" - -Memimage *gscreen; -Screeninfo screen; - -extern int mousequeue; -static int depth; - -static HINSTANCE inst; -static HWND window; -static HPALETTE palette; -static LOGPALETTE *logpal; -static Lock gdilock; -static BITMAPINFO *bmi; -static HCURSOR hcursor; - -static void winproc(void *); -static LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); -static void paletteinit(void); -static void bmiinit(void); - -static int readybit; -static Rendez rend; - -Point ZP; - -static int -isready(void*a) -{ - return readybit; -} - -void -screeninit(void) -{ - int fmt; - int dx, dy; - - memimageinit(); - if(depth == 0) - depth = GetDeviceCaps(GetDC(NULL), BITSPIXEL); - switch(depth){ - case 32: - screen.dibtype = DIB_RGB_COLORS; - screen.depth = 32; - fmt = XRGB32; - break; - case 24: - screen.dibtype = DIB_RGB_COLORS; - screen.depth = 24; - fmt = RGB24; - break; - case 16: - screen.dibtype = DIB_RGB_COLORS; - screen.depth = 16; - fmt = RGB15; /* [sic] */ - break; - case 8: - default: - screen.dibtype = DIB_PAL_COLORS; - screen.depth = 8; - depth = 8; - fmt = CMAP8; - break; - } - dx = GetDeviceCaps(GetDC(NULL), HORZRES); - dy = GetDeviceCaps(GetDC(NULL), VERTRES); - - gscreen = allocmemimage(Rect(0,0,dx,dy), fmt); - kproc("winscreen", winproc, 0); - ksleep(&rend, isready, 0); -} - -uchar* -attachscreen(Rectangle *r, ulong *chan, int *depth, int *width, int *softscreen, void **X) -{ - *r = gscreen->r; - *chan = gscreen->chan; - *depth = gscreen->depth; - *width = gscreen->width; - *softscreen = 1; - - return gscreen->data->bdata; -} - -void -flushmemscreen(Rectangle r) -{ - screenload(r, gscreen->depth, byteaddr(gscreen, ZP), ZP, - gscreen->width*sizeof(ulong)); -// Sleep(100); -} - -void -screenload(Rectangle r, int depth, uchar *p, Point pt, int step) -{ - int dx, dy, delx; - HDC hdc; - RECT winr; - - if(depth != gscreen->depth) - panic("screenload: bad ldepth"); - - /* - * Sometimes we do get rectangles that are off the - * screen to the negative axes, for example, when - * dragging around a window border in a Move operation. - */ - if(rectclip(&r, gscreen->r) == 0) - return; - - if((step&3) != 0 || ((pt.x*depth)%32) != 0 || ((ulong)p&3) != 0) - panic("screenload: bad params %d %d %ux", step, pt.x, p); - dx = r.max.x - r.min.x; - dy = r.max.y - r.min.y; - - if(dx <= 0 || dy <= 0) - return; - - if(depth == 24) - delx = r.min.x % 4; - else - delx = r.min.x & (31/depth); - - p += (r.min.y-pt.y)*step; - p += ((r.min.x-delx-pt.x)*depth)>>3; - - if(GetWindowRect(window, &winr)==0) - return; - if(rectclip(&r, Rect(0, 0, winr.right-winr.left, winr.bottom-winr.top))==0) - return; - - lock(&gdilock); - - hdc = GetDC(window); - SelectPalette(hdc, palette, 0); - RealizePalette(hdc); - -//FillRect(hdc,(void*)&r, GetStockObject(BLACK_BRUSH)); -//GdiFlush(); -//Sleep(100); - - bmi->bmiHeader.biWidth = (step*8)/depth; - bmi->bmiHeader.biHeight = -dy; /* - => origin upper left */ - - StretchDIBits(hdc, r.min.x, r.min.y, dx, dy, - delx, 0, dx, dy, p, bmi, screen.dibtype, SRCCOPY); - - ReleaseDC(window, hdc); - - GdiFlush(); - - unlock(&gdilock); -} - -static void -winproc(void *a) -{ - WNDCLASS wc; - MSG msg; - - inst = GetModuleHandle(NULL); - - paletteinit(); - bmiinit(); - terminit(); - - wc.style = 0; - wc.lpfnWndProc = WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = inst; - wc.hIcon = LoadIcon(inst, NULL); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = GetStockObject(WHITE_BRUSH); - wc.lpszMenuName = 0; - wc.lpszClassName = L"9pmgraphics"; - RegisterClass(&wc); - - window = CreateWindowEx( - 0, /* extended style */ - L"9pmgraphics", /* class */ - L"drawterm screen", /* caption */ - WS_OVERLAPPEDWINDOW, /* style */ - CW_USEDEFAULT, /* init. x pos */ - CW_USEDEFAULT, /* init. y pos */ - CW_USEDEFAULT, /* init. x size */ - CW_USEDEFAULT, /* init. y size */ - NULL, /* parent window (actually owner window for overlapped)*/ - NULL, /* menu handle */ - inst, /* program handle */ - NULL /* create parms */ - ); - - if(window == nil) - panic("can't make window\n"); - - ShowWindow(window, SW_SHOWDEFAULT); - UpdateWindow(window); - - readybit = 1; - wakeup(&rend); - - screen.reshaped = 0; - - while(GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } -// MessageBox(0, "winproc", "exits", MB_OK); - ExitProcess(0); -} - -int -col(int v, int n) -{ - int i, c; - - c = 0; - for(i = 0; i < 8; i += n) - c |= v << (16-(n+i)); - return c >> 8; -} - - -void -paletteinit(void) -{ - PALETTEENTRY *pal; - int r, g, b, cr, cg, cb, v; - int num, den; - int i, j; - - logpal = mallocz(sizeof(LOGPALETTE) + 256*sizeof(PALETTEENTRY), 1); - if(logpal == nil) - panic("out of memory"); - logpal->palVersion = 0x300; - logpal->palNumEntries = 256; - pal = logpal->palPalEntry; - - for(r=0,i=0; r<4; r++) { - for(v=0; v<4; v++,i+=16){ - for(g=0,j=v-r; g<4; g++) { - for(b=0; b<4; b++,j++){ - den=r; - if(g>den) - den=g; - if(b>den) - den=b; - /* divide check -- pick grey shades */ - if(den==0) - cr=cg=cb=v*17; - else{ - num=17*(4*den+v); - cr=r*num/den; - cg=g*num/den; - cb=b*num/den; - } - pal[i+(j&15)].peRed = cr; - pal[i+(j&15)].peGreen = cg; - pal[i+(j&15)].peBlue = cb; - pal[i+(j&15)].peFlags = 0; - } - } - } - } - palette = CreatePalette(logpal); -} - - -void -getcolor(ulong i, ulong *r, ulong *g, ulong *b) -{ - PALETTEENTRY *pal; - - pal = logpal->palPalEntry; - *r = pal[i].peRed; - *g = pal[i].peGreen; - *b = pal[i].peBlue; -} - -void -bmiinit(void) -{ - ushort *p; - int i; - - bmi = mallocz(sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD), 1); - if(bmi == 0) - panic("out of memory"); - bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmi->bmiHeader.biWidth = 0; - bmi->bmiHeader.biHeight = 0; /* - => origin upper left */ - bmi->bmiHeader.biPlanes = 1; - bmi->bmiHeader.biBitCount = depth; - bmi->bmiHeader.biCompression = BI_RGB; - bmi->bmiHeader.biSizeImage = 0; - bmi->bmiHeader.biXPelsPerMeter = 0; - bmi->bmiHeader.biYPelsPerMeter = 0; - bmi->bmiHeader.biClrUsed = 0; - bmi->bmiHeader.biClrImportant = 0; /* number of important colors: 0 means all */ - - p = (ushort*)bmi->bmiColors; - for(i = 0; i < 256; i++) - p[i] = i; -} - -LRESULT CALLBACK -WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -{ - PAINTSTRUCT paint; - HDC hdc; - LONG x, y, b; - int i; - Rectangle r; - - switch(msg) { - case WM_CREATE: - break; - case WM_SETCURSOR: - /* User set */ - if(hcursor != NULL) { - SetCursor(hcursor); - return 1; - } - return DefWindowProc(hwnd, msg, wparam, lparam); - case WM_MOUSEWHEEL: - if ((int)(wparam & 0xFFFF0000)>0) - b|=8; - else - b|=16; - case WM_MOUSEMOVE: - case WM_LBUTTONUP: - case WM_MBUTTONUP: - case WM_RBUTTONUP: - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - x = LOWORD(lparam); - y = HIWORD(lparam); - b = 0; - if(wparam & MK_LBUTTON) - b = 1; - if(wparam & MK_MBUTTON) - b |= 2; - if(wparam & MK_RBUTTON) { - if(wparam & MK_SHIFT) - b |= 2; - else - b |= 4; - } - lock(&mouse.lk); - i = mouse.wi; - if(mousequeue) { - if(i == mouse.ri || mouse.lastb != b || mouse.trans) { - mouse.wi = (i+1)%Mousequeue; - if(mouse.wi == mouse.ri) - mouse.ri = (mouse.ri+1)%Mousequeue; - mouse.trans = mouse.lastb != b; - } else { - i = (i-1+Mousequeue)%Mousequeue; - } - } else { - mouse.wi = (i+1)%Mousequeue; - mouse.ri = i; - } - mouse.queue[i].xy.x = x; - mouse.queue[i].xy.y = y; - mouse.queue[i].buttons = b; - mouse.queue[i].msec = ticks(); - mouse.lastb = b; - unlock(&mouse.lk); - wakeup(&mouse.r); - break; - - case WM_CHAR: - /* repeat count is lparam & 0xf */ - switch(wparam){ - case '\n': - wparam = '\r'; - break; - case '\r': - wparam = '\n'; - break; - } - kbdputc(kbdq, wparam); - break; - - case WM_SYSKEYUP: - break; - case WM_SYSKEYDOWN: - case WM_KEYDOWN: - switch(wparam) { - case VK_MENU: - kbdputc(kbdq, Kalt); - break; - case VK_INSERT: - kbdputc(kbdq, Kins); - break; - case VK_DELETE: -// kbdputc(kbdq, Kdel); - kbdputc(kbdq, 0x7f); // should have Kdel in keyboard.h - break; - case VK_UP: - kbdputc(kbdq, Kup); - break; - case VK_DOWN: - kbdputc(kbdq, Kdown); - break; - case VK_LEFT: - kbdputc(kbdq, Kleft); - break; - case VK_RIGHT: - kbdputc(kbdq, Kright); - break; - } - break; - - case WM_CLOSE: - DestroyWindow(hwnd); - break; - - case WM_DESTROY: - PostQuitMessage(0); - break; - - case WM_PALETTECHANGED: - if((HWND)wparam == hwnd) - break; - /* fall through */ - case WM_QUERYNEWPALETTE: - hdc = GetDC(hwnd); - SelectPalette(hdc, palette, 0); - if(RealizePalette(hdc) != 0) - InvalidateRect(hwnd, nil, 0); - ReleaseDC(hwnd, hdc); - break; - - case WM_PAINT: - hdc = BeginPaint(hwnd, &paint); - r.min.x = paint.rcPaint.left; - r.min.y = paint.rcPaint.top; - r.max.x = paint.rcPaint.right; - r.max.y = paint.rcPaint.bottom; - flushmemscreen(r); - EndPaint(hwnd, &paint); - break; - case WM_COMMAND: - case WM_SETFOCUS: - case WM_DEVMODECHANGE: - case WM_WININICHANGE: - case WM_INITMENU: - default: - return DefWindowProc(hwnd, msg, wparam, lparam); - } - return 0; -} - -void -mouseset(Point xy) -{ - POINT pt; - - pt.x = xy.x; - pt.y = xy.y; - MapWindowPoints(window, 0, &pt, 1); - SetCursorPos(pt.x, pt.y); -} - -void -setcursor(void) -{ - HCURSOR nh; - int x, y, h, w; - uchar *sp, *cp; - uchar *and, *xor; - - h = GetSystemMetrics(SM_CYCURSOR); - w = (GetSystemMetrics(SM_CXCURSOR)+7)/8; - - and = mallocz(h*w, 1); - memset(and, 0xff, h*w); - xor = mallocz(h*w, 1); - - lock(&cursor.lk); - for(y=0,sp=cursor.set,cp=cursor.clr; y<16; y++) { - for(x=0; x<2; x++) { - and[y*w+x] = ~(*sp|*cp); - xor[y*w+x] = ~*sp & *cp; - cp++; - sp++; - } - } - nh = CreateCursor(inst, -cursor.offset.x, -cursor.offset.y, - GetSystemMetrics(SM_CXCURSOR), h, - and, xor); - if(nh != NULL) { - SetCursor(nh); - if(hcursor != NULL) - DestroyCursor(hcursor); - hcursor = nh; - } - unlock(&cursor.lk); - - free(and); - free(xor); - - PostMessage(window, WM_SETCURSOR, (int)window, 0); -} - -void -cursorarrow(void) -{ - if(hcursor != 0) { - DestroyCursor(hcursor); - hcursor = 0; - } - SetCursor(LoadCursor(0, IDC_ARROW)); - PostMessage(window, WM_SETCURSOR, (int)window, 0); -} - - -void -setcolor(ulong index, ulong red, ulong green, ulong blue) -{ -} - - -uchar* -clipreadunicode(HANDLE h) -{ - Rune *p; - int n; - uchar *q; - - p = GlobalLock(h); - n = wstrutflen(p)+1; - q = malloc(n); - wstrtoutf(q, p, n); - GlobalUnlock(h); - - return q; -} - -uchar * -clipreadutf(HANDLE h) -{ - uchar *p; - - p = GlobalLock(h); - p = strdup(p); - GlobalUnlock(h); - - return p; -} - -char* -clipread(void) -{ - HANDLE h; - uchar *p; - - if(!OpenClipboard(window)) { - oserror(); - return strdup(""); - } - - if((h = GetClipboardData(CF_UNICODETEXT))) - p = clipreadunicode(h); - else if((h = GetClipboardData(CF_TEXT))) - p = clipreadutf(h); - else { - oserror(); - p = strdup(""); - } - - CloseClipboard(); - return p; -} - -int -clipwrite(char *buf) -{ - HANDLE h; - char *p, *e; - Rune *rp; - int n = strlen(buf); - - if(!OpenClipboard(window)) { - oserror(); - return -1; - } - - if(!EmptyClipboard()) { - oserror(); - CloseClipboard(); - return -1; - } - - h = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, (n+1)*sizeof(Rune)); - if(h == NULL) - panic("out of memory"); - rp = GlobalLock(h); - p = buf; - e = p+n; - while(p<e) - p += chartorune(rp++, p); - *rp = 0; - GlobalUnlock(h); - - SetClipboardData(CF_UNICODETEXT, h); - - h = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, n+1); - if(h == NULL) - panic("out of memory"); - p = GlobalLock(h); - memcpy(p, buf, n); - p[n] = 0; - GlobalUnlock(h); - - SetClipboardData(CF_TEXT, h); - - CloseClipboard(); - return n; -} - -int -atlocalconsole(void) -{ - return 1; -} diff --git a/sys/src/cmd/unix/drawterm/gui-win32/wstrtoutf.c b/sys/src/cmd/unix/drawterm/gui-win32/wstrtoutf.c deleted file mode 100644 index 2cdc7fd8b..000000000 --- a/sys/src/cmd/unix/drawterm/gui-win32/wstrtoutf.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -wstrutflen(Rune *s) -{ - int n; - - for(n=0; *s; n+=runelen(*s),s++) - ; - return n; -} - -int -wstrtoutf(char *s, Rune *t, int n) -{ - int i; - char *s0; - - s0 = s; - if(n <= 0) - return wstrutflen(t)+1; - while(*t) { - if(n < UTFmax+1 && n < runelen(*t)+1) { - *s = 0; - return i+wstrutflen(t)+1; - } - i = runetochar(s, t); - s += i; - n -= i; - t++; - } - *s = 0; - return s-s0; -} diff --git a/sys/src/cmd/unix/drawterm/gui-x11/Makefile b/sys/src/cmd/unix/drawterm/gui-x11/Makefile deleted file mode 100644 index f6129d0be..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libgui.a - -OFILES=\ - x11.$O\ - keysym2ucs-x11.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - diff --git a/sys/src/cmd/unix/drawterm/gui-x11/alloc.c b/sys/src/cmd/unix/drawterm/gui-x11/alloc.c deleted file mode 100644 index 8053c4488..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/alloc.c +++ /dev/null @@ -1,204 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include "xmem.h" - -/* perfect approximation to NTSC = .299r+.587g+.114b when 0 ≤ r,g,b < 256 */ -#define RGB2K(r,g,b) ((156763*(r)+307758*(g)+59769*(b))>>19) - -Memimage* -xallocmemimage(Rectangle r, ulong chan, int pmid) -{ - Memimage *m; - Xmem *xm; - XImage *xi; - int offset; - int d; - - m = _allocmemimage(r, chan); - if(chan != GREY1 && chan != xscreenchan) - return m; - - d = m->depth; - xm = mallocz(sizeof(Xmem), 1); - if(pmid != PMundef) - xm->pmid = pmid; - else - xm->pmid = XCreatePixmap(xdisplay, xscreenid, Dx(r), Dy(r), (d==32) ? 24 : d); - - if(m->depth == 24) - offset = r.min.x&(4-1); - else - offset = r.min.x&(31/m->depth); - r.min.x -= offset; - - assert(wordsperline(r, m->depth) <= m->width); - - xi = XCreateImage(xdisplay, xvis, m->depth==32?24:m->depth, ZPixmap, 0, - (char*)m->data->bdata, Dx(r), Dy(r), 32, m->width*sizeof(ulong)); - - if(xi == nil){ - _freememimage(m); - return nil; - } - - xm->xi = xi; - xm->pc = getcallerpc(&r); - xm->r = r; - - /* - * Set the parameters of the XImage so its memory looks exactly like a - * Memimage, so we can call _memimagedraw on the same data. All frame - * buffers we've seen, and Plan 9's graphics code, require big-endian - * bits within bytes, but little endian byte order within pixels. - */ - xi->bitmap_unit = m->depth < 8 || m->depth == 24 ? 8 : m->depth; - xi->byte_order = LSBFirst; - xi->bitmap_bit_order = MSBFirst; - xi->bitmap_pad = 32; - xm->r = Rect(0,0,0,0); - XInitImage(xi); - XFlush(xdisplay); - - m->X = xm; - return m; -} - -Memimage* -allocmemimage(Rectangle r, ulong chan) -{ - return xallocmemimage(r, chan, PMundef); -} - -void -freememimage(Memimage *m) -{ - Xmem *xm; - - if(m == nil) - return; - - if(m->data->ref == 1){ - if((xm = m->X) != nil){ - if(xm->xi){ - xm->xi->data = nil; - XFree(xm->xi); - } - XFreePixmap(xdisplay, xm->pmid); - free(xm); - m->X = nil; - } - } - _freememimage(m); -} - -void -memfillcolor(Memimage *m, ulong val) -{ - _memfillcolor(m, val); - if(m->X){ - if((val & 0xFF) == 0xFF) - xfillcolor(m, m->r, _rgbatoimg(m, val)); - else - putXdata(m, m->r); - } -} - -static void -addrect(Rectangle *rp, Rectangle r) -{ - if(rp->min.x >= rp->max.x) - *rp = r; - else - combinerect(rp, r); -} - -XImage* -getXdata(Memimage *m, Rectangle r) -{ - uchar *p; - int x, y; - Xmem *xm; - Point xdelta, delta; - Point tp; - - xm = m->X; - if(xm == nil) - return nil; - - assert(xm != nil && xm->xi != nil); - - if(xm->dirty == 0) - return xm->xi; - - r = xm->dirtyr; - if(Dx(r)==0 || Dy(r)==0) - return xm->xi; - - delta = subpt(r.min, m->r.min); - tp = xm->r.min; /* avoid unaligned access on digital unix */ - xdelta = subpt(r.min, tp); - - XGetSubImage(xdisplay, xm->pmid, delta.x, delta.y, Dx(r), Dy(r), - AllPlanes, ZPixmap, xm->xi, xdelta.x, xdelta.y); - - if(xtblbit && m->chan == CMAP8) - for(y=r.min.y; y<r.max.y; y++) - for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++) - *p = x11toplan9[*p]; - - xm->dirty = 0; - xm->dirtyr = Rect(0,0,0,0); - return xm->xi; -} - -void -putXdata(Memimage *m, Rectangle r) -{ - Xmem *xm; - XImage *xi; - GC g; - Point xdelta, delta; - Point tp; - int x, y; - uchar *p; - - xm = m->X; - if(xm == nil) - return; - - assert(xm != nil); - assert(xm->xi != nil); - - xi = xm->xi; - - g = (m->chan == GREY1) ? xgccopy0 : xgccopy; - - delta = subpt(r.min, m->r.min); - tp = xm->r.min; /* avoid unaligned access on digital unix */ - xdelta = subpt(r.min, tp); - - if(xtblbit && m->chan == CMAP8) - for(y=r.min.y; y<r.max.y; y++) - for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++) - *p = plan9tox11[*p]; - - XPutImage(xdisplay, xm->pmid, g, xi, xdelta.x, xdelta.y, delta.x, delta.y, Dx(r), Dy(r)); - - if(xtblbit && m->chan == CMAP8) - for(y=r.min.y; y<r.max.y; y++) - for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++) - *p = x11toplan9[*p]; -} - -void -dirtyXdata(Memimage *m, Rectangle r) -{ - Xmem *xm; - - if((xm = m->X) != nil){ - xm->dirty = 1; - addrect(&xm->dirtyr, r); - } -} diff --git a/sys/src/cmd/unix/drawterm/gui-x11/cload.c b/sys/src/cmd/unix/drawterm/gui-x11/cload.c deleted file mode 100644 index 92a5b8027..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/cload.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include "xmem.h" - -int -cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - int n; - - n = _cloadmemimage(i, r, data, ndata); - if(n > 0 && i->X) - putXdata(i, r); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/gui-x11/draw.c b/sys/src/cmd/unix/drawterm/gui-x11/draw.c deleted file mode 100644 index e736738d2..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/draw.c +++ /dev/null @@ -1,186 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include "xmem.h" - -void xfillcolor(Memimage*, Rectangle, ulong); -static int xdraw(Memdrawparam*); - -int xgcfillcolor = 0; -int xgcfillcolor0 = 0; -int xgczeropm = 0; -int xgczeropm0 = 0; -int xgcsimplecolor = 0; -int xgcsimplecolor0 = 0; -int xgcsimplepm = 0; -int xgcsimplepm0 = 0; -int xgcreplsrctile = 0; -int xgcreplsrctile0 = 0; - -void -memimageinit(void) -{ - static int didinit = 0; - - if(didinit) - return; - - didinit = 1; - _memimageinit(); - - xfillcolor(memblack, memblack->r, 0); - xfillcolor(memwhite, memwhite->r, 1); -} - -void -memimagedraw(Memimage *dst, Rectangle r, Memimage *src, Point sp, Memimage *mask, Point mp, int op) -{ - Memdrawparam *par; - - if((par = _memimagedrawsetup(dst, r, src, sp, mask, mp, op)) == nil) - return; - _memimagedraw(par); - if(!xdraw(par)) - putXdata(dst, par->r); -} - -void -xfillcolor(Memimage *m, Rectangle r, ulong v) -{ - GC gc; - Xmem *dxm; - - dxm = m->X; - assert(dxm != nil); - r = rectsubpt(r, m->r.min); - - if(m->chan == GREY1){ - gc = xgcfill0; - if(xgcfillcolor0 != v){ - XSetForeground(xdisplay, gc, v); - xgcfillcolor0 = v; - } - }else{ - if(m->chan == CMAP8 && xtblbit) - v = plan9tox11[v]; - - gc = xgcfill; - if(xgcfillcolor != v){ - XSetForeground(xdisplay, gc, v); - xgcfillcolor = v; - } - } - XFillRectangle(xdisplay, dxm->pmid, gc, r.min.x, r.min.y, Dx(r), Dy(r)); -} - -static int -xdraw(Memdrawparam *par) -{ - int dy, dx; - unsigned m; - Memimage *src, *dst, *mask; - Xmem *dxm, *sxm, *mxm; - GC gc; - Rectangle r, sr, mr; - ulong sdval; - - dx = Dx(par->r); - dy = Dy(par->r); - src = par->src; - dst = par->dst; - mask = par->mask; - r = par->r; - sr = par->sr; - mr = par->mr; - sdval = par->sdval; - -return 0; - if((dxm = dst->X) == nil) - return 0; - - /* - * If we have an opaque mask and source is one opaque pixel we can convert to the - * destination format and just XFillRectangle. - */ - m = Simplesrc|Simplemask|Fullmask; - if((par->state&m)==m){ - xfillcolor(dst, r, sdval); - dirtyXdata(dst, par->r); - return 1; - } - - /* - * If no source alpha, an opaque mask, we can just copy the - * source onto the destination. If the channels are the same and - * the source is not replicated, XCopyArea suffices. - */ - m = Simplemask|Fullmask; - if((par->state&(m|Replsrc))==m && src->chan == dst->chan && src->X){ - sxm = src->X; - r = rectsubpt(r, dst->r.min); - sr = rectsubpt(sr, src->r.min); - if(dst->chan == GREY1) - gc = xgccopy0; - else - gc = xgccopy; - XCopyArea(xdisplay, sxm->pmid, dxm->pmid, gc, - sr.min.x, sr.min.y, dx, dy, r.min.x, r.min.y); - dirtyXdata(dst, par->r); - return 1; - } - - /* - * If no source alpha, a 1-bit mask, and a simple source - * we can just copy through the mask onto the destination. - */ - if(dst->X && mask->X && !(mask->flags&Frepl) - && mask->chan == GREY1 && (par->state&Simplesrc)){ - Point p; - - mxm = mask->X; - r = rectsubpt(r, dst->r.min); - mr = rectsubpt(mr, mask->r.min); - p = subpt(r.min, mr.min); - if(dst->chan == GREY1){ - gc = xgcsimplesrc0; - if(xgcsimplecolor0 != sdval){ - XSetForeground(xdisplay, gc, sdval); - xgcsimplecolor0 = sdval; - } - if(xgcsimplepm0 != mxm->pmid){ - XSetStipple(xdisplay, gc, mxm->pmid); - xgcsimplepm0 = mxm->pmid; - } - }else{ - /* somehow this doesn't work on rob's mac - gc = xgcsimplesrc; - if(dst->chan == CMAP8 && xtblbit) - sdval = plan9tox11[sdval]; - - if(xgcsimplecolor != sdval){ - XSetForeground(xdisplay, gc, sdval); - xgcsimplecolor = sdval; - } - if(xgcsimplepm != mxm->pmid){ - XSetStipple(xdisplay, gc, mxm->pmid); - xgcsimplepm = mxm->pmid; - } - */ - return 0; - } - XSetTSOrigin(xdisplay, gc, p.x, p.y); - XFillRectangle(xdisplay, dxm->pmid, gc, r.min.x, r.min.y, dx, dy); - dirtyXdata(dst, par->r); - return 1; - } - return 0; -} - -ulong -pixelbits(Memimage *m, Point p) -{ - if(m->X) - getXdata(m, Rect(p.x, p.y, p.x+1, p.y+1)); - return _pixelbits(m, p); -} diff --git a/sys/src/cmd/unix/drawterm/gui-x11/keysym2ucs-x11.c b/sys/src/cmd/unix/drawterm/gui-x11/keysym2ucs-x11.c deleted file mode 100644 index b96d9624b..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/keysym2ucs-x11.c +++ /dev/null @@ -1,857 +0,0 @@ -/* $XFree86: xc/programs/xterm/keysym2ucs.c,v 1.5 2001/06/18 19:09:26 dickey Exp $ - * This module converts keysym values into the corresponding ISO 10646 - * (UCS, Unicode) values. - * - * The array keysymtab[] contains pairs of X11 keysym values for graphical - * characters and the corresponding Unicode value. The function - * keysym2ucs() maps a keysym onto a Unicode value using a binary search, - * therefore keysymtab[] must remain SORTED by keysym value. - * - * The keysym -> UTF-8 conversion will hopefully one day be provided - * by Xlib via XmbLookupString() and should ideally not have to be - * done in X applications. But we are not there yet. - * - * We allow to represent any UCS character in the range U-00000000 to - * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff. - * This admittedly does not cover the entire 31-bit space of UCS, but - * it does cover all of the characters up to U-10FFFF, which can be - * represented by UTF-16, and more, and it is very unlikely that higher - * UCS codes will ever be assigned by ISO. So to get Unicode character - * U+ABCD you can directly use keysym 0x0100abcd. - * - * NOTE: The comments in the table below contain the actual character - * encoded in UTF-8, so for viewing and editing best use an editor in - * UTF-8 mode. - * - * Author: Markus G. Kuhn <mkuhn@acm.org>, University of Cambridge, April 2001 - * - * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing - * an initial draft of the mapping table. - * - * This software is in the public domain. Share and enjoy! - * - * AUTOMATICALLY GENERATED FILE, DO NOT EDIT !!! (unicode/convmap.pl) - */ - -#ifndef KEYSYM2UCS_INCLUDED - -#include "keysym2ucs.h" -#define VISIBLE /* */ - -#else - -#define VISIBLE static - -#endif - -static struct codepair { - unsigned short keysym; - unsigned short ucs; -} keysymtab[] = { - { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */ - { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ - { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */ - { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ - { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */ - { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */ - { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */ - { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ - { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ - { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ - { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */ - { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */ - { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */ - { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */ - { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ - { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */ - { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ - { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */ - { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */ - { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */ - { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ - { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */ - { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ - { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ - { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */ - { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */ - { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ - { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ - { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */ - { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ - { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */ - { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */ - { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */ - { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ - { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ - { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ - { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ - { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */ - { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ - { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */ - { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */ - { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ - { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ - { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ - { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */ - { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */ - { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */ - { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */ - { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */ - { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */ - { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ - { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */ - { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */ - { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ - { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ - { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */ - { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */ - { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ - { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ - { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ - { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */ - { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ - { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ - { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ - { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ - { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */ - { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ - { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */ - { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ - { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */ - { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ - { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ - { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ - { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */ - { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ - { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */ - { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */ - { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */ - { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */ - { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ - { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */ - { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ - { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */ - { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */ - { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */ - { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ - { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */ - { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */ - { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ - { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */ - { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */ - { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ - { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */ - { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */ - { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */ - { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */ - { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */ - { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ - { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */ - { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */ - { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ - { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ - { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ - { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ - { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */ - { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ - { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */ - { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */ - { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ - { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */ - { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */ - { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ - { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */ - { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */ - { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ - { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ - { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ - { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */ - { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */ - { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ - { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ - { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */ - { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */ - { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */ - { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */ - { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */ - { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ - { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ - { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ - { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ - { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ - { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */ - { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ - { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ - { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ - { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ - { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */ - { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */ - { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ - { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ - { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ - { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ - { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */ - { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ - { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */ - { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ - { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */ - { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */ - { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ - { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ - { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ - { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ - { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ - { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ - { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */ - { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ - { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */ - { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ - { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ - { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ - { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ - { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ - { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ - { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ - { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ - { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ - { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ - { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ - { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ - { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ - { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ - { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ - { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ - { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ - { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ - { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ - { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */ - { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ - { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */ - { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */ - { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */ - { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */ - { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */ - { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */ - { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ - { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */ - { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ - { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ - { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ - { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */ - { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ - { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */ - { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ - { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */ - { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */ - { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ - { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ - { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ - { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ - { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ - { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */ - { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ - { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ - { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */ - { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ - { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ - { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ - { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */ - { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */ - { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */ - { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */ - { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */ - { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */ - { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */ - { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */ - { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */ - { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */ - { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */ - { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */ - { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */ - { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */ - { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */ - { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */ - { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */ - { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */ - { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */ - { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */ - { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */ - { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */ - { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */ - { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */ - { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ - { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */ - { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ - { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */ - { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */ - { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */ - { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */ - { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */ - { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */ - { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */ - { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ - { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ - { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */ - { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ - { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */ - { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ - { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ - { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ - { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ - { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ - { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ - { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */ - { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */ - { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */ - { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */ - { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ - { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ - { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ - { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ - { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ - { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */ - { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ - { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */ - { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ - { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ - { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ - { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ - { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ - { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ - { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ - { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ - { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */ - { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */ - { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */ - { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */ - { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ - { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ - { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ - { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */ - { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */ - { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ - { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ - { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */ - { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ - { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ - { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */ - { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ - { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */ - { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ - { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ - { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ - { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ - { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ - { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ - { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */ - { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ - { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ - { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ - { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ - { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ - { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */ - { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ - { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ - { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ - { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ - { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ - { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ - { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ - { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ - { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */ - { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ - { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ - { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ - { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ - { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ - { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ - { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ - { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ - { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ - { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ - { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ - { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ - { 0x07a5, 0x03aa }, /* Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ - { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */ - { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */ - { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ - { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */ - { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */ - { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ - { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ - { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ - { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ - { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ - { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ - { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ - { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */ - { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */ - { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ - { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ - { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */ - { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ - { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */ - { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ - { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ - { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ - { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ - { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ - { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ - { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ - { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ - { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ - { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ - { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */ - { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ - { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ - { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ - { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ - { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ - { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ - { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */ - { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ - { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ - { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ - { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ - { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ - { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ - { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ - { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ - { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ - { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ - { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ - { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ - { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ - { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ - { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ - { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ - { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ - { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ - { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ - { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */ - { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */ - { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ - { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */ - { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */ - { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */ - { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ - { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ - { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ - { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ - { 0x08a1, 0x23b7 }, /* leftradical ⎷ ??? */ - { 0x08a2, 0x250c }, /* topleftradical ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ - { 0x08a3, 0x2500 }, /* horizconnector ─ BOX DRAWINGS LIGHT HORIZONTAL */ - { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ - { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ - { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ - { 0x08a7, 0x23a1 }, /* topleftsqbracket ⎡ ??? */ - { 0x08a8, 0x23a3 }, /* botleftsqbracket ⎣ ??? */ - { 0x08a9, 0x23a4 }, /* toprightsqbracket ⎤ ??? */ - { 0x08aa, 0x23a6 }, /* botrightsqbracket ⎦ ??? */ - { 0x08ab, 0x239b }, /* topleftparens ⎛ ??? */ - { 0x08ac, 0x239d }, /* botleftparens ⎝ ??? */ - { 0x08ad, 0x239e }, /* toprightparens ⎞ ??? */ - { 0x08ae, 0x23a0 }, /* botrightparens ⎠ ??? */ - { 0x08af, 0x23a8 }, /* leftmiddlecurlybrace ⎨ ??? */ - { 0x08b0, 0x23ac }, /* rightmiddlecurlybrace ⎬ ??? */ -/* 0x08b1 topleftsummation ? ??? */ -/* 0x08b2 botleftsummation ? ??? */ -/* 0x08b3 topvertsummationconnector ? ??? */ -/* 0x08b4 botvertsummationconnector ? ??? */ -/* 0x08b5 toprightsummation ? ??? */ -/* 0x08b6 botrightsummation ? ??? */ -/* 0x08b7 rightmiddlesummation ? ??? */ - { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ - { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ - { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ - { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ - { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ - { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */ - { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ - { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ - { 0x08c8, 0x223c }, /* approximate ∼ TILDE OPERATOR */ - { 0x08c9, 0x2243 }, /* similarequal ≃ ASYMPTOTICALLY EQUAL TO */ - { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ - { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ - { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ - { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ - { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ - { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ - { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ - { 0x08dd, 0x222a }, /* union ∪ UNION */ - { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ - { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ - { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ - { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */ - { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */ - { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ - { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ - { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ -/* 0x09df blank ? ??? */ - { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */ - { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */ - { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */ - { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */ - { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */ - { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */ - { 0x09e8, 0x2424 }, /* nl  SYMBOL FOR NEWLINE */ - { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */ - { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ - { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */ - { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ - { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */ - { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ - { 0x09ef, 0x23ba }, /* horizlinescan1 ⎺ HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */ - { 0x09f0, 0x23bb }, /* horizlinescan3 ⎻ HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */ - { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ - { 0x09f2, 0x23bc }, /* horizlinescan7 ⎼ HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */ - { 0x09f3, 0x23bd }, /* horizlinescan9 ⎽ HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */ - { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ - { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ - { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ - { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ - { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ - { 0x0aa1, 0x2003 }, /* emspace EM SPACE */ - { 0x0aa2, 0x2002 }, /* enspace EN SPACE */ - { 0x0aa3, 0x2004 }, /* em3space THREE-PER-EM SPACE */ - { 0x0aa4, 0x2005 }, /* em4space FOUR-PER-EM SPACE */ - { 0x0aa5, 0x2007 }, /* digitspace FIGURE SPACE */ - { 0x0aa6, 0x2008 }, /* punctspace PUNCTUATION SPACE */ - { 0x0aa7, 0x2009 }, /* thinspace THIN SPACE */ - { 0x0aa8, 0x200a }, /* hairspace HAIR SPACE */ - { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ - { 0x0aaa, 0x2013 }, /* endash – EN DASH */ -/* 0x0aac signifblank ? ??? */ - { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ - { 0x0aaf, 0x2025 }, /* doubbaselinedot ‥ TWO DOT LEADER */ - { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */ - { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */ - { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */ - { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */ - { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */ - { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */ - { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */ - { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */ - { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */ - { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ - { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ -/* 0x0abd decimalpoint ? ??? */ - { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */ -/* 0x0abf marker ? ??? */ - { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */ - { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */ - { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */ - { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */ - { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */ - { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ -/* 0x0acb trademarkincircle ? ??? */ - { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */ - { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */ - { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */ - { 0x0acf, 0x25af }, /* emopenrectangle ▯ WHITE VERTICAL RECTANGLE */ - { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ - { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ - { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ - { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */ - { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ - { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ - { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ - { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */ -/* 0x0ada hexagram ? ??? */ - { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */ - { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */ - { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */ - { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */ - { 0x0adf, 0x25ae }, /* emfilledrect ▮ BLACK VERTICAL RECTANGLE */ - { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */ - { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */ - { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */ - { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */ - { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */ - { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ - { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ - { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */ - { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */ - { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */ - { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ - { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ - { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ - { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ - { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ - { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ - { 0x0af1, 0x2020 }, /* dagger † DAGGER */ - { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ - { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ - { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ - { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ - { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */ - { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ - { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ - { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ - { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ - { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */ - { 0x0afc, 0x2038 }, /* caret ‸ CARET */ - { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ - { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ -/* 0x0aff cursor ? ??? */ - { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ - { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ - { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ - { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ - { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ - { 0x0bc2, 0x22a5 }, /* downtack ⊥ UP TACK */ - { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ - { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ - { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ - { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ - { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD */ - { 0x0bce, 0x22a4 }, /* uptack ⊤ DOWN TACK */ - { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ - { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ - { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ - { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ - { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ - { 0x0bdc, 0x22a2 }, /* lefttack ⊢ RIGHT TACK */ - { 0x0bfc, 0x22a3 }, /* righttack ⊣ LEFT TACK */ - { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ - { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ - { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ - { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ - { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ - { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ - { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ - { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ - { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ - { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ - { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ - { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ - { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ - { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ - { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ - { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ - { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ - { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ - { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ - { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ - { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ - { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ - { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ - { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ - { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ - { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ - { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ - { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ - { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ - { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ - { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ - { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ - { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ - { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ - { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ - { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ - { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ - { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ - { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ - { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ - { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ - { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ - { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ - { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ - { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ - { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ - { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ - { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ - { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ - { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ - { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ - { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ - { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ - { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ - { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ - { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ - { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ - { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ - { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ - { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ - { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ - { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ - { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ - { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ - { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ - { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ - { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ - { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ - { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ - { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ - { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ - { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ - { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ - { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ - { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ - { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ - { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ - { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ - { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ - { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ - { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ - { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ - { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ - { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ - { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ - { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ -/* 0x0dde Thai_maihanakat_maitho ? ??? */ - { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ - { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ - { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ - { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ - { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ - { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ - { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ - { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ - { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ - { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ - { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ - { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ - { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ - { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ - { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ - { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ - { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ - { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ - { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ - { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ - { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ - { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ - { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ - { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ - { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ - { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ - { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ - { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ - { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ - { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ - { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ - { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ - { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ - { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ - { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ - { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ - { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ - { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ - { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ - { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ - { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ - { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ - { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ - { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ - { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ - { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ - { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ - { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ - { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ - { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ - { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ - { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ - { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ - { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ - { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ - { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ - { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ - { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ - { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ - { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ - { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ - { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ - { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ - { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ - { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ - { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ - { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ - { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ - { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ - { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ - { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ - { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ - { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ - { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ - { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ - { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ - { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ - { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ - { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ - { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ - { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ - { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ - { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ - { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ - { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ - { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ - { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ - { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ - { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ - { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ - { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ - { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ - { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ - { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ - { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ - { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ - { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ - { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ - { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ - { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ - { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ - { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ - { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ - { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ - { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ - { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ - { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ - { 0x0ef3, 0x3181 }, /* Hangul_KkogjiDalrinIeung ㆁ HANGUL LETTER YESIEUNG */ - { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ - { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ - { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ - { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ - { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ - { 0x0ef9, 0x11f0 }, /* Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */ - { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ - { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ - { 0x13a4, 0x20ac }, /* Euro € EURO SIGN */ - { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ - { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ - { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ - { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ -}; - -VISIBLE -long keysym2ucs(KeySym keysym) -{ - int min = 0; - int max = sizeof(keysymtab) / sizeof(struct codepair) - 1; - int mid; - - /* first check for Latin-1 characters (1:1 mapping) */ - if ((keysym >= 0x0020 && keysym <= 0x007e) || - (keysym >= 0x00a0 && keysym <= 0x00ff)) - return keysym; - - /* also check for directly encoded 24-bit UCS characters */ - if ((keysym & 0xff000000) == 0x01000000) - return keysym & 0x00ffffff; - - /* binary search in table */ - while (max >= min) { - mid = (min + max) / 2; - if (keysymtab[mid].keysym < keysym) - min = mid + 1; - else if (keysymtab[mid].keysym > keysym) - max = mid - 1; - else { - /* found it */ - return keysymtab[mid].ucs; - } - } - - /* no matching Unicode value found */ - return -1; -} diff --git a/sys/src/cmd/unix/drawterm/gui-x11/keysym2ucs.h b/sys/src/cmd/unix/drawterm/gui-x11/keysym2ucs.h deleted file mode 100644 index 1f23ac662..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/keysym2ucs.h +++ /dev/null @@ -1,9 +0,0 @@ -/* $XFree86: xc/programs/xterm/keysym2ucs.h,v 1.1 1999/06/12 15:37:18 dawes Exp $ */ -/* - * This module converts keysym values into the corresponding ISO 10646-1 - * (UCS, Unicode) values. - */ - -#include <X11/X.h> - -long keysym2ucs(KeySym keysym); diff --git a/sys/src/cmd/unix/drawterm/gui-x11/ksym2utf.h b/sys/src/cmd/unix/drawterm/gui-x11/ksym2utf.h deleted file mode 100644 index cca43bdd5..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/ksym2utf.h +++ /dev/null @@ -1,754 +0,0 @@ -static ulong -ksym2utf[] = { - [0x01a1] 0x0104, - [0x01a2] 0x02d8, - [0x01a3] 0x0141, - [0x01a5] 0x013d, - [0x01a6] 0x015a, - [0x01a9] 0x0160, - [0x01aa] 0x015e, - [0x01ab] 0x0164, - [0x01ac] 0x0179, - [0x01ae] 0x017d, - [0x01af] 0x017b, - [0x01b1] 0x0105, - [0x01b2] 0x02db, - [0x01b3] 0x0142, - [0x01b5] 0x013e, - [0x01b6] 0x015b, - [0x01b7] 0x02c7, - [0x01b9] 0x0161, - [0x01ba] 0x015f, - [0x01bb] 0x0165, - [0x01bc] 0x017a, - [0x01bd] 0x02dd, - [0x01be] 0x017e, - [0x01bf] 0x017c, - [0x01c0] 0x0154, - [0x01c3] 0x0102, - [0x01c5] 0x0139, - [0x01c6] 0x0106, - [0x01c8] 0x010c, - [0x01ca] 0x0118, - [0x01cc] 0x011a, - [0x01cf] 0x010e, - [0x01d0] 0x0110, - [0x01d1] 0x0143, - [0x01d2] 0x0147, - [0x01d5] 0x0150, - [0x01d8] 0x0158, - [0x01d9] 0x016e, - [0x01db] 0x0170, - [0x01de] 0x0162, - [0x01e0] 0x0155, - [0x01e3] 0x0103, - [0x01e5] 0x013a, - [0x01e6] 0x0107, - [0x01e8] 0x010d, - [0x01ea] 0x0119, - [0x01ec] 0x011b, - [0x01ef] 0x010f, - [0x01f0] 0x0111, - [0x01f1] 0x0144, - [0x01f2] 0x0148, - [0x01f5] 0x0151, - [0x01f8] 0x0159, - [0x01f9] 0x016f, - [0x01fb] 0x0171, - [0x01fe] 0x0163, - [0x01ff] 0x02d9, - [0x02a1] 0x0126, - [0x02a6] 0x0124, - [0x02a9] 0x0130, - [0x02ab] 0x011e, - [0x02ac] 0x0134, - [0x02b1] 0x0127, - [0x02b6] 0x0125, - [0x02b9] 0x0131, - [0x02bb] 0x011f, - [0x02bc] 0x0135, - [0x02c5] 0x010a, - [0x02c6] 0x0108, - [0x02d5] 0x0120, - [0x02d8] 0x011c, - [0x02dd] 0x016c, - [0x02de] 0x015c, - [0x02e5] 0x010b, - [0x02e6] 0x0109, - [0x02f5] 0x0121, - [0x02f8] 0x011d, - [0x02fd] 0x016d, - [0x02fe] 0x015d, - [0x03a2] 0x0138, - [0x03a3] 0x0156, - [0x03a5] 0x0128, - [0x03a6] 0x013b, - [0x03aa] 0x0112, - [0x03ab] 0x0122, - [0x03ac] 0x0166, - [0x03b3] 0x0157, - [0x03b5] 0x0129, - [0x03b6] 0x013c, - [0x03ba] 0x0113, - [0x03bb] 0x0123, - [0x03bc] 0x0167, - [0x03bd] 0x014a, - [0x03bf] 0x014b, - [0x03c0] 0x0100, - [0x03c7] 0x012e, - [0x03cc] 0x0116, - [0x03cf] 0x012a, - [0x03d1] 0x0145, - [0x03d2] 0x014c, - [0x03d3] 0x0136, - [0x03d9] 0x0172, - [0x03dd] 0x0168, - [0x03de] 0x016a, - [0x03e0] 0x0101, - [0x03e7] 0x012f, - [0x03ec] 0x0117, - [0x03ef] 0x012b, - [0x03f1] 0x0146, - [0x03f2] 0x014d, - [0x03f3] 0x0137, - [0x03f9] 0x0173, - [0x03fd] 0x0169, - [0x03fe] 0x016b, - [0x047e] 0x203e, - [0x04a1] 0x3002, - [0x04a2] 0x300c, - [0x04a3] 0x300d, - [0x04a4] 0x3001, - [0x04a5] 0x30fb, - [0x04a6] 0x30f2, - [0x04a7] 0x30a1, - [0x04a8] 0x30a3, - [0x04a9] 0x30a5, - [0x04aa] 0x30a7, - [0x04ab] 0x30a9, - [0x04ac] 0x30e3, - [0x04ad] 0x30e5, - [0x04ae] 0x30e7, - [0x04af] 0x30c3, - [0x04b0] 0x30fc, - [0x04b1] 0x30a2, - [0x04b2] 0x30a4, - [0x04b3] 0x30a6, - [0x04b4] 0x30a8, - [0x04b5] 0x30aa, - [0x04b6] 0x30ab, - [0x04b7] 0x30ad, - [0x04b8] 0x30af, - [0x04b9] 0x30b1, - [0x04ba] 0x30b3, - [0x04bb] 0x30b5, - [0x04bc] 0x30b7, - [0x04bd] 0x30b9, - [0x04be] 0x30bb, - [0x04bf] 0x30bd, - [0x04c0] 0x30bf, - [0x04c1] 0x30c1, - [0x04c2] 0x30c4, - [0x04c3] 0x30c6, - [0x04c4] 0x30c8, - [0x04c5] 0x30ca, - [0x04c6] 0x30cb, - [0x04c7] 0x30cc, - [0x04c8] 0x30cd, - [0x04c9] 0x30ce, - [0x04ca] 0x30cf, - [0x04cb] 0x30d2, - [0x04cc] 0x30d5, - [0x04cd] 0x30d8, - [0x04ce] 0x30db, - [0x04cf] 0x30de, - [0x04d0] 0x30df, - [0x04d1] 0x30e0, - [0x04d2] 0x30e1, - [0x04d3] 0x30e2, - [0x04d4] 0x30e4, - [0x04d5] 0x30e6, - [0x04d6] 0x30e8, - [0x04d7] 0x30e9, - [0x04d8] 0x30ea, - [0x04d9] 0x30eb, - [0x04da] 0x30ec, - [0x04db] 0x30ed, - [0x04dc] 0x30ef, - [0x04dd] 0x30f3, - [0x04de] 0x309b, - [0x04df] 0x309c, - [0x05ac] 0x060c, - [0x05bb] 0x061b, - [0x05bf] 0x061f, - [0x05c1] 0x0621, - [0x05c2] 0x0622, - [0x05c3] 0x0623, - [0x05c4] 0x0624, - [0x05c5] 0x0625, - [0x05c6] 0x0626, - [0x05c7] 0x0627, - [0x05c8] 0x0628, - [0x05c9] 0x0629, - [0x05ca] 0x062a, - [0x05cb] 0x062b, - [0x05cc] 0x062c, - [0x05cd] 0x062d, - [0x05ce] 0x062e, - [0x05cf] 0x062f, - [0x05d0] 0x0630, - [0x05d1] 0x0631, - [0x05d2] 0x0632, - [0x05d3] 0x0633, - [0x05d4] 0x0634, - [0x05d5] 0x0635, - [0x05d6] 0x0636, - [0x05d7] 0x0637, - [0x05d8] 0x0638, - [0x05d9] 0x0639, - [0x05da] 0x063a, - [0x05e0] 0x0640, - [0x05e1] 0x0641, - [0x05e2] 0x0642, - [0x05e3] 0x0643, - [0x05e4] 0x0644, - [0x05e5] 0x0645, - [0x05e6] 0x0646, - [0x05e7] 0x0647, - [0x05e8] 0x0648, - [0x05e9] 0x0649, - [0x05ea] 0x064a, - [0x05eb] 0x064b, - [0x05ec] 0x064c, - [0x05ed] 0x064d, - [0x05ee] 0x064e, - [0x05ef] 0x064f, - [0x05f0] 0x0650, - [0x05f1] 0x0651, - [0x05f2] 0x0652, - [0x06a1] 0x0452, - [0x06a2] 0x0453, - [0x06a3] 0x0451, - [0x06a4] 0x0454, - [0x06a5] 0x0455, - [0x06a6] 0x0456, - [0x06a7] 0x0457, - [0x06a8] 0x0458, - [0x06a9] 0x0459, - [0x06aa] 0x045a, - [0x06ab] 0x045b, - [0x06ac] 0x045c, - [0x06ae] 0x045e, - [0x06af] 0x045f, - [0x06b0] 0x2116, - [0x06b1] 0x0402, - [0x06b2] 0x0403, - [0x06b3] 0x0401, - [0x06b4] 0x0404, - [0x06b5] 0x0405, - [0x06b6] 0x0406, - [0x06b7] 0x0407, - [0x06b8] 0x0408, - [0x06b9] 0x0409, - [0x06ba] 0x040a, - [0x06bb] 0x040b, - [0x06bc] 0x040c, - [0x06be] 0x040e, - [0x06bf] 0x040f, - [0x06c0] 0x044e, - [0x06c1] 0x0430, - [0x06c2] 0x0431, - [0x06c3] 0x0446, - [0x06c4] 0x0434, - [0x06c5] 0x0435, - [0x06c6] 0x0444, - [0x06c7] 0x0433, - [0x06c8] 0x0445, - [0x06c9] 0x0438, - [0x06ca] 0x0439, - [0x06cb] 0x043a, - [0x06cc] 0x043b, - [0x06cd] 0x043c, - [0x06ce] 0x043d, - [0x06cf] 0x043e, - [0x06d0] 0x043f, - [0x06d1] 0x044f, - [0x06d2] 0x0440, - [0x06d3] 0x0441, - [0x06d4] 0x0442, - [0x06d5] 0x0443, - [0x06d6] 0x0436, - [0x06d7] 0x0432, - [0x06d8] 0x044c, - [0x06d9] 0x044b, - [0x06da] 0x0437, - [0x06db] 0x0448, - [0x06dc] 0x044d, - [0x06dd] 0x0449, - [0x06de] 0x0447, - [0x06df] 0x044a, - [0x06e0] 0x042e, - [0x06e1] 0x0410, - [0x06e2] 0x0411, - [0x06e3] 0x0426, - [0x06e4] 0x0414, - [0x06e5] 0x0415, - [0x06e6] 0x0424, - [0x06e7] 0x0413, - [0x06e8] 0x0425, - [0x06e9] 0x0418, - [0x06ea] 0x0419, - [0x06eb] 0x041a, - [0x06ec] 0x041b, - [0x06ed] 0x041c, - [0x06ee] 0x041d, - [0x06ef] 0x041e, - [0x06f0] 0x041f, - [0x06f1] 0x042f, - [0x06f2] 0x0420, - [0x06f3] 0x0421, - [0x06f4] 0x0422, - [0x06f5] 0x0423, - [0x06f6] 0x0416, - [0x06f7] 0x0412, - [0x06f8] 0x042c, - [0x06f9] 0x042b, - [0x06fa] 0x0417, - [0x06fb] 0x0428, - [0x06fc] 0x042d, - [0x06fd] 0x0429, - [0x06fe] 0x0427, - [0x06ff] 0x042a, - [0x07a1] 0x0386, - [0x07a2] 0x0388, - [0x07a3] 0x0389, - [0x07a4] 0x038a, - [0x07a5] 0x03aa, - [0x07a7] 0x038c, - [0x07a8] 0x038e, - [0x07a9] 0x03ab, - [0x07ab] 0x038f, - [0x07ae] 0x0385, - [0x07af] 0x2015, - [0x07b1] 0x03ac, - [0x07b2] 0x03ad, - [0x07b3] 0x03ae, - [0x07b4] 0x03af, - [0x07b5] 0x03ca, - [0x07b6] 0x0390, - [0x07b7] 0x03cc, - [0x07b8] 0x03cd, - [0x07b9] 0x03cb, - [0x07ba] 0x03b0, - [0x07bb] 0x03ce, - [0x07c1] 0x0391, - [0x07c2] 0x0392, - [0x07c3] 0x0393, - [0x07c4] 0x0394, - [0x07c5] 0x0395, - [0x07c6] 0x0396, - [0x07c7] 0x0397, - [0x07c8] 0x0398, - [0x07c9] 0x0399, - [0x07ca] 0x039a, - [0x07cb] 0x039b, - [0x07cc] 0x039c, - [0x07cd] 0x039d, - [0x07ce] 0x039e, - [0x07cf] 0x039f, - [0x07d0] 0x03a0, - [0x07d1] 0x03a1, - [0x07d2] 0x03a3, - [0x07d4] 0x03a4, - [0x07d5] 0x03a5, - [0x07d6] 0x03a6, - [0x07d7] 0x03a7, - [0x07d8] 0x03a8, - [0x07d9] 0x03a9, - [0x07e1] 0x03b1, - [0x07e2] 0x03b2, - [0x07e3] 0x03b3, - [0x07e4] 0x03b4, - [0x07e5] 0x03b5, - [0x07e6] 0x03b6, - [0x07e7] 0x03b7, - [0x07e8] 0x03b8, - [0x07e9] 0x03b9, - [0x07ea] 0x03ba, - [0x07eb] 0x03bb, - [0x07ec] 0x03bc, - [0x07ed] 0x03bd, - [0x07ee] 0x03be, - [0x07ef] 0x03bf, - [0x07f0] 0x03c0, - [0x07f1] 0x03c1, - [0x07f2] 0x03c3, - [0x07f3] 0x03c2, - [0x07f4] 0x03c4, - [0x07f5] 0x03c5, - [0x07f6] 0x03c6, - [0x07f7] 0x03c7, - [0x07f8] 0x03c8, - [0x07f9] 0x03c9, - [0x08a4] 0x2320, - [0x08a5] 0x2321, - [0x08a6] 0x2502, - [0x08bc] 0x2264, - [0x08bd] 0x2260, - [0x08be] 0x2265, - [0x08bf] 0x222b, - [0x08c0] 0x2234, - [0x08c1] 0x221d, - [0x08c2] 0x221e, - [0x08c5] 0x2207, - [0x08c8] 0x2245, - [0x08cd] 0x21d4, - [0x08ce] 0x21d2, - [0x08cf] 0x2261, - [0x08d6] 0x221a, - [0x08da] 0x2282, - [0x08db] 0x2283, - [0x08dc] 0x2229, - [0x08dd] 0x222a, - [0x08de] 0x2227, - [0x08df] 0x2228, - [0x08ef] 0x2202, - [0x08f6] 0x0192, - [0x08fb] 0x2190, - [0x08fc] 0x2191, - [0x08fd] 0x2192, - [0x08fe] 0x2193, - [0x09df] 0x2422, - [0x09e0] 0x25c6, - [0x09e1] 0x2592, - [0x09e2] 0x2409, - [0x09e3] 0x240c, - [0x09e4] 0x240d, - [0x09e5] 0x240a, - [0x09e8] 0x2424, - [0x09e9] 0x240b, - [0x09ea] 0x2518, - [0x09eb] 0x2510, - [0x09ec] 0x250c, - [0x09ed] 0x2514, - [0x09ee] 0x253c, - [0x09f1] 0x2500, - [0x09f4] 0x251c, - [0x09f5] 0x2524, - [0x09f6] 0x2534, - [0x09f7] 0x252c, - [0x09f8] 0x2502, - [0x0aa1] 0x2003, - [0x0aa2] 0x2002, - [0x0aa3] 0x2004, - [0x0aa4] 0x2005, - [0x0aa5] 0x2007, - [0x0aa6] 0x2008, - [0x0aa7] 0x2009, - [0x0aa8] 0x200a, - [0x0aa9] 0x2014, - [0x0aaa] 0x2013, - [0x0aae] 0x2026, - [0x0ab0] 0x2153, - [0x0ab1] 0x2154, - [0x0ab2] 0x2155, - [0x0ab3] 0x2156, - [0x0ab4] 0x2157, - [0x0ab5] 0x2158, - [0x0ab6] 0x2159, - [0x0ab7] 0x215a, - [0x0ab8] 0x2105, - [0x0abb] 0x2012, - [0x0abc] 0x2329, - [0x0abd] 0x002e, - [0x0abe] 0x232a, - [0x0ac3] 0x215b, - [0x0ac4] 0x215c, - [0x0ac5] 0x215d, - [0x0ac6] 0x215e, - [0x0ac9] 0x2122, - [0x0aca] 0x2613, - [0x0acc] 0x25c1, - [0x0acd] 0x25b7, - [0x0ace] 0x25cb, - [0x0acf] 0x25a1, - [0x0ad0] 0x2018, - [0x0ad1] 0x2019, - [0x0ad2] 0x201c, - [0x0ad3] 0x201d, - [0x0ad4] 0x211e, - [0x0ad6] 0x2032, - [0x0ad7] 0x2033, - [0x0ad9] 0x271d, - [0x0adb] 0x25ac, - [0x0adc] 0x25c0, - [0x0add] 0x25b6, - [0x0ade] 0x25cf, - [0x0adf] 0x25a0, - [0x0ae0] 0x25e6, - [0x0ae1] 0x25ab, - [0x0ae2] 0x25ad, - [0x0ae3] 0x25b3, - [0x0ae4] 0x25bd, - [0x0ae5] 0x2606, - [0x0ae6] 0x2022, - [0x0ae7] 0x25aa, - [0x0ae8] 0x25b2, - [0x0ae9] 0x25bc, - [0x0aea] 0x261c, - [0x0aeb] 0x261e, - [0x0aec] 0x2663, - [0x0aed] 0x2666, - [0x0aee] 0x2665, - [0x0af0] 0x2720, - [0x0af1] 0x2020, - [0x0af2] 0x2021, - [0x0af3] 0x2713, - [0x0af4] 0x2717, - [0x0af5] 0x266f, - [0x0af6] 0x266d, - [0x0af7] 0x2642, - [0x0af8] 0x2640, - [0x0af9] 0x260e, - [0x0afa] 0x2315, - [0x0afb] 0x2117, - [0x0afc] 0x2038, - [0x0afd] 0x201a, - [0x0afe] 0x201e, - [0x0ba3] 0x003c, - [0x0ba6] 0x003e, - [0x0ba8] 0x2228, - [0x0ba9] 0x2227, - [0x0bc0] 0x00af, - [0x0bc2] 0x22a4, - [0x0bc3] 0x2229, - [0x0bc4] 0x230a, - [0x0bc6] 0x005f, - [0x0bca] 0x2218, - [0x0bcc] 0x2395, - [0x0bce] 0x22a5, - [0x0bcf] 0x25cb, - [0x0bd3] 0x2308, - [0x0bd6] 0x222a, - [0x0bd8] 0x2283, - [0x0bda] 0x2282, - [0x0bdc] 0x22a3, - [0x0bfc] 0x22a2, - [0x0cdf] 0x2017, - [0x0ce0] 0x05d0, - [0x0ce1] 0x05d1, - [0x0ce2] 0x05d2, - [0x0ce3] 0x05d3, - [0x0ce4] 0x05d4, - [0x0ce5] 0x05d5, - [0x0ce6] 0x05d6, - [0x0ce7] 0x05d7, - [0x0ce8] 0x05d8, - [0x0ce9] 0x05d9, - [0x0cea] 0x05da, - [0x0ceb] 0x05db, - [0x0cec] 0x05dc, - [0x0ced] 0x05dd, - [0x0cee] 0x05de, - [0x0cef] 0x05df, - [0x0cf0] 0x05e0, - [0x0cf1] 0x05e1, - [0x0cf2] 0x05e2, - [0x0cf3] 0x05e3, - [0x0cf4] 0x05e4, - [0x0cf5] 0x05e5, - [0x0cf6] 0x05e6, - [0x0cf7] 0x05e7, - [0x0cf8] 0x05e8, - [0x0cf9] 0x05e9, - [0x0cfa] 0x05ea, - [0x0da1] 0x0e01, - [0x0da2] 0x0e02, - [0x0da3] 0x0e03, - [0x0da4] 0x0e04, - [0x0da5] 0x0e05, - [0x0da6] 0x0e06, - [0x0da7] 0x0e07, - [0x0da8] 0x0e08, - [0x0da9] 0x0e09, - [0x0daa] 0x0e0a, - [0x0dab] 0x0e0b, - [0x0dac] 0x0e0c, - [0x0dad] 0x0e0d, - [0x0dae] 0x0e0e, - [0x0daf] 0x0e0f, - [0x0db0] 0x0e10, - [0x0db1] 0x0e11, - [0x0db2] 0x0e12, - [0x0db3] 0x0e13, - [0x0db4] 0x0e14, - [0x0db5] 0x0e15, - [0x0db6] 0x0e16, - [0x0db7] 0x0e17, - [0x0db8] 0x0e18, - [0x0db9] 0x0e19, - [0x0dba] 0x0e1a, - [0x0dbb] 0x0e1b, - [0x0dbc] 0x0e1c, - [0x0dbd] 0x0e1d, - [0x0dbe] 0x0e1e, - [0x0dbf] 0x0e1f, - [0x0dc0] 0x0e20, - [0x0dc1] 0x0e21, - [0x0dc2] 0x0e22, - [0x0dc3] 0x0e23, - [0x0dc4] 0x0e24, - [0x0dc5] 0x0e25, - [0x0dc6] 0x0e26, - [0x0dc7] 0x0e27, - [0x0dc8] 0x0e28, - [0x0dc9] 0x0e29, - [0x0dca] 0x0e2a, - [0x0dcb] 0x0e2b, - [0x0dcc] 0x0e2c, - [0x0dcd] 0x0e2d, - [0x0dce] 0x0e2e, - [0x0dcf] 0x0e2f, - [0x0dd0] 0x0e30, - [0x0dd1] 0x0e31, - [0x0dd2] 0x0e32, - [0x0dd3] 0x0e33, - [0x0dd4] 0x0e34, - [0x0dd5] 0x0e35, - [0x0dd6] 0x0e36, - [0x0dd7] 0x0e37, - [0x0dd8] 0x0e38, - [0x0dd9] 0x0e39, - [0x0dda] 0x0e3a, - [0x0dde] 0x0e3e, - [0x0ddf] 0x0e3f, - [0x0de0] 0x0e40, - [0x0de1] 0x0e41, - [0x0de2] 0x0e42, - [0x0de3] 0x0e43, - [0x0de4] 0x0e44, - [0x0de5] 0x0e45, - [0x0de6] 0x0e46, - [0x0de7] 0x0e47, - [0x0de8] 0x0e48, - [0x0de9] 0x0e49, - [0x0dea] 0x0e4a, - [0x0deb] 0x0e4b, - [0x0dec] 0x0e4c, - [0x0ded] 0x0e4d, - [0x0df0] 0x0e50, - [0x0df1] 0x0e51, - [0x0df2] 0x0e52, - [0x0df3] 0x0e53, - [0x0df4] 0x0e54, - [0x0df5] 0x0e55, - [0x0df6] 0x0e56, - [0x0df7] 0x0e57, - [0x0df8] 0x0e58, - [0x0df9] 0x0e59, - [0x0ea1] 0x3131, - [0x0ea2] 0x3132, - [0x0ea3] 0x3133, - [0x0ea4] 0x3134, - [0x0ea5] 0x3135, - [0x0ea6] 0x3136, - [0x0ea7] 0x3137, - [0x0ea8] 0x3138, - [0x0ea9] 0x3139, - [0x0eaa] 0x313a, - [0x0eab] 0x313b, - [0x0eac] 0x313c, - [0x0ead] 0x313d, - [0x0eae] 0x313e, - [0x0eaf] 0x313f, - [0x0eb0] 0x3140, - [0x0eb1] 0x3141, - [0x0eb2] 0x3142, - [0x0eb3] 0x3143, - [0x0eb4] 0x3144, - [0x0eb5] 0x3145, - [0x0eb6] 0x3146, - [0x0eb7] 0x3147, - [0x0eb8] 0x3148, - [0x0eb9] 0x3149, - [0x0eba] 0x314a, - [0x0ebb] 0x314b, - [0x0ebc] 0x314c, - [0x0ebd] 0x314d, - [0x0ebe] 0x314e, - [0x0ebf] 0x314f, - [0x0ec0] 0x3150, - [0x0ec1] 0x3151, - [0x0ec2] 0x3152, - [0x0ec3] 0x3153, - [0x0ec4] 0x3154, - [0x0ec5] 0x3155, - [0x0ec6] 0x3156, - [0x0ec7] 0x3157, - [0x0ec8] 0x3158, - [0x0ec9] 0x3159, - [0x0eca] 0x315a, - [0x0ecb] 0x315b, - [0x0ecc] 0x315c, - [0x0ecd] 0x315d, - [0x0ece] 0x315e, - [0x0ecf] 0x315f, - [0x0ed0] 0x3160, - [0x0ed1] 0x3161, - [0x0ed2] 0x3162, - [0x0ed3] 0x3163, - [0x0ed4] 0x11a8, - [0x0ed5] 0x11a9, - [0x0ed6] 0x11aa, - [0x0ed7] 0x11ab, - [0x0ed8] 0x11ac, - [0x0ed9] 0x11ad, - [0x0eda] 0x11ae, - [0x0edb] 0x11af, - [0x0edc] 0x11b0, - [0x0edd] 0x11b1, - [0x0ede] 0x11b2, - [0x0edf] 0x11b3, - [0x0ee0] 0x11b4, - [0x0ee1] 0x11b5, - [0x0ee2] 0x11b6, - [0x0ee3] 0x11b7, - [0x0ee4] 0x11b8, - [0x0ee5] 0x11b9, - [0x0ee6] 0x11ba, - [0x0ee7] 0x11bb, - [0x0ee8] 0x11bc, - [0x0ee9] 0x11bd, - [0x0eea] 0x11be, - [0x0eeb] 0x11bf, - [0x0eec] 0x11c0, - [0x0eed] 0x11c1, - [0x0eee] 0x11c2, - [0x0eef] 0x316d, - [0x0ef0] 0x3171, - [0x0ef1] 0x3178, - [0x0ef2] 0x317f, - [0x0ef4] 0x3184, - [0x0ef5] 0x3186, - [0x0ef6] 0x318d, - [0x0ef7] 0x318e, - [0x0ef8] 0x11eb, - [0x0efa] 0x11f9, - [0x0eff] 0x20a9, - [0x13bc] 0x0152, - [0x13bd] 0x0153, - [0x13be] 0x0178, - [0x20a0] 0x20a0, - [0x20a1] 0x20a1, - [0x20a2] 0x20a2, - [0x20a3] 0x20a3, - [0x20a4] 0x20a4, - [0x20a5] 0x20a5, - [0x20a6] 0x20a6, - [0x20a7] 0x20a7, - [0x20a8] 0x20a8, - [0x20a9] 0x20a9, - [0x20aa] 0x20aa, - [0x20ab] 0x20ab, - [0x20ac] 0x20ac, -}; diff --git a/sys/src/cmd/unix/drawterm/gui-x11/load.c b/sys/src/cmd/unix/drawterm/gui-x11/load.c deleted file mode 100644 index 6a19c8a23..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/load.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include "xmem.h" - -int -loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - int n; - - n = _loadmemimage(i, r, data, ndata); - if(n > 0 && i->X) - putXdata(i, r); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/gui-x11/screen.c b/sys/src/cmd/unix/drawterm/gui-x11/screen.c deleted file mode 100644 index 8bf600439..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/screen.c +++ /dev/null @@ -1,1168 +0,0 @@ -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <termios.h> -#include <stdio.h> - -#include <X11/Xlib.h> -#include <X11/Xatom.h> -#include <X11/Xutil.h> -#include <X11/keysym.h> - -#include "keysym2ucs.h" - -/* - * alias defs for image types to overcome name conflicts - */ -#define Point IPoint -#define Rectangle IRectangle -#define Display IDisplay -#define Font IFont -#define Screen IScreen - -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "user.h" -#include "draw.h" -#include "memdraw.h" -#include "keyboard.h" -#include "screen.h" - -#undef time -#undef Point -#undef Rectangle -#undef Display -#undef Font -#undef Screen - -typedef struct ICursor ICursor; -struct ICursor -{ - int w; - int h; - int hotx; - int hoty; - char *src; - char *mask; -}; - - -#define ABS(x) ((x) < 0 ? -(x) : (x)) - -enum -{ - DblTime = 300 /* double click time in msec */ -}; - -XColor map[256]; /* Plan 9 colormap array */ -XColor map7[128]; /* Plan 9 colormap array */ -uchar map7to8[128][2]; -Colormap xcmap; /* Default shared colormap */ -int plan9tox11[256]; /* Values for mapping between */ -int x11toplan9[256]; /* X11 and Plan 9 */ -int x24bitswap = 0; /* swap endian for 24bit RGB */ -int xtblbit; -extern int mousequeue; - -/* for copy/paste, lifted from plan9ports */ -Atom clipboard; -Atom utf8string; -Atom targets; -Atom text; -Atom compoundtext; - -static Drawable xdrawable; -/* static Atom wm_take_focus; */ -static void xexpose(XEvent*); -static void xmouse(XEvent*); -static void xkeyboard(XEvent*); -static void xmapping(XEvent*); -static void xdestroy(XEvent*); -static void xselect(XEvent*, Display*); -static void xproc(void*); -static Memimage* xinitscreen(void); -static void initmap(Window); -static GC creategc(Drawable); -static void graphicscmap(XColor*); - int xscreendepth; - Drawable xscreenid; - Display* xdisplay; /* used holding draw lock */ - Display* xkmcon; /* used only in xproc */ - Display* xsnarfcon; /* used holding clip.lk */ - Visual *xvis; - GC xgcfill, xgccopy, xgcsimplesrc, xgczero, xgcreplsrc; - GC xgcfill0, xgccopy0, xgcsimplesrc0, xgczero0, xgcreplsrc0; - ulong xblack; - ulong xwhite; - ulong xscreenchan; - -static int putsnarf, assertsnarf; - -extern Memimage* xallocmemimage(IRectangle, ulong, int); -Memimage *gscreen; -Screeninfo screen; -XImage *ximage; - -void -screeninit(void) -{ - _memmkcmap(); - - gscreen = xinitscreen(); - kproc("xscreen", xproc, nil); - - memimageinit(); - terminit(); - drawqlock(); - flushmemscreen(gscreen->r); - drawqunlock(); -} - -uchar* -attachscreen(IRectangle *r, ulong *chan, int *depth, - int *width, int *softscreen, void **X) -{ - *r = gscreen->r; - *chan = gscreen->chan; - *depth = gscreen->depth; - *width = gscreen->width; - *X = gscreen->X; - *softscreen = 1; - - return gscreen->data->bdata; -} - -void -flushmemscreen(IRectangle r) -{ - assert(!drawcanqlock()); - if(r.min.x >= r.max.x || r.min.y >= r.max.y) - return; - XCopyArea(xdisplay, xscreenid, xdrawable, xgccopy, r.min.x, r.min.y, Dx(r), Dy(r), r.min.x, r.min.y); - XFlush(xdisplay); -} - -static int -revbyte(int b) -{ - int r; - - r = 0; - r |= (b&0x01) << 7; - r |= (b&0x02) << 5; - r |= (b&0x04) << 3; - r |= (b&0x08) << 1; - r |= (b&0x10) >> 1; - r |= (b&0x20) >> 3; - r |= (b&0x40) >> 5; - r |= (b&0x80) >> 7; - return r; -} - -void -mouseset(IPoint xy) -{ - drawqlock(); - XWarpPointer(xdisplay, None, xdrawable, 0, 0, 0, 0, xy.x, xy.y); - XFlush(xdisplay); - drawqunlock(); -} - -static Cursor xcursor; - -void -setcursor(void) -{ - Cursor xc; - XColor fg, bg; - Pixmap xsrc, xmask; - int i; - uchar src[2*16], mask[2*16]; - - for(i=0; i<2*16; i++){ - src[i] = revbyte(cursor.set[i]); - mask[i] = revbyte(cursor.set[i] | cursor.clr[i]); - } - - drawqlock(); - fg = map[0]; - bg = map[255]; - xsrc = XCreateBitmapFromData(xdisplay, xdrawable, (char*)src, 16, 16); - xmask = XCreateBitmapFromData(xdisplay, xdrawable, (char*)mask, 16, 16); - xc = XCreatePixmapCursor(xdisplay, xsrc, xmask, &fg, &bg, -cursor.offset.x, -cursor.offset.y); - if(xc != 0) { - XDefineCursor(xdisplay, xdrawable, xc); - if(xcursor != 0) - XFreeCursor(xdisplay, xcursor); - xcursor = xc; - } - XFreePixmap(xdisplay, xsrc); - XFreePixmap(xdisplay, xmask); - XFlush(xdisplay); - drawqunlock(); -} - -void -cursorarrow(void) -{ - drawqlock(); - if(xcursor != 0){ - XFreeCursor(xdisplay, xcursor); - xcursor = 0; - } - XUndefineCursor(xdisplay, xdrawable); - XFlush(xdisplay); - drawqunlock(); -} - -static void -xproc(void *arg) -{ - ulong mask; - XEvent event; - - mask = KeyPressMask| - ButtonPressMask| - ButtonReleaseMask| - PointerMotionMask| - Button1MotionMask| - Button2MotionMask| - Button3MotionMask| - Button4MotionMask| - Button5MotionMask| - ExposureMask| - StructureNotifyMask; - - XSelectInput(xkmcon, xdrawable, mask); - for(;;) { - //XWindowEvent(xkmcon, xdrawable, mask, &event); - XNextEvent(xkmcon, &event); - xselect(&event, xkmcon); - xkeyboard(&event); - xmouse(&event); - xexpose(&event); - xmapping(&event); - xdestroy(&event); - } -} - -static int -shutup(Display *d, XErrorEvent *e) -{ - char buf[200]; - iprint("X error: error code=%d, request_code=%d, minor=%d\n", e->error_code, e->request_code, e->minor_code); - XGetErrorText(d, e->error_code, buf, sizeof(buf)); - iprint("%s\n", buf); - USED(d); - USED(e); - return 0; -} - -static int -panicshutup(Display *d) -{ - panic("x error"); - return -1; -} - -static Memimage* -xinitscreen(void) -{ - Memimage *gscreen; - int i, xsize, ysize, pmid; - char *argv[2]; - char *disp_val; - Window rootwin; - IRectangle r; - XWMHints hints; - Screen *screen; - XVisualInfo xvi; - int rootscreennum; - XTextProperty name; - XClassHint classhints; - XSizeHints normalhints; - XSetWindowAttributes attrs; - XPixmapFormatValues *pfmt; - int n; - - xscreenid = 0; - xdrawable = 0; - - xdisplay = XOpenDisplay(NULL); - if(xdisplay == 0){ - disp_val = getenv("DISPLAY"); - if(disp_val == 0) - disp_val = "not set"; - iprint("drawterm: open %r, DISPLAY is %s\n", disp_val); - exit(0); - } - - XSetErrorHandler(shutup); - XSetIOErrorHandler(panicshutup); - rootscreennum = DefaultScreen(xdisplay); - rootwin = DefaultRootWindow(xdisplay); - - xscreendepth = DefaultDepth(xdisplay, rootscreennum); - if(XMatchVisualInfo(xdisplay, rootscreennum, 16, TrueColor, &xvi) - || XMatchVisualInfo(xdisplay, rootscreennum, 16, DirectColor, &xvi)){ - xvis = xvi.visual; - xscreendepth = 16; - xtblbit = 1; - } - else if(XMatchVisualInfo(xdisplay, rootscreennum, 24, TrueColor, &xvi) - || XMatchVisualInfo(xdisplay, rootscreennum, 24, DirectColor, &xvi)){ - xvis = xvi.visual; - xscreendepth = 24; - xtblbit = 1; - } - else if(XMatchVisualInfo(xdisplay, rootscreennum, 8, PseudoColor, &xvi) - || XMatchVisualInfo(xdisplay, rootscreennum, 8, StaticColor, &xvi)){ - if(xscreendepth > 8) - panic("drawterm: can't deal with colormapped depth %d screens\n", xscreendepth); - xvis = xvi.visual; - xscreendepth = 8; - } - else{ - if(xscreendepth != 8) - panic("drawterm: can't deal with depth %d screens\n", xscreendepth); - xvis = DefaultVisual(xdisplay, rootscreennum); - } - - /* - * xscreendepth is only the number of significant pixel bits, - * not the total. We need to walk the display list to find - * how many actual bits are being used per pixel. - */ - xscreenchan = 0; /* not a valid channel */ - pfmt = XListPixmapFormats(xdisplay, &n); - for(i=0; i<n; i++){ - if(pfmt[i].depth == xscreendepth){ - switch(pfmt[i].bits_per_pixel){ - case 1: /* untested */ - xscreenchan = GREY1; - break; - case 2: /* untested */ - xscreenchan = GREY2; - break; - case 4: /* untested */ - xscreenchan = GREY4; - break; - case 8: - xscreenchan = CMAP8; - break; - case 16: /* uses 16 rather than 15, empirically. */ - xscreenchan = RGB16; - break; - case 24: /* untested (impossible?) */ - xscreenchan = RGB24; - break; - case 32: - xscreenchan = CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8); - break; - } - } - } - if(xscreenchan == 0) - panic("drawterm: unknown screen pixel format\n"); - - screen = DefaultScreenOfDisplay(xdisplay); - xcmap = DefaultColormapOfScreen(screen); - - if(xvis->class != StaticColor){ - graphicscmap(map); - initmap(rootwin); - } - - - r.min = ZP; - r.max.x = WidthOfScreen(screen); - r.max.y = HeightOfScreen(screen); - - - xsize = Dx(r)*3/4; - ysize = Dy(r)*3/4; - - attrs.colormap = xcmap; - attrs.background_pixel = 0; - attrs.border_pixel = 0; - /* attrs.override_redirect = 1;*/ /* WM leave me alone! |CWOverrideRedirect */ - xdrawable = XCreateWindow(xdisplay, rootwin, 0, 0, xsize, ysize, 0, - xscreendepth, InputOutput, xvis, CWBackPixel|CWBorderPixel|CWColormap, &attrs); - - /* - * set up property as required by ICCCM - */ - name.value = (uchar*)"drawterm"; - name.encoding = XA_STRING; - name.format = 8; - name.nitems = strlen((char*)name.value); - normalhints.flags = USSize|PMaxSize; - normalhints.max_width = Dx(r); - normalhints.max_height = Dy(r); - normalhints.width = xsize; - normalhints.height = ysize; - hints.flags = InputHint|StateHint; - hints.input = 1; - hints.initial_state = NormalState; - classhints.res_name = "drawterm"; - classhints.res_class = "Drawterm"; - argv[0] = "drawterm"; - argv[1] = nil; - XSetWMProperties(xdisplay, xdrawable, - &name, /* XA_WM_NAME property for ICCCM */ - &name, /* XA_WM_ICON_NAME */ - argv, /* XA_WM_COMMAND */ - 1, /* argc */ - &normalhints, /* XA_WM_NORMAL_HINTS */ - &hints, /* XA_WM_HINTS */ - &classhints); /* XA_WM_CLASS */ - XFlush(xdisplay); - - /* - * put the window on the screen - */ - XMapWindow(xdisplay, xdrawable); - XFlush(xdisplay); - - xscreenid = XCreatePixmap(xdisplay, xdrawable, Dx(r), Dy(r), xscreendepth); - gscreen = xallocmemimage(r, xscreenchan, xscreenid); - - xgcfill = creategc(xscreenid); - XSetFillStyle(xdisplay, xgcfill, FillSolid); - xgccopy = creategc(xscreenid); - xgcsimplesrc = creategc(xscreenid); - XSetFillStyle(xdisplay, xgcsimplesrc, FillStippled); - xgczero = creategc(xscreenid); - xgcreplsrc = creategc(xscreenid); - XSetFillStyle(xdisplay, xgcreplsrc, FillTiled); - - pmid = XCreatePixmap(xdisplay, xdrawable, 1, 1, 1); - xgcfill0 = creategc(pmid); - XSetForeground(xdisplay, xgcfill0, 0); - XSetFillStyle(xdisplay, xgcfill0, FillSolid); - xgccopy0 = creategc(pmid); - xgcsimplesrc0 = creategc(pmid); - XSetFillStyle(xdisplay, xgcsimplesrc0, FillStippled); - xgczero0 = creategc(pmid); - xgcreplsrc0 = creategc(pmid); - XSetFillStyle(xdisplay, xgcreplsrc0, FillTiled); - XFreePixmap(xdisplay, pmid); - - XSetForeground(xdisplay, xgccopy, plan9tox11[0]); - XFillRectangle(xdisplay, xscreenid, xgccopy, 0, 0, xsize, ysize); - - xkmcon = XOpenDisplay(NULL); - if(xkmcon == 0){ - disp_val = getenv("DISPLAY"); - if(disp_val == 0) - disp_val = "not set"; - iprint("drawterm: open %r, DISPLAY is %s\n", disp_val); - exit(0); - } - xsnarfcon = XOpenDisplay(NULL); - if(xsnarfcon == 0){ - disp_val = getenv("DISPLAY"); - if(disp_val == 0) - disp_val = "not set"; - iprint("drawterm: open %r, DISPLAY is %s\n", disp_val); - exit(0); - } - - clipboard = XInternAtom(xkmcon, "CLIPBOARD", False); - utf8string = XInternAtom(xkmcon, "UTF8_STRING", False); - targets = XInternAtom(xkmcon, "TARGETS", False); - text = XInternAtom(xkmcon, "TEXT", False); - compoundtext = XInternAtom(xkmcon, "COMPOUND_TEXT", False); - - xblack = screen->black_pixel; - xwhite = screen->white_pixel; - return gscreen; -} - -static void -graphicscmap(XColor *map) -{ - int r, g, b, cr, cg, cb, v, num, den, idx, v7, idx7; - - for(r=0; r!=4; r++) { - for(g = 0; g != 4; g++) { - for(b = 0; b!=4; b++) { - for(v = 0; v!=4; v++) { - den=r; - if(g > den) - den=g; - if(b > den) - den=b; - /* divide check -- pick grey shades */ - if(den==0) - cr=cg=cb=v*17; - else { - num=17*(4*den+v); - cr=r*num/den; - cg=g*num/den; - cb=b*num/den; - } - idx = r*64 + v*16 + ((g*4 + b + v - r) & 15); - map[idx].red = cr*0x0101; - map[idx].green = cg*0x0101; - map[idx].blue = cb*0x0101; - map[idx].pixel = idx; - map[idx].flags = DoRed|DoGreen|DoBlue; - - v7 = v >> 1; - idx7 = r*32 + v7*16 + g*4 + b; - if((v & 1) == v7){ - map7to8[idx7][0] = idx; - if(den == 0) { /* divide check -- pick grey shades */ - cr = ((255.0/7.0)*v7)+0.5; - cg = cr; - cb = cr; - } - else { - num=17*15*(4*den+v7*2)/14; - cr=r*num/den; - cg=g*num/den; - cb=b*num/den; - } - map7[idx7].red = cr*0x0101; - map7[idx7].green = cg*0x0101; - map7[idx7].blue = cb*0x0101; - map7[idx7].pixel = idx7; - map7[idx7].flags = DoRed|DoGreen|DoBlue; - } - else - map7to8[idx7][1] = idx; - } - } - } - } -} - -/* - * Initialize and install the drawterm colormap as a private colormap for this - * application. Drawterm gets the best colors here when it has the cursor focus. - */ -static void -initmap(Window w) -{ - XColor c; - int i; - ulong p, pp; - char buf[30]; - - if(xscreendepth <= 1) - return; - - if(xscreendepth >= 24) { - /* The pixel value returned from XGetPixel needs to - * be converted to RGB so we can call rgb2cmap() - * to translate between 24 bit X and our color. Unfortunately, - * the return value appears to be display server endian - * dependant. Therefore, we run some heuristics to later - * determine how to mask the int value correctly. - * Yeah, I know we can look at xvis->byte_order but - * some displays say MSB even though they run on LSB. - * Besides, this is more anal. - */ - if(xscreendepth != DefaultDepth(xdisplay, DefaultScreen(xdisplay))) - xcmap = XCreateColormap(xdisplay, w, xvis, AllocNone); - - c = map[19]; - /* find out index into colormap for our RGB */ - if(!XAllocColor(xdisplay, xcmap, &c)) - panic("drawterm: screen-x11 can't alloc color"); - - p = c.pixel; - pp = rgb2cmap((p>>16)&0xff,(p>>8)&0xff,p&0xff); - if(pp!=map[19].pixel) { - /* check if endian is other way */ - pp = rgb2cmap(p&0xff,(p>>8)&0xff,(p>>16)&0xff); - if(pp!=map[19].pixel) - panic("cannot detect x server byte order"); - switch(xscreenchan){ - case RGB24: - xscreenchan = BGR24; - break; - case XRGB32: - xscreenchan = XBGR32; - break; - default: - panic("don't know how to byteswap channel %s", - chantostr(buf, xscreenchan)); - break; - } - } - } else if(xvis->class == TrueColor || xvis->class == DirectColor) { - } else if(xvis->class == PseudoColor) { - if(xtblbit == 0){ - xcmap = XCreateColormap(xdisplay, w, xvis, AllocAll); - XStoreColors(xdisplay, xcmap, map, 256); - for(i = 0; i < 256; i++) { - plan9tox11[i] = i; - x11toplan9[i] = i; - } - } - else { - for(i = 0; i < 128; i++) { - c = map7[i]; - if(!XAllocColor(xdisplay, xcmap, &c)) { - iprint("drawterm: can't alloc colors in default map, don't use -7\n"); - exit(0); - } - plan9tox11[map7to8[i][0]] = c.pixel; - plan9tox11[map7to8[i][1]] = c.pixel; - x11toplan9[c.pixel] = map7to8[i][0]; - } - } - } - else - panic("drawterm: unsupported visual class %d\n", xvis->class); -} - -static void -xdestroy(XEvent *e) -{ - XDestroyWindowEvent *xe; - if(e->type != DestroyNotify) - return; - xe = (XDestroyWindowEvent*)e; - if(xe->window == xdrawable) - exit(0); -} - -static void -xmapping(XEvent *e) -{ - XMappingEvent *xe; - - if(e->type != MappingNotify) - return; - xe = (XMappingEvent*)e; - USED(xe); -} - - -/* - * Disable generation of GraphicsExpose/NoExpose events in the GC. - */ -static GC -creategc(Drawable d) -{ - XGCValues gcv; - - gcv.function = GXcopy; - gcv.graphics_exposures = False; - return XCreateGC(xdisplay, d, GCFunction|GCGraphicsExposures, &gcv); -} - -static void -xexpose(XEvent *e) -{ - IRectangle r; - XExposeEvent *xe; - - if(e->type != Expose) - return; - xe = (XExposeEvent*)e; - r.min.x = xe->x; - r.min.y = xe->y; - r.max.x = xe->x + xe->width; - r.max.y = xe->y + xe->height; - drawflushr(r); -} - -static void -xkeyboard(XEvent *e) -{ - KeySym k; - - /* - * I tried using XtGetActionKeysym, but it didn't seem to - * do case conversion properly - * (at least, with Xterminal servers and R4 intrinsics) - */ - if(e->xany.type != KeyPress) - return; - - - XLookupString((XKeyEvent*)e, NULL, 0, &k, NULL); - - if(k == XK_Multi_key || k == NoSymbol) - return; - if(k&0xFF00){ - switch(k){ - case XK_BackSpace: - case XK_Tab: - case XK_Escape: - case XK_Delete: - case XK_KP_0: - case XK_KP_1: - case XK_KP_2: - case XK_KP_3: - case XK_KP_4: - case XK_KP_5: - case XK_KP_6: - case XK_KP_7: - case XK_KP_8: - case XK_KP_9: - case XK_KP_Divide: - case XK_KP_Multiply: - case XK_KP_Subtract: - case XK_KP_Add: - case XK_KP_Decimal: - k &= 0x7F; - break; - case XK_Linefeed: - k = '\r'; - break; - case XK_KP_Space: - k = ' '; - break; - case XK_Home: - case XK_KP_Home: - k = Khome; - break; - case XK_Left: - case XK_KP_Left: - k = Kleft; - break; - case XK_Up: - case XK_KP_Up: - k = Kup; - break; - case XK_Down: - case XK_KP_Down: - k = Kdown; - break; - case XK_Right: - case XK_KP_Right: - k = Kright; - break; - case XK_Page_Down: - case XK_KP_Page_Down: - k = Kpgdown; - break; - case XK_End: - case XK_KP_End: - k = Kend; - break; - case XK_Page_Up: - case XK_KP_Page_Up: - k = Kpgup; - break; - case XK_Insert: - case XK_KP_Insert: - k = Kins; - break; - case XK_KP_Enter: - case XK_Return: - k = '\n'; - break; - case XK_Alt_L: - case XK_Alt_R: - k = Kalt; - break; - case XK_Shift_L: - case XK_Shift_R: - case XK_Control_L: - case XK_Control_R: - case XK_Caps_Lock: - case XK_Shift_Lock: - - case XK_Meta_L: - case XK_Meta_R: - case XK_Super_L: - case XK_Super_R: - case XK_Hyper_L: - case XK_Hyper_R: - return; - default: /* not ISO-1 or tty control */ - if(k>0xff){ - k = keysym2ucs(k); /* supplied by X */ - if(k == -1) - return; - } - break; - } - } - - /* Compensate for servers that call a minus a hyphen */ - if(k == XK_hyphen) - k = XK_minus; - /* Do control mapping ourselves if translator doesn't */ - if(e->xkey.state&ControlMask) - k &= 0x9f; - if(k == NoSymbol) { - return; - } - - kbdputc(kbdq, k); -} - -static void -xmouse(XEvent *e) -{ - Mousestate ms; - int i, s; - XButtonEvent *be; - XMotionEvent *me; - - if(putsnarf != assertsnarf){ - assertsnarf = putsnarf; - XSetSelectionOwner(xkmcon, XA_PRIMARY, xdrawable, CurrentTime); - if(clipboard != None) - XSetSelectionOwner(xkmcon, clipboard, xdrawable, CurrentTime); - XFlush(xkmcon); - } - - switch(e->type){ - case ButtonPress: - be = (XButtonEvent *)e; - /* - * Fake message, just sent to make us announce snarf. - * Apparently state and button are 16 and 8 bits on - * the wire, since they are truncated by the time they - * get to us. - */ - if(be->send_event - && (~be->state&0xFFFF)==0 - && (~be->button&0xFF)==0) - return; - ms.xy.x = be->x; - ms.xy.y = be->y; - s = be->state; - ms.msec = be->time; - switch(be->button){ - case 1: - s |= Button1Mask; - break; - case 2: - s |= Button2Mask; - break; - case 3: - s |= Button3Mask; - break; - case 4: - s |= Button4Mask; - break; - case 5: - s |= Button5Mask; - break; - } - break; - case ButtonRelease: - be = (XButtonEvent *)e; - ms.xy.x = be->x; - ms.xy.y = be->y; - ms.msec = be->time; - s = be->state; - switch(be->button){ - case 1: - s &= ~Button1Mask; - break; - case 2: - s &= ~Button2Mask; - break; - case 3: - s &= ~Button3Mask; - break; - case 4: - s &= ~Button4Mask; - break; - case 5: - s &= ~Button5Mask; - break; - } - break; - case MotionNotify: - me = (XMotionEvent *)e; - s = me->state; - ms.xy.x = me->x; - ms.xy.y = me->y; - ms.msec = me->time; - break; - default: - return; - } - - ms.buttons = 0; - if(s & Button1Mask) - ms.buttons |= 1; - if(s & Button2Mask) - ms.buttons |= 2; - if(s & Button3Mask) - ms.buttons |= 4; - if(s & Button4Mask) - ms.buttons |= 8; - if(s & Button5Mask) - ms.buttons |= 16; - - lock(&mouse.lk); - i = mouse.wi; - if(mousequeue) { - if(i == mouse.ri || mouse.lastb != ms.buttons || mouse.trans) { - mouse.wi = (i+1)%Mousequeue; - if(mouse.wi == mouse.ri) - mouse.ri = (mouse.ri+1)%Mousequeue; - mouse.trans = mouse.lastb != ms.buttons; - } else { - i = (i-1+Mousequeue)%Mousequeue; - } - } else { - mouse.wi = (i+1)%Mousequeue; - mouse.ri = i; - } - mouse.queue[i] = ms; - mouse.lastb = ms.buttons; - unlock(&mouse.lk); - wakeup(&mouse.r); -} - -void -getcolor(ulong i, ulong *r, ulong *g, ulong *b) -{ - ulong v; - - v = cmap2rgb(i); - *r = (v>>16)&0xFF; - *g = (v>>8)&0xFF; - *b = v&0xFF; -} - -void -setcolor(ulong i, ulong r, ulong g, ulong b) -{ - /* no-op */ -} - -int -atlocalconsole(void) -{ - char *p, *q; - char buf[128]; - - p = getenv("DRAWTERM_ATLOCALCONSOLE"); - if(p && atoi(p) == 1) - return 1; - - p = getenv("DISPLAY"); - if(p == nil) - return 0; - - /* extract host part */ - q = strchr(p, ':'); - if(q == nil) - return 0; - *q = 0; - - if(strcmp(p, "") == 0) - return 1; - - /* try to match against system name (i.e. for ssh) */ - if(gethostname(buf, sizeof buf) == 0){ - if(strcmp(p, buf) == 0) - return 1; - if(strncmp(p, buf, strlen(p)) == 0 && buf[strlen(p)]=='.') - return 1; - } - - return 0; -} - -/* - * Cut and paste. Just couldn't stand to make this simple... - */ - -typedef struct Clip Clip; -struct Clip -{ - char buf[SnarfSize]; - QLock lk; -}; -Clip clip; - -#undef long /* sic */ -#undef ulong - -static char* -_xgetsnarf(Display *xd) -{ - uchar *data, *xdata; - Atom clipboard, type, prop; - unsigned long len, lastlen, dummy; - int fmt, i; - Window w; - - qlock(&clip.lk); - /* - * Have we snarfed recently and the X server hasn't caught up? - */ - if(putsnarf != assertsnarf) - goto mine; - - /* - * Is there a primary selection (highlighted text in an xterm)? - */ - clipboard = XA_PRIMARY; - w = XGetSelectionOwner(xd, XA_PRIMARY); - if(w == xdrawable){ - mine: - data = (uchar*)strdup(clip.buf); - goto out; - } - - /* - * If not, is there a clipboard selection? - */ - if(w == None && clipboard != None){ - clipboard = clipboard; - w = XGetSelectionOwner(xd, clipboard); - if(w == xdrawable) - goto mine; - } - - /* - * If not, give up. - */ - if(w == None){ - data = nil; - goto out; - } - - /* - * We should be waiting for SelectionNotify here, but it might never - * come, and we have no way to time out. Instead, we will clear - * local property #1, request our buddy to fill it in for us, and poll - * until he's done or we get tired of waiting. - * - * We should try to go for utf8string instead of XA_STRING, - * but that would add to the polling. - */ - prop = 1; - XChangeProperty(xd, xdrawable, prop, XA_STRING, 8, PropModeReplace, (uchar*)"", 0); - XConvertSelection(xd, clipboard, XA_STRING, prop, xdrawable, CurrentTime); - XFlush(xd); - lastlen = 0; - for(i=0; i<10 || (lastlen!=0 && i<30); i++){ - usleep(100*1000); - XGetWindowProperty(xd, xdrawable, prop, 0, 0, 0, AnyPropertyType, - &type, &fmt, &dummy, &len, &data); - if(lastlen == len && len > 0) - break; - lastlen = len; - } - if(i == 10){ - data = nil; - goto out; - } - /* get the property */ - data = nil; - XGetWindowProperty(xd, xdrawable, prop, 0, SnarfSize/sizeof(unsigned long), 0, - AnyPropertyType, &type, &fmt, &len, &dummy, &xdata); - if((type != XA_STRING && type != utf8string) || len == 0){ - if(xdata) - XFree(xdata); - data = nil; - }else{ - if(xdata){ - data = (uchar*)strdup((char*)xdata); - XFree(xdata); - }else - data = nil; - } -out: - qunlock(&clip.lk); - return (char*)data; -} - -static void -_xputsnarf(Display *xd, char *data) -{ - XButtonEvent e; - - if(strlen(data) >= SnarfSize) - return; - qlock(&clip.lk); - strcpy(clip.buf, data); - - /* leave note for mouse proc to assert selection ownership */ - putsnarf++; - - /* send mouse a fake event so snarf is announced */ - memset(&e, 0, sizeof e); - e.type = ButtonPress; - e.window = xdrawable; - e.state = ~0; - e.button = ~0; - XSendEvent(xd, xdrawable, True, ButtonPressMask, (XEvent*)&e); - XFlush(xd); - qunlock(&clip.lk); -} - -static void -xselect(XEvent *e, Display *xd) -{ - char *name; - XEvent r; - XSelectionRequestEvent *xe; - Atom a[4]; - - if(e->xany.type != SelectionRequest) - return; - - memset(&r, 0, sizeof r); - xe = (XSelectionRequestEvent*)e; -if(0) iprint("xselect target=%d requestor=%d property=%d selection=%d\n", - xe->target, xe->requestor, xe->property, xe->selection); - r.xselection.property = xe->property; - if(xe->target == targets){ - a[0] = XA_STRING; - a[1] = utf8string; - a[2] = text; - a[3] = compoundtext; - - XChangeProperty(xd, xe->requestor, xe->property, xe->target, - 8, PropModeReplace, (uchar*)a, sizeof a); - }else if(xe->target == XA_STRING || xe->target == utf8string || xe->target == text || xe->target == compoundtext){ - /* if the target is STRING we're supposed to reply with Latin1 XXX */ - qlock(&clip.lk); - XChangeProperty(xd, xe->requestor, xe->property, xe->target, - 8, PropModeReplace, (uchar*)clip.buf, strlen(clip.buf)); - qunlock(&clip.lk); - }else{ - iprint("get %d\n", xe->target); - name = XGetAtomName(xd, xe->target); - if(name == nil) - iprint("XGetAtomName failed\n"); - else if(strcmp(name, "TIMESTAMP") != 0) - iprint("%s: cannot handle selection request for '%s' (%d)\n", argv0, name, (int)xe->target); - r.xselection.property = None; - } - - r.xselection.display = xe->display; - /* r.xselection.property filled above */ - r.xselection.target = xe->target; - r.xselection.type = SelectionNotify; - r.xselection.requestor = xe->requestor; - r.xselection.time = xe->time; - r.xselection.send_event = True; - r.xselection.selection = xe->selection; - XSendEvent(xd, xe->requestor, False, 0, &r); - XFlush(xd); -} - -char* -clipread(void) -{ - return _xgetsnarf(xsnarfcon); -} - -int -clipwrite(char *buf) -{ - _xputsnarf(xsnarfcon, buf); - return 0; -} - diff --git a/sys/src/cmd/unix/drawterm/gui-x11/xmem.h b/sys/src/cmd/unix/drawterm/gui-x11/xmem.h deleted file mode 100644 index 32726998d..000000000 --- a/sys/src/cmd/unix/drawterm/gui-x11/xmem.h +++ /dev/null @@ -1,60 +0,0 @@ -#define Font XXFont -#define Screen XXScreen -#define Display XXDisplay - -#include <X11/Xlib.h> -/* #include <X11/Xlibint.h> */ -#include <X11/Xatom.h> -#include <X11/Xutil.h> -#include <X11/IntrinsicP.h> -#include <X11/StringDefs.h> - -#undef Font -#undef Screen -#undef Display - -/* - * Structure pointed to by X field of Memimage - */ -typedef struct Xmem Xmem; - -enum -{ - PMundef = ~0 /* undefined pixmap id */ -}; - - -struct Xmem -{ - int pmid; /* pixmap id for screen ldepth instance */ - XImage *xi; /* local image if we currenty have the data */ - int dirty; - Rectangle dirtyr; - Rectangle r; - uintptr pc; /* who wrote into xi */ -}; - -extern int xtblbit; -extern int x24bitswap; -extern int plan9tox11[]; -extern int x11toplan9[]; -extern int xscreendepth; -extern XXDisplay *xdisplay; -extern Drawable xscreenid; -extern Visual *xvis; -extern GC xgcfill, xgcfill0; -extern int xgcfillcolor, xgcfillcolor0; -extern GC xgccopy, xgccopy0; -extern GC xgczero, xgczero0; -extern int xgczeropm, xgczeropm0; -extern GC xgcsimplesrc, xgcsimplesrc0; -extern int xgcsimplecolor, xgcsimplecolor0, xgcsimplepm, xgcsimplepm0; -extern GC xgcreplsrc, xgcreplsrc0; -extern int xgcreplsrcpm, xgcreplsrcpm0, xgcreplsrctile, xgcreplsrctile0; -extern XImage* allocXdata(Memimage*, Rectangle); -extern void putXdata(Memimage*, Rectangle); -extern XImage* getXdata(Memimage*, Rectangle); -extern void freeXdata(Memimage*); -extern void dirtyXdata(Memimage*, Rectangle); -extern ulong xscreenchan; -extern void xfillcolor(Memimage*, Rectangle, ulong); diff --git a/sys/src/cmd/unix/drawterm/include/9windows.h b/sys/src/cmd/unix/drawterm/include/9windows.h deleted file mode 100644 index e779475b8..000000000 --- a/sys/src/cmd/unix/drawterm/include/9windows.h +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> -#include <fcntl.h> -#include <io.h> -#include <setjmp.h> -#include <direct.h> -#include <process.h> -#include <time.h> -#include <assert.h> -#include <stdarg.h> - -/* disable various silly warnings */ -#ifdef MSVC -#pragma warning( disable : 4245 4305 4244 4102 4761 4090 4028 4024) -#endif - -typedef __int64 p9_vlong; -typedef unsigned __int64 p9_uvlong; -typedef unsigned uintptr; diff --git a/sys/src/cmd/unix/drawterm/include/auth.h b/sys/src/cmd/unix/drawterm/include/auth.h deleted file mode 100644 index bf89368a5..000000000 --- a/sys/src/cmd/unix/drawterm/include/auth.h +++ /dev/null @@ -1,151 +0,0 @@ -#ifdef PLAN9 -#pragma src "/sys/src/libauth" -#pragma lib "libauth.a" -#endif - -/* - * Interface for typical callers. - */ - -typedef struct AuthInfo AuthInfo; -typedef struct Chalstate Chalstate; -typedef struct Chapreply Chapreply; -typedef struct MSchapreply MSchapreply; -typedef struct UserPasswd UserPasswd; -typedef struct AuthRpc AuthRpc; - -enum -{ - MAXCHLEN= 256, /* max challenge length */ - AMAXNAMELEN= 256, /* maximum name length */ - MD5LEN= 16, - - ARok = 0, /* rpc return values */ - ARdone, - ARerror, - ARneedkey, - ARbadkey, - ARwritenext, - ARtoosmall, - ARtoobig, - ARrpcfailure, - ARphase, - - AuthRpcMax = 4096, -}; - -struct AuthRpc -{ - int afd; - char ibuf[AuthRpcMax]; - char obuf[AuthRpcMax]; - char *arg; - uint narg; -}; - -struct AuthInfo -{ - char *cuid; /* caller id */ - char *suid; /* server id */ - char *cap; /* capability (only valid on server side) */ - int nsecret; /* length of secret */ - uchar *secret; /* secret */ -}; - -struct Chalstate -{ - char *user; - char chal[MAXCHLEN]; - int nchal; - void *resp; - int nresp; - -/* for implementation only */ - int afd; /* to factotum */ - AuthRpc *rpc; /* to factotum */ - char userbuf[AMAXNAMELEN]; /* temp space if needed */ - int userinchal; /* user was sent to obtain challenge */ -}; - -struct Chapreply /* for protocol "chap" */ -{ - uchar id; - char resp[MD5LEN]; -}; - -struct MSchapreply /* for protocol "mschap" */ -{ - char LMresp[24]; /* Lan Manager response */ - char NTresp[24]; /* NT response */ -}; - -struct UserPasswd -{ - char *user; - char *passwd; -}; - -extern int newns(char*, char*); -extern int addns(char*, char*); - -extern int noworld(char*); -extern int amount(int, char*, int, char*); - -/* these two may get generalized away -rsc */ -extern int login(char*, char*, char*); -extern int httpauth(char*, char*); - -typedef struct Attr Attr; -typedef struct String String; -enum { - AttrNameval, /* name=val -- when matching, must have name=val */ - AttrQuery, /* name? -- when matching, must be present */ - AttrDefault, /* name:=val -- when matching, if present must match INTERNAL */ -}; -struct Attr -{ - int type; - Attr *next; - char *name; - char *val; -}; - -typedef int AuthGetkey(char*); - -int _attrfmt(Fmt*); -Attr *_copyattr(Attr*); -Attr *_delattr(Attr*, char*); -Attr *_findattr(Attr*, char*); -void _freeattr(Attr*); -Attr *_mkattr(int, char*, char*, Attr*); -Attr *_parseattr(char*); -char *_strfindattr(Attr*, char*); -#ifdef VARARGCK -#pragma varargck type "A" Attr* -#endif - -extern AuthInfo* fauth_proxy(int, AuthRpc *rpc, AuthGetkey *getkey, char *params); -extern AuthInfo* auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...); -extern int auth_getkey(char*); -extern int (*amount_getkey)(char*); -extern void auth_freeAI(AuthInfo *ai); -extern int auth_chuid(AuthInfo *ai, char *ns); -extern Chalstate *auth_challenge(char*, ...); -extern AuthInfo* auth_response(Chalstate*); -extern int auth_respond(void*, uint, char*, uint, void*, uint, AuthGetkey *getkey, char*, ...); -extern void auth_freechal(Chalstate*); -extern AuthInfo* auth_userpasswd(char *user, char *passwd); -extern UserPasswd* auth_getuserpasswd(AuthGetkey *getkey, char*, ...); -extern AuthInfo* auth_getinfo(AuthRpc *rpc); -extern AuthRpc* auth_allocrpc(int afd); -extern Attr* auth_attr(AuthRpc *rpc); -extern void auth_freerpc(AuthRpc *rpc); -extern uint auth_rpc(AuthRpc *rpc, char *verb, void *a, int n); -extern int auth_wep(char*, char*, ...); - -#ifdef VARARGCK -#pragma varargck argpos auth_proxy 3 -#pragma varargck argpos auth_challenge 1 -#pragma varargck argpos auth_respond 3 -#pragma varargck argpos auth_getuserpasswd 2 -#endif diff --git a/sys/src/cmd/unix/drawterm/include/authsrv.h b/sys/src/cmd/unix/drawterm/include/authsrv.h deleted file mode 100644 index 4a486e9eb..000000000 --- a/sys/src/cmd/unix/drawterm/include/authsrv.h +++ /dev/null @@ -1,168 +0,0 @@ -#ifdef PLAN9 -#pragma src "/sys/src/libauthsrv" -#pragma lib "libauthsrv.a" -#endif - -/* - * Interface for talking to authentication server. - */ -typedef struct Ticket Ticket; -typedef struct Ticketreq Ticketreq; -typedef struct Authenticator Authenticator; -typedef struct Nvrsafe Nvrsafe; -typedef struct Passwordreq Passwordreq; -typedef struct OChapreply OChapreply; -typedef struct OMSchapreply OMSchapreply; - -enum -{ - ANAMELEN= 28, /* maximum size of name in previous proto */ - AERRLEN= 64, /* maximum size of errstr in previous proto */ - DOMLEN= 48, /* length of an authentication domain name */ - DESKEYLEN= 7, /* length of a des key for encrypt/decrypt */ - CHALLEN= 8, /* length of a plan9 sk1 challenge */ - NETCHLEN= 16, /* max network challenge length (used in AS protocol) */ - CONFIGLEN= 14, - SECRETLEN= 32, /* max length of a secret */ - - KEYDBOFF= 8, /* length of random data at the start of key file */ - OKEYDBLEN= ANAMELEN+DESKEYLEN+4+2, /* length of an entry in old key file */ - KEYDBLEN= OKEYDBLEN+SECRETLEN, /* length of an entry in key file */ - OMD5LEN= 16, -}; - -/* encryption numberings (anti-replay) */ -enum -{ - AuthTreq=1, /* ticket request */ - AuthChal=2, /* challenge box request */ - AuthPass=3, /* change password */ - AuthOK=4, /* fixed length reply follows */ - AuthErr=5, /* error follows */ - AuthMod=6, /* modify user */ - AuthApop=7, /* apop authentication for pop3 */ - AuthOKvar=9, /* variable length reply follows */ - AuthChap=10, /* chap authentication for ppp */ - AuthMSchap=11, /* MS chap authentication for ppp */ - AuthCram=12, /* CRAM verification for IMAP (RFC2195 & rfc2104) */ - AuthHttp=13, /* http domain login */ - AuthVNC=14, /* VNC server login (deprecated) */ - - - AuthTs=64, /* ticket encrypted with server's key */ - AuthTc, /* ticket encrypted with client's key */ - AuthAs, /* server generated authenticator */ - AuthAc, /* client generated authenticator */ - AuthTp, /* ticket encrypted with client's key for password change */ - AuthHr, /* http reply */ -}; - -struct Ticketreq -{ - char type; - char authid[ANAMELEN]; /* server's encryption id */ - char authdom[DOMLEN]; /* server's authentication domain */ - char chal[CHALLEN]; /* challenge from server */ - char hostid[ANAMELEN]; /* host's encryption id */ - char uid[ANAMELEN]; /* uid of requesting user on host */ -}; -#define TICKREQLEN (3*ANAMELEN+CHALLEN+DOMLEN+1) - -struct Ticket -{ - char num; /* replay protection */ - char chal[CHALLEN]; /* server challenge */ - char cuid[ANAMELEN]; /* uid on client */ - char suid[ANAMELEN]; /* uid on server */ - char key[DESKEYLEN]; /* nonce DES key */ -}; -#define TICKETLEN (CHALLEN+2*ANAMELEN+DESKEYLEN+1) - -struct Authenticator -{ - char num; /* replay protection */ - char chal[CHALLEN]; - ulong id; /* authenticator id, ++'d with each auth */ -}; -#define AUTHENTLEN (CHALLEN+4+1) - -struct Passwordreq -{ - char num; - char old[ANAMELEN]; - char new[ANAMELEN]; - char changesecret; - char secret[SECRETLEN]; /* new secret */ -}; -#define PASSREQLEN (2*ANAMELEN+1+1+SECRETLEN) - -struct OChapreply -{ - uchar id; - char uid[ANAMELEN]; - char resp[OMD5LEN]; -}; - -struct OMSchapreply -{ - char uid[ANAMELEN]; - char LMresp[24]; /* Lan Manager response */ - char NTresp[24]; /* NT response */ -}; - -/* - * convert to/from wire format - */ -extern int convT2M(Ticket*, char*, char*); -extern void convM2T(char*, Ticket*, char*); -extern void convM2Tnoenc(char*, Ticket*); -extern int convA2M(Authenticator*, char*, char*); -extern void convM2A(char*, Authenticator*, char*); -extern int convTR2M(Ticketreq*, char*); -extern void convM2TR(char*, Ticketreq*); -extern int convPR2M(Passwordreq*, char*, char*); -extern void convM2PR(char*, Passwordreq*, char*); - -/* - * convert ascii password to DES key - */ -extern int opasstokey(char*, char*); -extern int passtokey(char*, char*); - -/* - * Nvram interface - */ -enum { - NVwrite = 1<<0, /* always prompt and rewrite nvram */ - NVwriteonerr = 1<<1, /* prompt and rewrite nvram when corrupt */ -}; - -struct Nvrsafe -{ - char machkey[DESKEYLEN]; - uchar machsum; - char authkey[DESKEYLEN]; - uchar authsum; - char config[CONFIGLEN]; - uchar configsum; - char authid[ANAMELEN]; - uchar authidsum; - char authdom[DOMLEN]; - uchar authdomsum; -}; - -extern uchar nvcsum(void*, int); -extern int readnvram(Nvrsafe*, int); - -/* - * call up auth server - */ -extern int authdial(char *netroot, char *authdom); - -/* - * exchange messages with auth server - */ -extern int _asgetticket(int, char*, char*); -extern int _asrdresp(int, char*, int); -extern int sslnegotiate(int, Ticket*, char**, char**); -extern int srvsslnegotiate(int, Ticket*, char**, char**); diff --git a/sys/src/cmd/unix/drawterm/include/cursor.h b/sys/src/cmd/unix/drawterm/include/cursor.h deleted file mode 100644 index f305d8a29..000000000 --- a/sys/src/cmd/unix/drawterm/include/cursor.h +++ /dev/null @@ -1,6 +0,0 @@ -struct Cursor -{ - Point offset; - uchar clr[2*16]; - uchar set[2*16]; -}; diff --git a/sys/src/cmd/unix/drawterm/include/draw.h b/sys/src/cmd/unix/drawterm/include/draw.h deleted file mode 100644 index 712ddbdcd..000000000 --- a/sys/src/cmd/unix/drawterm/include/draw.h +++ /dev/null @@ -1,523 +0,0 @@ -#ifdef PLAN9 -#pragma src "/sys/src/libdraw" -#pragma lib "libdraw.a" -#endif - -typedef struct Cachefont Cachefont; -typedef struct Cacheinfo Cacheinfo; -typedef struct Cachesubf Cachesubf; -typedef struct Display Display; -typedef struct Font Font; -typedef struct Fontchar Fontchar; -typedef struct Image Image; -typedef struct Mouse Mouse; -typedef struct Point Point; -typedef struct Rectangle Rectangle; -typedef struct RGB RGB; -typedef struct Screen Screen; -typedef struct Subfont Subfont; - -#ifdef VARARGCK -#pragma varargck type "R" Rectangle -#pragma varargck type "P" Point -#endif -extern int Rfmt(Fmt*); -extern int Pfmt(Fmt*); - -enum -{ - DOpaque = 0xFFFFFFFF, - DTransparent = 0x00000000, /* only useful for allocimage, memfillcolor */ - DBlack = 0x000000FF, - DWhite = 0xFFFFFFFF, - DRed = 0xFF0000FF, - DGreen = 0x00FF00FF, - DBlue = 0x0000FFFF, - DCyan = 0x00FFFFFF, - DMagenta = 0xFF00FFFF, - DYellow = 0xFFFF00FF, - DPaleyellow = 0xFFFFAAFF, - DDarkyellow = 0xEEEE9EFF, - DDarkgreen = 0x448844FF, - DPalegreen = 0xAAFFAAFF, - DMedgreen = 0x88CC88FF, - DDarkblue = 0x000055FF, - DPalebluegreen= 0xAAFFFFFF, - DPaleblue = 0x0000BBFF, - DBluegreen = 0x008888FF, - DGreygreen = 0x55AAAAFF, - DPalegreygreen = 0x9EEEEEFF, - DYellowgreen = 0x99994CFF, - DMedblue = 0x000099FF, - DGreyblue = 0x005DBBFF, - DPalegreyblue = 0x4993DDFF, - DPurpleblue = 0x8888CCFF, - - DNotacolor = 0xFFFFFF00, - DNofill = DNotacolor, - -}; - -enum -{ - Displaybufsize = 8000, - ICOSSCALE = 1024, - Borderwidth = 4, -}; - -enum -{ - /* refresh methods */ - Refbackup = 0, - Refnone = 1, - Refmesg = 2 -}; -#define NOREFRESH ((void*)-1) - -enum -{ - /* line ends */ - Endsquare = 0, - Enddisc = 1, - Endarrow = 2, - Endmask = 0x1F -}; - -#define ARROW(a, b, c) (Endarrow|((a)<<5)|((b)<<14)|((c)<<23)) - -typedef enum -{ - /* Porter-Duff compositing operators */ - Clear = 0, - - SinD = 8, - DinS = 4, - SoutD = 2, - DoutS = 1, - - S = SinD|SoutD, - SoverD = SinD|SoutD|DoutS, - SatopD = SinD|DoutS, - SxorD = SoutD|DoutS, - - D = DinS|DoutS, - DoverS = DinS|DoutS|SoutD, - DatopS = DinS|SoutD, - DxorS = DoutS|SoutD, /* == SxorD */ - - Ncomp = 12, -} Drawop; - -/* - * image channel descriptors - */ -enum { - CRed = 0, - CGreen, - CBlue, - CGrey, - CAlpha, - CMap, - CIgnore, - NChan, -}; - -#define __DC(type, nbits) ((((type)&15)<<4)|((nbits)&15)) -#define CHAN1(a,b) __DC(a,b) -#define CHAN2(a,b,c,d) (CHAN1((a),(b))<<8|__DC((c),(d))) -#define CHAN3(a,b,c,d,e,f) (CHAN2((a),(b),(c),(d))<<8|__DC((e),(f))) -#define CHAN4(a,b,c,d,e,f,g,h) (CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h))) - -#define NBITS(c) ((c)&15) -#define TYPE(c) (((c)>>4)&15) - -enum { - GREY1 = CHAN1(CGrey, 1), - GREY2 = CHAN1(CGrey, 2), - GREY4 = CHAN1(CGrey, 4), - GREY8 = CHAN1(CGrey, 8), - CMAP8 = CHAN1(CMap, 8), - RGB15 = CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5), - RGB16 = CHAN3(CRed, 5, CGreen, 6, CBlue, 5), - RGB24 = CHAN3(CRed, 8, CGreen, 8, CBlue, 8), - BGR24 = CHAN3(CBlue, 8, CGreen, 8, CRed, 8), - RGBA32 = CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8), - ARGB32 = CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8), /* stupid VGAs */ - XRGB32 = CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8), - XBGR32 = CHAN4(CIgnore, 8, CBlue, 8, CGreen, 8, CRed, 8), -}; - -extern char* chantostr(char*, ulong); -extern ulong strtochan(char*); -extern int chantodepth(ulong); - -struct Point -{ - int x; - int y; -}; - -struct Rectangle -{ - Point min; - Point max; -}; - -typedef void (*Reffn)(Image*, Rectangle, void*); - -struct Screen -{ - Display *display; /* display holding data */ - int id; /* id of system-held Screen */ - Image *image; /* unused; for reference only */ - Image *fill; /* color to paint behind windows */ -}; - -struct Display -{ - QLock qlock; - int locking; /*program is using lockdisplay */ - int dirno; - int fd; - int reffd; - int ctlfd; - int imageid; - int local; - void (*error)(Display*, char*); - char *devdir; - char *windir; - char oldlabel[64]; - ulong dataqid; - Image *white; - Image *black; - Image *opaque; - Image *transparent; - Image *image; - uchar *buf; - int bufsize; - uchar *bufp; - Font *defaultfont; - Subfont *defaultsubfont; - Image *windows; - Image *screenimage; - int _isnewdisplay; -}; - -struct Image -{ - Display *display; /* display holding data */ - int id; /* id of system-held Image */ - Rectangle r; /* rectangle in data area, local coords */ - Rectangle clipr; /* clipping region */ - int depth; /* number of bits per pixel */ - ulong chan; - int repl; /* flag: data replicates to tile clipr */ - Screen *screen; /* 0 if not a window */ - Image *next; /* next in list of windows */ -}; - -struct RGB -{ - ulong red; - ulong green; - ulong blue; -}; - -/* - * Subfonts - * - * given char c, Subfont *f, Fontchar *i, and Point p, one says - * i = f->info+c; - * draw(b, Rect(p.x+i->left, p.y+i->top, - * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), - * color, f->bits, Pt(i->x, i->top)); - * p.x += i->width; - * to draw characters in the specified color (itself an Image) in Image b. - */ - -struct Fontchar -{ - int x; /* left edge of bits */ - uchar top; /* first non-zero scan-line */ - uchar bottom; /* last non-zero scan-line + 1 */ - char left; /* offset of baseline */ - uchar width; /* width of baseline */ -}; - -struct Subfont -{ - char *name; - short n; /* number of chars in font */ - uchar height; /* height of image */ - char ascent; /* top of image to baseline */ - Fontchar *info; /* n+1 character descriptors */ - Image *bits; /* of font */ - int ref; -}; - -enum -{ - /* starting values */ - LOG2NFCACHE = 6, - NFCACHE = (1<<LOG2NFCACHE), /* #chars cached */ - NFLOOK = 5, /* #chars to scan in cache */ - NFSUBF = 2, /* #subfonts to cache */ - /* max value */ - MAXFCACHE = 1024+NFLOOK, /* upper limit */ - MAXSUBF = 50, /* generous upper limit */ - /* deltas */ - DSUBF = 4, - /* expiry ages */ - SUBFAGE = 10000, - CACHEAGE = 10000 -}; - -struct Cachefont -{ - Rune min; /* lowest rune value to be taken from subfont */ - Rune max; /* highest rune value+1 to be taken from subfont */ - int offset; /* position in subfont of character at min */ - char *name; /* stored in font */ - char *subfontname; /* to access subfont */ -}; - -struct Cacheinfo -{ - ushort x; /* left edge of bits */ - uchar width; /* width of baseline */ - schar left; /* offset of baseline */ - Rune value; /* value of character at this slot in cache */ - ushort age; -}; - -struct Cachesubf -{ - ulong age; /* for replacement */ - Cachefont *cf; /* font info that owns us */ - Subfont *f; /* attached subfont */ -}; - -struct Font -{ - char *name; - Display *display; - short height; /* max height of image, interline spacing */ - short ascent; /* top of image to baseline */ - short width; /* widest so far; used in caching only */ - short nsub; /* number of subfonts */ - ulong age; /* increasing counter; used for LRU */ - int maxdepth; /* maximum depth of all loaded subfonts */ - int ncache; /* size of cache */ - int nsubf; /* size of subfont list */ - Cacheinfo *cache; - Cachesubf *subf; - Cachefont **sub; /* as read from file */ - Image *cacheimage; -}; - -#define Dx(r) ((r).max.x-(r).min.x) -#define Dy(r) ((r).max.y-(r).min.y) - -/* - * Image management - */ -extern Image* _allocimage(Image*, Display*, Rectangle, ulong, int, ulong, int, int); -extern Image* allocimage(Display*, Rectangle, ulong, int, ulong); -extern uchar* bufimage(Display*, int); -extern int bytesperline(Rectangle, int); -extern void closedisplay(Display*); -extern void drawerror(Display*, char*); -extern int flushimage(Display*, int); -extern int freeimage(Image*); -extern int _freeimage1(Image*); -extern int geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int); -extern int initdraw(void(*)(Display*, char*), char*, char*); -extern int newwindow(char*); -extern Display* initdisplay(char*, char*, void(*)(Display*, char*)); -extern int loadimage(Image*, Rectangle, uchar*, int); -extern int cloadimage(Image*, Rectangle, uchar*, int); -extern int getwindow(Display*, int); -extern int gengetwindow(Display*, char*, Image**, Screen**, int); -extern Image* readimage(Display*, int, int); -extern Image* creadimage(Display*, int, int); -extern int unloadimage(Image*, Rectangle, uchar*, int); -extern int wordsperline(Rectangle, int); -extern int writeimage(int, Image*, int); -extern Image* namedimage(Display*, char*); -extern int nameimage(Image*, char*, int); -extern Image* allocimagemix(Display*, ulong, ulong); - -/* - * Colors - */ -extern void readcolmap(Display*, RGB*); -extern void writecolmap(Display*, RGB*); -extern ulong setalpha(ulong, uchar); - -/* - * Windows - */ -extern Screen* allocscreen(Image*, Image*, int); -extern Image* _allocwindow(Image*, Screen*, Rectangle, int, ulong); -extern Image* allocwindow(Screen*, Rectangle, int, ulong); -extern void bottomnwindows(Image**, int); -extern void bottomwindow(Image*); -extern int freescreen(Screen*); -extern Screen* publicscreen(Display*, int, ulong); -extern void topnwindows(Image**, int); -extern void topwindow(Image*); -extern int originwindow(Image*, Point, Point); - -/* - * Geometry - */ -extern Point Pt(int, int); -extern Rectangle Rect(int, int, int, int); -extern Rectangle Rpt(Point, Point); -extern Point addpt(Point, Point); -extern Point subpt(Point, Point); -extern Point divpt(Point, int); -extern Point mulpt(Point, int); -extern int eqpt(Point, Point); -extern int eqrect(Rectangle, Rectangle); -extern Rectangle insetrect(Rectangle, int); -extern Rectangle rectaddpt(Rectangle, Point); -extern Rectangle rectsubpt(Rectangle, Point); -extern Rectangle canonrect(Rectangle); -extern int rectXrect(Rectangle, Rectangle); -extern int rectinrect(Rectangle, Rectangle); -extern void combinerect(Rectangle*, Rectangle); -extern int rectclip(Rectangle*, Rectangle); -extern int ptinrect(Point, Rectangle); -extern void replclipr(Image*, int, Rectangle); -extern int drawreplxy(int, int, int); /* used to be drawsetxy */ -extern Point drawrepl(Rectangle, Point); -extern int rgb2cmap(int, int, int); -extern int cmap2rgb(int); -extern int cmap2rgba(int); -extern void icossin(int, int*, int*); -extern void icossin2(int, int, int*, int*); - -/* - * Graphics - */ -extern void draw(Image*, Rectangle, Image*, Image*, Point); -extern void drawop(Image*, Rectangle, Image*, Image*, Point, Drawop); -extern void gendraw(Image*, Rectangle, Image*, Point, Image*, Point); -extern void gendrawop(Image*, Rectangle, Image*, Point, Image*, Point, Drawop); -extern void line(Image*, Point, Point, int, int, int, Image*, Point); -extern void lineop(Image*, Point, Point, int, int, int, Image*, Point, Drawop); -extern void poly(Image*, Point*, int, int, int, int, Image*, Point); -extern void polyop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); -extern void fillpoly(Image*, Point*, int, int, Image*, Point); -extern void fillpolyop(Image*, Point*, int, int, Image*, Point, Drawop); -extern Point string(Image*, Point, Image*, Point, Font*, char*); -extern Point stringop(Image*, Point, Image*, Point, Font*, char*, Drawop); -extern Point stringn(Image*, Point, Image*, Point, Font*, char*, int); -extern Point stringnop(Image*, Point, Image*, Point, Font*, char*, int, Drawop); -extern Point runestring(Image*, Point, Image*, Point, Font*, Rune*); -extern Point runestringop(Image*, Point, Image*, Point, Font*, Rune*, Drawop); -extern Point runestringn(Image*, Point, Image*, Point, Font*, Rune*, int); -extern Point runestringnop(Image*, Point, Image*, Point, Font*, Rune*, int, Drawop); -extern Point stringbg(Image*, Point, Image*, Point, Font*, char*, Image*, Point); -extern Point stringbgop(Image*, Point, Image*, Point, Font*, char*, Image*, Point, Drawop); -extern Point stringnbg(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point); -extern Point stringnbgop(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point, Drawop); -extern Point runestringbg(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point); -extern Point runestringbgop(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point, Drawop); -extern Point runestringnbg(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point); -extern Point runestringnbgop(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point, Drawop); -extern Point _string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rectangle, Image*, Point, Drawop); -extern Point stringsubfont(Image*, Point, Image*, Subfont*, char*); -extern int bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point); -extern int bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop); -extern int bezspline(Image*, Point*, int, int, int, int, Image*, Point); -extern int bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); -extern int bezsplinepts(Point*, int, Point**); -extern int fillbezier(Image*, Point, Point, Point, Point, int, Image*, Point); -extern int fillbezierop(Image*, Point, Point, Point, Point, int, Image*, Point, Drawop); -extern int fillbezspline(Image*, Point*, int, int, Image*, Point); -extern int fillbezsplineop(Image*, Point*, int, int, Image*, Point, Drawop); -extern void ellipse(Image*, Point, int, int, int, Image*, Point); -extern void ellipseop(Image*, Point, int, int, int, Image*, Point, Drawop); -extern void fillellipse(Image*, Point, int, int, Image*, Point); -extern void fillellipseop(Image*, Point, int, int, Image*, Point, Drawop); -extern void arc(Image*, Point, int, int, int, Image*, Point, int, int); -extern void arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop); -extern void fillarc(Image*, Point, int, int, Image*, Point, int, int); -extern void fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop); -extern void border(Image*, Rectangle, int, Image*, Point); -extern void borderop(Image*, Rectangle, int, Image*, Point, Drawop); - -/* - * Font management - */ -extern Font* openfont(Display*, char*); -extern Font* buildfont(Display*, char*, char*); -extern void freefont(Font*); -extern Font* mkfont(Subfont*, Rune); -extern int cachechars(Font*, char**, Rune**, ushort*, int, int*, char**); -extern void agefont(Font*); -extern Subfont* allocsubfont(char*, int, int, int, Fontchar*, Image*); -extern Subfont* lookupsubfont(Display*, char*); -extern void installsubfont(char*, Subfont*); -extern void uninstallsubfont(Subfont*); -extern void freesubfont(Subfont*); -extern Subfont* readsubfont(Display*, char*, int, int); -extern Subfont* readsubfonti(Display*, char*, int, Image*, int); -extern int writesubfont(int, Subfont*); -extern void _unpackinfo(Fontchar*, uchar*, int); -extern Point stringsize(Font*, char*); -extern int stringwidth(Font*, char*); -extern int stringnwidth(Font*, char*, int); -extern Point runestringsize(Font*, Rune*); -extern int runestringwidth(Font*, Rune*); -extern int runestringnwidth(Font*, Rune*, int); -extern Point strsubfontwidth(Subfont*, char*); -extern int loadchar(Font*, Rune, Cacheinfo*, int, int, char**); -extern char* subfontname(char*, char*, int); -extern Subfont* _getsubfont(Display*, char*); -extern Subfont* getdefont(Display*); -extern void lockdisplay(Display*); -extern void unlockdisplay(Display*); -extern int drawlsetrefresh(ulong, int, void*, void*); - -/* - * Predefined - */ -extern uchar defontdata[]; -extern int sizeofdefont; -extern Point ZP; -extern Rectangle ZR; - -/* - * Set up by initdraw() - */ -extern Display *display; -extern Font *font; -/* extern Image *screen; */ -extern Screen *_screen; -extern int _cursorfd; -extern int _drawdebug; /* set to 1 to see errors from flushimage */ -extern void _setdrawop(Display*, Drawop); - -#define BGSHORT(p) (((p)[0]<<0) | ((p)[1]<<8)) -#define BGLONG(p) ((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16)) -#define BPSHORT(p, v) ((p)[0]=(v), (p)[1]=((v)>>8)) -#define BPLONG(p, v) (BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16)) - -/* - * Compressed image file parameters and helper routines - */ -#define NMATCH 3 /* shortest match possible */ -#define NRUN (NMATCH+31) /* longest match possible */ -#define NMEM 1024 /* window size */ -#define NDUMP 128 /* maximum length of dump */ -#define NCBLOCK 6000 /* size of compressed blocks */ -extern void _twiddlecompressed(uchar*, int); -extern int _compblocksize(Rectangle, int); - -/* XXX backwards helps; should go */ -extern int log2[]; -extern ulong drawld2chan[]; -extern void drawsetdebug(int); diff --git a/sys/src/cmd/unix/drawterm/include/dtos.h b/sys/src/cmd/unix/drawterm/include/dtos.h deleted file mode 100644 index 79c208bab..000000000 --- a/sys/src/cmd/unix/drawterm/include/dtos.h +++ /dev/null @@ -1,15 +0,0 @@ -#if defined(linux) || defined(IRIX) || defined(SOLARIS) || defined(OSF1) || defined(__FreeBSD__) || defined(__APPLE__) || defined(__NetBSD__) || defined(__sun) || defined(sun) || defined(__OpenBSD__) -# include "unix.h" -# ifdef __APPLE__ -# define panic dt_panic -# endif -#elif defined(WINDOWS) -# include "9windows.h" -# define main mymain -#else -# error "Define an OS" -#endif - -#ifdef IRIX -typedef int socklen_t; -#endif diff --git a/sys/src/cmd/unix/drawterm/include/fcall.h b/sys/src/cmd/unix/drawterm/include/fcall.h deleted file mode 100644 index b1aa5eb90..000000000 --- a/sys/src/cmd/unix/drawterm/include/fcall.h +++ /dev/null @@ -1,110 +0,0 @@ -#define VERSION9P "9P2000" - -#define MAXWELEM 16 - -typedef -struct Fcall -{ - uchar type; - u32int fid; - ushort tag; - u32int msize; /* Tversion, Rversion */ - char *version; /* Tversion, Rversion */ - ushort oldtag; /* Tflush */ - char *ename; /* Rerror */ - Qid qid; /* Rattach, Ropen, Rcreate */ - u32int iounit; /* Ropen, Rcreate */ - Qid aqid; /* Rauth */ - u32int afid; /* Tauth, Tattach */ - char *uname; /* Tauth, Tattach */ - char *aname; /* Tauth, Tattach */ - u32int perm; /* Tcreate */ - char *name; /* Tcreate */ - uchar mode; /* Tcreate, Topen */ - u32int newfid; /* Twalk */ - ushort nwname; /* Twalk */ - char *wname[MAXWELEM]; /* Twalk */ - ushort nwqid; /* Rwalk */ - Qid wqid[MAXWELEM]; /* Rwalk */ - vlong offset; /* Tread, Twrite */ - u32int count; /* Tread, Twrite, Rread */ - char *data; /* Twrite, Rread */ - ushort nstat; /* Twstat, Rstat */ - uchar *stat; /* Twstat, Rstat */ -} Fcall; - - -#define GBIT8(p) ((p)[0]) -#define GBIT16(p) ((p)[0]|((p)[1]<<8)) -#define GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) -#define GBIT64(p) ((ulong)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\ - ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32)) - -#define PBIT8(p,v) (p)[0]=(v) -#define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8 -#define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24 -#define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\ - (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56 - -#define BIT8SZ 1 -#define BIT16SZ 2 -#define BIT32SZ 4 -#define BIT64SZ 8 -#define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ) - -/* STATFIXLEN includes leading 16-bit count */ -/* The count, however, excludes itself; total size is BIT16SZ+count */ -#define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */ - -#define NOTAG (ushort)~0U /* Dummy tag */ -#define NOFID (u32int)~0U /* Dummy fid */ -#define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */ - -enum -{ - Tversion = 100, - Rversion, - Tauth = 102, - Rauth, - Tattach = 104, - Rattach, - Terror = 106, /* illegal */ - Rerror, - Tflush = 108, - Rflush, - Twalk = 110, - Rwalk, - Topen = 112, - Ropen, - Tcreate = 114, - Rcreate, - Tread = 116, - Rread, - Twrite = 118, - Rwrite, - Tclunk = 120, - Rclunk, - Tremove = 122, - Rremove, - Tstat = 124, - Rstat, - Twstat = 126, - Rwstat, - Tmax, -}; - -uint convM2S(uchar*, uint, Fcall*); -uint convS2M(Fcall*, uchar*, uint); -uint sizeS2M(Fcall*); - -int statcheck(uchar *abuf, uint nbuf); -uint convM2D(uchar*, uint, Dir*, char*); -uint convD2M(Dir*, uchar*, uint); -uint sizeD2M(Dir*); - -int fcallfmt(Fmt*); -int dirfmt(Fmt*); -int dirmodefmt(Fmt*); - -int read9pmsg(int, void*, uint); - diff --git a/sys/src/cmd/unix/drawterm/include/keyboard.h b/sys/src/cmd/unix/drawterm/include/keyboard.h deleted file mode 100644 index d5d89ab00..000000000 --- a/sys/src/cmd/unix/drawterm/include/keyboard.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifdef PLAN9 -#pragma src "/sys/src/libdraw" -#pragma lib "libdraw.a" -#endif - -typedef struct Keyboardctl Keyboardctl; -typedef struct Channel Channel; - -struct Keyboardctl -{ - Channel *c; /* chan(Rune)[20] */ - - char *file; - int consfd; /* to cons file */ - int ctlfd; /* to ctl file */ - int pid; /* of slave proc */ -}; - - -extern Keyboardctl* initkeyboard(char*); -extern int ctlkeyboard(Keyboardctl*, char*); -extern void closekeyboard(Keyboardctl*); - -enum { - KF= 0xF000, /* Rune: beginning of private Unicode space */ - Spec= 0xF800, - /* KF|1, KF|2, ..., KF|0xC is F1, F2, ..., F12 */ - Khome= KF|0x0D, - Kup= KF|0x0E, - Kpgup= KF|0x0F, - Kprint= KF|0x10, - Kleft= KF|0x11, - Kright= KF|0x12, - Kdown= Spec|0x00, - Kview= Spec|0x00, - Kpgdown= KF|0x13, - Kins= KF|0x14, - Kend= KF|0x18, - - Kalt= KF|0x15, - Kshift= KF|0x16, - Kctl= KF|0x17, -}; - diff --git a/sys/src/cmd/unix/drawterm/include/lib.h b/sys/src/cmd/unix/drawterm/include/lib.h deleted file mode 100644 index db9921fb7..000000000 --- a/sys/src/cmd/unix/drawterm/include/lib.h +++ /dev/null @@ -1,274 +0,0 @@ -/* avoid name conflicts */ -#define accept pm_accept -#define listen pm_listen -#define sleep ksleep -#define wakeup kwakeup -#define strtod fmtstrtod - -/* conflicts on some os's */ -#define encrypt libencrypt -#define decrypt libdecrypt -#define oserror liboserror -#define clone libclone -#define atexit libatexit -#define log2 liblog2 -#define log liblog -#define reboot libreboot -#define strtoll libstrtoll -#undef timeradd -#define timeradd xtimeradd - - -#define nil ((void*)0) - -typedef unsigned char p9_uchar; -typedef unsigned int p9_uint; -typedef unsigned int p9_ulong; -typedef int p9_long; -typedef signed char p9_schar; -typedef unsigned short p9_ushort; -typedef unsigned short Rune; -typedef unsigned int p9_u32int; -typedef p9_u32int mpdigit; - -/* make sure we don't conflict with predefined types */ -#define schar p9_schar -#define uchar p9_uchar -#define ushort p9_ushort -#define uint p9_uint -#define u32int p9_u32int - -/* #define long int rather than p9_long so that "unsigned long" is valid */ -#define long int -#define ulong p9_ulong -#define vlong p9_vlong -#define uvlong p9_uvlong - -#define nelem(x) (sizeof(x)/sizeof((x)[0])) -#define SET(x) ((x)=0) -#define USED(x) if(x);else - -enum -{ - UTFmax = 3, /* maximum bytes per rune */ - Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ - Runeself = 0x80, /* rune and UTF sequences are the same (<) */ - Runeerror = 0x80 /* decoding error in UTF */ -}; - -/* - * new rune routines - */ -extern int runetochar(char*, Rune*); -extern int chartorune(Rune*, char*); -extern int runelen(long); -extern int fullrune(char*, int); - -extern int wstrtoutf(char*, Rune*, int); -extern int wstrutflen(Rune*); - -/* - * rune routines from converted str routines - */ -extern long utflen(char*); -extern char* utfrune(char*, long); -extern char* utfrrune(char*, long); - -/* - * Syscall data structures - */ -#define MORDER 0x0003 /* mask for bits defining order of mounting */ -#define MREPL 0x0000 /* mount replaces object */ -#define MBEFORE 0x0001 /* mount goes before others in union directory */ -#define MAFTER 0x0002 /* mount goes after others in union directory */ -#define MCREATE 0x0004 /* permit creation in mounted directory */ -#define MCACHE 0x0010 /* cache some data */ -#define MMASK 0x0017 /* all bits on */ - -#define OREAD 0 /* open for read */ -#define OWRITE 1 /* write */ -#define ORDWR 2 /* read and write */ -#define OEXEC 3 /* execute, == read but check execute permission */ -#define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ -#define OCEXEC 32 /* or'ed in, close on exec */ -#define ORCLOSE 64 /* or'ed in, remove on close */ -#define OEXCL 0x1000 /* or'ed in, exclusive create */ - -#define NCONT 0 /* continue after note */ -#define NDFLT 1 /* terminate after note */ -#define NSAVE 2 /* clear note but hold state */ -#define NRSTR 3 /* restore saved state */ - -#define ERRMAX 128 /* max length of error string */ -#define KNAMELEN 28 /* max length of name held in kernel */ - -/* bits in Qid.type */ -#define QTDIR 0x80 /* type bit for directories */ -#define QTAPPEND 0x40 /* type bit for append only files */ -#define QTEXCL 0x20 /* type bit for exclusive use files */ -#define QTMOUNT 0x10 /* type bit for mounted channel */ -#define QTAUTH 0x08 /* type bit for authentication file */ -#define QTFILE 0x00 /* plain file */ - -/* bits in Dir.mode */ -#define DMDIR 0x80000000 /* mode bit for directories */ -#define DMAPPEND 0x40000000 /* mode bit for append only files */ -#define DMEXCL 0x20000000 /* mode bit for exclusive use files */ -#define DMMOUNT 0x10000000 /* mode bit for mounted channel */ -#define DMAUTH 0x08000000 /* mode bit for authentication files */ -#define DMREAD 0x4 /* mode bit for read permission */ -#define DMWRITE 0x2 /* mode bit for write permission */ -#define DMEXEC 0x1 /* mode bit for execute permission */ - -typedef struct Lock -{ -#ifdef PTHREAD - int init; - pthread_mutex_t mutex; -#else - long key; -#endif -} Lock; - -typedef struct QLock -{ - Lock lk; - struct Proc *hold; - struct Proc *first; - struct Proc *last; -} QLock; - -typedef -struct Qid -{ - uvlong path; - ulong vers; - uchar type; -} Qid; - -typedef -struct Dir { - /* system-modified data */ - ushort type; /* server type */ - uint dev; /* server subtype */ - /* file data */ - Qid qid; /* unique id from server */ - ulong mode; /* permissions */ - ulong atime; /* last read time */ - ulong mtime; /* last write time */ - vlong length; /* file length */ - char *name; /* last element of path */ - char *uid; /* owner name */ - char *gid; /* group name */ - char *muid; /* last modifier name */ -} Dir; - -typedef -struct Waitmsg -{ - int pid; /* of loved one */ - ulong time[3]; /* of loved one & descendants */ - char *msg; -} Waitmsg; - -/* - * print routines - */ -typedef struct Fmt Fmt; -struct Fmt{ - uchar runes; /* output buffer is runes or chars? */ - void *start; /* of buffer */ - void *to; /* current place in the buffer */ - void *stop; /* end of the buffer; overwritten if flush fails */ - int (*flush)(Fmt *); /* called when to == stop */ - void *farg; /* to make flush a closure */ - int nfmt; /* num chars formatted so far */ - va_list args; /* args passed to dofmt */ - int r; /* % format Rune */ - int width; - int prec; - ulong flags; -}; - -enum{ - FmtWidth = 1, - FmtLeft = FmtWidth << 1, - FmtPrec = FmtLeft << 1, - FmtSharp = FmtPrec << 1, - FmtSpace = FmtSharp << 1, - FmtSign = FmtSpace << 1, - FmtZero = FmtSign << 1, - FmtUnsigned = FmtZero << 1, - FmtShort = FmtUnsigned << 1, - FmtLong = FmtShort << 1, - FmtVLong = FmtLong << 1, - FmtComma = FmtVLong << 1, - FmtByte = FmtComma << 1, - - FmtFlag = FmtByte << 1, - FmtLDouble = FmtFlag << 1 -}; - -extern int print(char*, ...); -extern char* seprint(char*, char*, char*, ...); -extern char* vseprint(char*, char*, char*, va_list); -extern int snprint(char*, int, char*, ...); -extern int vsnprint(char*, int, char*, va_list); -extern char* smprint(char*, ...); -extern char* vsmprint(char*, va_list); -extern int sprint(char*, char*, ...); -extern int fprint(int, char*, ...); -extern int vfprint(int, char*, va_list); - -extern int (*doquote)(int); -extern int runesprint(Rune*, char*, ...); -extern int runesnprint(Rune*, int, char*, ...); -extern int runevsnprint(Rune*, int, char*, va_list); -extern Rune* runeseprint(Rune*, Rune*, char*, ...); -extern Rune* runevseprint(Rune*, Rune*, char*, va_list); -extern Rune* runesmprint(char*, ...); -extern Rune* runevsmprint(char*, va_list); - -extern Rune* runestrchr(Rune*, Rune); -extern long runestrlen(Rune*); -extern Rune* runestrstr(Rune*, Rune*); - -extern int fmtfdinit(Fmt*, int, char*, int); -extern int fmtfdflush(Fmt*); -extern int fmtstrinit(Fmt*); -extern int fmtinstall(int, int (*)(Fmt*)); -extern char* fmtstrflush(Fmt*); -extern int runefmtstrinit(Fmt*); -extern Rune* runefmtstrflush(Fmt*); -extern int encodefmt(Fmt*); -extern int fmtstrcpy(Fmt*, char*); -extern int fmtprint(Fmt*, char*, ...); -extern int fmtvprint(Fmt*, char*, va_list); -extern void* mallocz(ulong, int); - -extern uintptr getcallerpc(void*); -extern char* cleanname(char*); -extern void sysfatal(char*, ...); -extern char* strecpy(char*, char*, char*); - -extern int tokenize(char*, char**, int); -extern int getfields(char*, char**, int, int, char*); -extern char* utfecpy(char*, char*, char*); -extern long tas(long*); -extern void quotefmtinstall(void); -extern int dec64(uchar*, int, char*, int); -extern int enc64(char*, int, uchar*, int); -extern int dec32(uchar*, int, char*, int); -extern int enc32(char*, int, uchar*, int); -extern int enc16(char*, int, uchar*, int); -void hnputs(void *p, unsigned short v); -extern int dofmt(Fmt*, char*); -extern double __NaN(void); -extern int __isNaN(double); -extern double strtod(const char*, char**); -extern int utfnlen(char*, long); -extern double __Inf(int); -extern int __isInf(double, int); - -extern int (*fmtdoquote)(int); - diff --git a/sys/src/cmd/unix/drawterm/include/libc.h b/sys/src/cmd/unix/drawterm/include/libc.h deleted file mode 100644 index 9ec90cb88..000000000 --- a/sys/src/cmd/unix/drawterm/include/libc.h +++ /dev/null @@ -1,3 +0,0 @@ -#include "lib.h" -#include "user.h" - diff --git a/sys/src/cmd/unix/drawterm/include/libsec.h b/sys/src/cmd/unix/drawterm/include/libsec.h deleted file mode 100644 index 7c187fa6f..000000000 --- a/sys/src/cmd/unix/drawterm/include/libsec.h +++ /dev/null @@ -1,340 +0,0 @@ - -#ifndef _MPINT -typedef struct mpint mpint; -#endif - -///////////////////////////////////////////////////////// -// AES definitions -///////////////////////////////////////////////////////// - -enum -{ - AESbsize= 16, - AESmaxkey= 32, - AESmaxrounds= 14 -}; - -typedef struct AESstate AESstate; -struct AESstate -{ - ulong setup; - int rounds; - int keybytes; - uchar key[AESmaxkey]; /* unexpanded key */ - u32int ekey[4*(AESmaxrounds + 1)]; /* encryption key */ - u32int dkey[4*(AESmaxrounds + 1)]; /* decryption key */ - uchar ivec[AESbsize]; /* initialization vector */ -}; - -void setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec); -void aesCBCencrypt(uchar *p, int len, AESstate *s); -void aesCBCdecrypt(uchar *p, int len, AESstate *s); - -///////////////////////////////////////////////////////// -// Blowfish Definitions -///////////////////////////////////////////////////////// - -enum -{ - BFbsize = 8, - BFrounds = 16 -}; - -// 16-round Blowfish -typedef struct BFstate BFstate; -struct BFstate -{ - ulong setup; - - uchar key[56]; - uchar ivec[8]; - - u32int pbox[BFrounds+2]; - u32int sbox[1024]; -}; - -void setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec); -void bfCBCencrypt(uchar*, int, BFstate*); -void bfCBCdecrypt(uchar*, int, BFstate*); -void bfECBencrypt(uchar*, int, BFstate*); -void bfECBdecrypt(uchar*, int, BFstate*); - -///////////////////////////////////////////////////////// -// DES definitions -///////////////////////////////////////////////////////// - -enum -{ - DESbsize= 8 -}; - -// single des -typedef struct DESstate DESstate; -struct DESstate -{ - ulong setup; - uchar key[8]; /* unexpanded key */ - ulong expanded[32]; /* expanded key */ - uchar ivec[8]; /* initialization vector */ -}; - -void setupDESstate(DESstate *s, uchar key[8], uchar *ivec); -void des_key_setup(uchar[8], ulong[32]); -void block_cipher(ulong*, uchar*, int); -void desCBCencrypt(uchar*, int, DESstate*); -void desCBCdecrypt(uchar*, int, DESstate*); -void desECBencrypt(uchar*, int, DESstate*); -void desECBdecrypt(uchar*, int, DESstate*); - -// for backward compatibility with 7 byte DES key format -void des56to64(uchar *k56, uchar *k64); -void des64to56(uchar *k64, uchar *k56); -void key_setup(uchar[7], ulong[32]); - -// triple des encrypt/decrypt orderings -enum { - DES3E= 0, - DES3D= 1, - DES3EEE= 0, - DES3EDE= 2, - DES3DED= 5, - DES3DDD= 7 -}; - -typedef struct DES3state DES3state; -struct DES3state -{ - ulong setup; - uchar key[3][8]; /* unexpanded key */ - ulong expanded[3][32]; /* expanded key */ - uchar ivec[8]; /* initialization vector */ -}; - -void setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec); -void triple_block_cipher(ulong keys[3][32], uchar*, int); -void des3CBCencrypt(uchar*, int, DES3state*); -void des3CBCdecrypt(uchar*, int, DES3state*); -void des3ECBencrypt(uchar*, int, DES3state*); -void des3ECBdecrypt(uchar*, int, DES3state*); - -///////////////////////////////////////////////////////// -// digests -///////////////////////////////////////////////////////// - -enum -{ - SHA1dlen= 20, /* SHA digest length */ - MD4dlen= 16, /* MD4 digest length */ - MD5dlen= 16 /* MD5 digest length */ -}; - -typedef struct DigestState DigestState; -struct DigestState -{ - ulong len; - u32int state[5]; - uchar buf[128]; - int blen; - char malloced; - char seeded; -}; -typedef struct DigestState SHAstate; /* obsolete name */ -typedef struct DigestState SHA1state; -typedef struct DigestState MD5state; -typedef struct DigestState MD4state; - -DigestState* md4(uchar*, ulong, uchar*, DigestState*); -DigestState* md5(uchar*, ulong, uchar*, DigestState*); -DigestState* sha1(uchar*, ulong, uchar*, DigestState*); -DigestState* hmac_md5(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); -DigestState* hmac_sha1(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); -char* sha1pickle(SHA1state*); -SHA1state* sha1unpickle(char*); - -///////////////////////////////////////////////////////// -// random number generation -///////////////////////////////////////////////////////// -void genrandom(uchar *buf, int nbytes); -void prng(uchar *buf, int nbytes); -ulong fastrand(void); -ulong nfastrand(ulong); - -///////////////////////////////////////////////////////// -// primes -///////////////////////////////////////////////////////// -void genprime(mpint *p, int n, int accuracy); // generate an n bit probable prime -void gensafeprime(mpint *p, mpint *alpha, int n, int accuracy); // prime and generator -void genstrongprime(mpint *p, int n, int accuracy); // generate an n bit strong prime -void DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]); -int probably_prime(mpint *n, int nrep); // miller-rabin test -int smallprimetest(mpint *p); // returns -1 if not prime, 0 otherwise - -///////////////////////////////////////////////////////// -// rc4 -///////////////////////////////////////////////////////// -typedef struct RC4state RC4state; -struct RC4state -{ - uchar state[256]; - uchar x; - uchar y; -}; - -void setupRC4state(RC4state*, uchar*, int); -void rc4(RC4state*, uchar*, int); -void rc4skip(RC4state*, int); -void rc4back(RC4state*, int); - -///////////////////////////////////////////////////////// -// rsa -///////////////////////////////////////////////////////// -typedef struct RSApub RSApub; -typedef struct RSApriv RSApriv; - -// public/encryption key -struct RSApub -{ - mpint *n; // modulus - mpint *ek; // exp (encryption key) -}; - -// private/decryption key -struct RSApriv -{ - RSApub pub; - - mpint *dk; // exp (decryption key) - - // precomputed values to help with chinese remainder theorem calc - mpint *p; - mpint *q; - mpint *kp; // dk mod p-1 - mpint *kq; // dk mod q-1 - mpint *c2; // (inv p) mod q -}; - -RSApriv* rsagen(int nlen, int elen, int rounds); -RSApriv* rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q); -mpint* rsaencrypt(RSApub *k, mpint *in, mpint *out); -mpint* rsadecrypt(RSApriv *k, mpint *in, mpint *out); -RSApub* rsapuballoc(void); -void rsapubfree(RSApub*); -RSApriv* rsaprivalloc(void); -void rsaprivfree(RSApriv*); -RSApub* rsaprivtopub(RSApriv*); -RSApub* X509toRSApub(uchar*, int, char*, int); -RSApriv* asn1toRSApriv(uchar*, int); -void asn1dump(uchar *der, int len); -uchar* decodepem(char *s, char *type, int *len); -uchar* X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen); -uchar* X509req(RSApriv *priv, char *subj, int *certlen); -char* X509verify(uchar *cert, int ncert, RSApub *pk); -void X509dump(uchar *cert, int ncert); -///////////////////////////////////////////////////////// -// elgamal -///////////////////////////////////////////////////////// -typedef struct EGpub EGpub; -typedef struct EGpriv EGpriv; -typedef struct EGsig EGsig; - -// public/encryption key -struct EGpub -{ - mpint *p; // modulus - mpint *alpha; // generator - mpint *key; // (encryption key) alpha**secret mod p -}; - -// private/decryption key -struct EGpriv -{ - EGpub pub; - mpint *secret; // (decryption key) -}; - -// signature -struct EGsig -{ - mpint *r, *s; -}; - -EGpriv* eggen(int nlen, int rounds); -mpint* egencrypt(EGpub *k, mpint *in, mpint *out); -mpint* egdecrypt(EGpriv *k, mpint *in, mpint *out); -EGsig* egsign(EGpriv *k, mpint *m); -int egverify(EGpub *k, EGsig *sig, mpint *m); -EGpub* egpuballoc(void); -void egpubfree(EGpub*); -EGpriv* egprivalloc(void); -void egprivfree(EGpriv*); -EGsig* egsigalloc(void); -void egsigfree(EGsig*); -EGpub* egprivtopub(EGpriv*); - -///////////////////////////////////////////////////////// -// dsa -///////////////////////////////////////////////////////// -typedef struct DSApub DSApub; -typedef struct DSApriv DSApriv; -typedef struct DSAsig DSAsig; - -// public/encryption key -struct DSApub -{ - mpint *p; // modulus - mpint *q; // group order, q divides p-1 - mpint *alpha; // group generator - mpint *key; // (encryption key) alpha**secret mod p -}; - -// private/decryption key -struct DSApriv -{ - DSApub pub; - mpint *secret; // (decryption key) -}; - -// signature -struct DSAsig -{ - mpint *r, *s; -}; - -DSApriv* dsagen(DSApub *opub); -DSAsig* dsasign(DSApriv *k, mpint *m); -int dsaverify(DSApub *k, DSAsig *sig, mpint *m); -DSApub* dsapuballoc(void); -void dsapubfree(DSApub*); -DSApriv* dsaprivalloc(void); -void dsaprivfree(DSApriv*); -DSAsig* dsasigalloc(void); -void dsasigfree(DSAsig*); -DSApub* dsaprivtopub(DSApriv*); - -///////////////////////////////////////////////////////// -// TLS -///////////////////////////////////////////////////////// -typedef struct Thumbprint{ - struct Thumbprint *next; - uchar sha1[SHA1dlen]; -} Thumbprint; - -typedef struct TLSconn{ - char dir[40]; // connection directory - uchar *cert; // certificate (local on input, remote on output) - uchar *sessionID; - int certlen, sessionIDlen; - int (*trace)(char*fmt, ...); -} TLSconn; - -// tlshand.c -extern int tlsClient(int fd, TLSconn *c); -extern int tlsServer(int fd, TLSconn *c); - -// thumb.c -extern Thumbprint* initThumbprints(char *ok, char *crl); -extern void freeThumbprints(Thumbprint *ok); -extern int okThumbprint(uchar *sha1, Thumbprint *ok); - -// readcert.c -extern uchar *readcert(char *filename, int *pcertlen); diff --git a/sys/src/cmd/unix/drawterm/include/memdraw.h b/sys/src/cmd/unix/drawterm/include/memdraw.h deleted file mode 100644 index ba0c2dad2..000000000 --- a/sys/src/cmd/unix/drawterm/include/memdraw.h +++ /dev/null @@ -1,210 +0,0 @@ -#ifdef PLAN9 -#pragma src "/sys/src/libmemdraw" -#pragma lib "libmemdraw.a" -#endif - -typedef struct Memimage Memimage; -typedef struct Memdata Memdata; -typedef struct Memsubfont Memsubfont; -typedef struct Memlayer Memlayer; -typedef struct Memcmap Memcmap; -typedef struct Memdrawparam Memdrawparam; - -/* - * Memdata is allocated from main pool, but .data from the image pool. - * Memdata is allocated separately to permit patching its pointer after - * compaction when windows share the image data. - * The first word of data is a back pointer to the Memdata, to find - * The word to patch. - */ - -struct Memdata -{ - ulong *base; /* allocated data pointer */ - uchar *bdata; /* pointer to first byte of actual data; word-aligned */ - int ref; /* number of Memimages using this data */ - void* imref; - int allocd; /* is this malloc'd? */ -}; - -enum { - Frepl = 1<<0, /* is replicated */ - Fsimple = 1<<1, /* is 1x1 */ - Fgrey = 1<<2, /* is grey */ - Falpha = 1<<3, /* has explicit alpha */ - Fcmap = 1<<4, /* has cmap channel */ - Fbytes = 1<<5, /* has only 8-bit channels */ -}; - -struct Memimage -{ - Rectangle r; /* rectangle in data area, local coords */ - Rectangle clipr; /* clipping region */ - int depth; /* number of bits of storage per pixel */ - int nchan; /* number of channels */ - ulong chan; /* channel descriptions */ - Memcmap *cmap; - - Memdata *data; /* pointer to data; shared by windows in this image */ - int zero; /* data->bdata+zero==&byte containing (0,0) */ - ulong width; /* width in words of a single scan line */ - Memlayer *layer; /* nil if not a layer*/ - ulong flags; - - int shift[NChan]; - int mask[NChan]; - int nbits[NChan]; - - void *X; -}; - -struct Memcmap -{ - uchar cmap2rgb[3*256]; - uchar rgb2cmap[16*16*16]; -}; - -/* - * Subfonts - * - * given char c, Subfont *f, Fontchar *i, and Point p, one says - * i = f->info+c; - * draw(b, Rect(p.x+i->left, p.y+i->top, - * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), - * color, f->bits, Pt(i->x, i->top)); - * p.x += i->width; - * to draw characters in the specified color (itself a Memimage) in Memimage b. - */ - -struct Memsubfont -{ - char *name; - short n; /* number of chars in font */ - uchar height; /* height of bitmap */ - char ascent; /* top of bitmap to baseline */ - Fontchar *info; /* n+1 character descriptors */ - Memimage *bits; /* of font */ -}; - -/* - * Encapsulated parameters and information for sub-draw routines. - */ -enum { - Simplesrc=1<<0, - Simplemask=1<<1, - Replsrc=1<<2, - Replmask=1<<3, - Fullmask=1<<4, -}; -struct Memdrawparam -{ - Memimage *dst; - Rectangle r; - Memimage *src; - Rectangle sr; - Memimage *mask; - Rectangle mr; - int op; - - ulong state; - ulong mval; /* if Simplemask, the mask pixel in mask format */ - ulong mrgba; /* mval in rgba */ - ulong sval; /* if Simplesrc, the source pixel in src format */ - ulong srgba; /* sval in rgba */ - ulong sdval; /* sval in dst format */ -}; - -/* - * Memimage management - */ - -extern Memimage* allocmemimage(Rectangle, ulong); -extern Memimage* _allocmemimage(Rectangle, ulong); -extern Memimage* allocmemimaged(Rectangle, ulong, Memdata*, void*); -extern Memimage* readmemimage(int); -extern Memimage* creadmemimage(int); -extern int writememimage(int, Memimage*); -extern void freememimage(Memimage*); -extern void _freememimage(Memimage*); -extern int _loadmemimage(Memimage*, Rectangle, uchar*, int); -extern int _cloadmemimage(Memimage*, Rectangle, uchar*, int); -extern int _unloadmemimage(Memimage*, Rectangle, uchar*, int); -extern int loadmemimage(Memimage*, Rectangle, uchar*, int); -extern int cloadmemimage(Memimage*, Rectangle, uchar*, int); -extern int unloadmemimage(Memimage*, Rectangle, uchar*, int); -extern ulong* wordaddr(Memimage*, Point); -extern uchar* byteaddr(Memimage*, Point); -extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*); -extern void memfillcolor(Memimage*, ulong); -extern void _memfillcolor(Memimage*, ulong); -extern int memsetchan(Memimage*, ulong); -extern ulong _rgbatoimg(Memimage*, ulong); - -/* - * Graphics - */ -extern void memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); -extern void memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); -extern void mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int); -extern void memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int); -extern void _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int); -extern Memdrawparam* _memimagedrawsetup(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); -extern void _memimagedraw(Memdrawparam*); -extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); -extern int hwdraw(Memdrawparam*); -extern void memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); -extern void _memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int); -extern Point memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*); -extern void memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int); -extern void memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int); -extern Rectangle memlinebbox(Point, Point, int, int, int); -extern int memlineendsize(int); -extern void _memmkcmap(void); -extern void _memimageinit(void); -extern void memimageinit(void); - -/* - * Subfont management - */ -extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*); -extern Memsubfont* openmemsubfont(char*); -extern void freememsubfont(Memsubfont*); -extern Point memsubfontwidth(Memsubfont*, char*); -extern Memsubfont* getmemdefont(void); - -/* - * Predefined - */ -extern Memimage* memwhite; -extern Memimage* memblack; -extern Memimage* memopaque; -extern Memimage* memtransparent; -extern Memcmap *memdefcmap; - -/* - * Kernel interface - */ -void memimagemove(void*, void*); - -/* - * Kernel cruft - */ -extern void rdb(void); -extern int iprint(char*, ...); -extern int drawdebug; - -/* - * doprint interface: numbconv bit strings - */ -#ifdef VARARGCK -#pragma varargck argpos iprint 1 -#pragma varargck type "llb" vlong -#pragma varargck type "llb" uvlong -#pragma varargck type "lb" long -#pragma varargck type "lb" ulong -#pragma varargck type "b" int -#pragma varargck type "b" uint -#endif - -extern ulong _pixelbits(Memimage*,Point); -extern ulong pixelbits(Memimage*, Point); diff --git a/sys/src/cmd/unix/drawterm/include/memlayer.h b/sys/src/cmd/unix/drawterm/include/memlayer.h deleted file mode 100644 index 508b163d8..000000000 --- a/sys/src/cmd/unix/drawterm/include/memlayer.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifdef PLAN9 -#pragma src "/sys/src/libmemlayer" -#pragma lib "libmemlayer.a" -#endif - -typedef struct Memscreen Memscreen; -typedef void (*Refreshfn)(Memimage*, Rectangle, void*); - -struct Memscreen -{ - Memimage *frontmost; /* frontmost layer on screen */ - Memimage *rearmost; /* rearmost layer on screen */ - Memimage *image; /* upon which all layers are drawn */ - Memimage *fill; /* if non-zero, picture to use when repainting */ -}; - -struct Memlayer -{ - Rectangle screenr; /* true position of layer on screen */ - Point delta; /* add delta to go from image coords to screen */ - Memscreen *screen; /* screen this layer belongs to */ - Memimage *front; /* window in front of this one */ - Memimage *rear; /* window behind this one*/ - int clear; /* layer is fully visible */ - Memimage *save; /* save area for obscured parts */ - Refreshfn refreshfn; /* function to call to refresh obscured parts if save==nil */ - void *refreshptr; /* argument to refreshfn */ -}; - -/* - * These functions accept local coordinates - */ -int memload(Memimage*, Rectangle, uchar*, int, int); -int memunload(Memimage*, Rectangle, uchar*, int); - -/* - * All these functions accept screen coordinates, not local ones. - */ -void _memlayerop(void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), Memimage*, Rectangle, Rectangle, void*); -Memimage* memlalloc(Memscreen*, Rectangle, Refreshfn, void*, ulong); -void memldelete(Memimage*); -void memlfree(Memimage*); -void memltofront(Memimage*); -void memltofrontn(Memimage**, int); -void _memltofrontfill(Memimage*, int); -void memltorear(Memimage*); -void memltorearn(Memimage**, int); -int memlsetrefresh(Memimage*, Refreshfn, void*); -void memlhide(Memimage*, Rectangle); -void memlexpose(Memimage*, Rectangle); -void _memlsetclear(Memscreen*); -int memlorigin(Memimage*, Point, Point); -void memlnorefresh(Memimage*, Rectangle, void*); diff --git a/sys/src/cmd/unix/drawterm/include/mp.h b/sys/src/cmd/unix/drawterm/include/mp.h deleted file mode 100644 index fa912ca64..000000000 --- a/sys/src/cmd/unix/drawterm/include/mp.h +++ /dev/null @@ -1,134 +0,0 @@ -#define _MPINT 1 - -// the code assumes mpdigit to be at least an int -// mpdigit must be an atomic type. mpdigit is defined -// in the architecture specific u.h - -typedef struct mpint mpint; - -struct mpint -{ - int sign; // +1 or -1 - int size; // allocated digits - int top; // significant digits - mpdigit *p; - char flags; -}; - -enum -{ - MPstatic= 0x01, - Dbytes= sizeof(mpdigit), // bytes per digit - Dbits= Dbytes*8 // bits per digit -}; - -// allocation -void mpsetminbits(int n); // newly created mpint's get at least n bits -mpint* mpnew(int n); // create a new mpint with at least n bits -void mpfree(mpint *b); -void mpbits(mpint *b, int n); // ensure that b has at least n bits -void mpnorm(mpint *b); // dump leading zeros -mpint* mpcopy(mpint *b); -void mpassign(mpint *old, mpint *new); - -// random bits -mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b); - -// conversion -mpint* strtomp(char*, char**, int, mpint*); // ascii -int mpfmt(Fmt*); -char* mptoa(mpint*, int, char*, int); -mpint* letomp(uchar*, uint, mpint*); // byte array, little-endian -int mptole(mpint*, uchar*, uint, uchar**); -mpint* betomp(uchar*, uint, mpint*); // byte array, little-endian -int mptobe(mpint*, uchar*, uint, uchar**); -uint mptoui(mpint*); // unsigned int -mpint* uitomp(uint, mpint*); -int mptoi(mpint*); // int -mpint* itomp(int, mpint*); -uvlong mptouv(mpint*); // unsigned vlong -mpint* uvtomp(uvlong, mpint*); -vlong mptov(mpint*); // vlong -mpint* vtomp(vlong, mpint*); - -// divide 2 digits by one -void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient); - -// in the following, the result mpint may be -// the same as one of the inputs. -void mpadd(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2 -void mpsub(mpint *b1, mpint *b2, mpint *diff); // diff = b1-b2 -void mpleft(mpint *b, int shift, mpint *res); // res = b<<shift -void mpright(mpint *b, int shift, mpint *res); // res = b>>shift -void mpmul(mpint *b1, mpint *b2, mpint *prod); // prod = b1*b2 -void mpexp(mpint *b, mpint *e, mpint *m, mpint *res); // res = b**e mod m -void mpmod(mpint *b, mpint *m, mpint *remainder); // remainder = b mod m - -// quotient = dividend/divisor, remainder = dividend % divisor -void mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder); - -// return neg, 0, pos as b1-b2 is neg, 0, pos -int mpcmp(mpint *b1, mpint *b2); - -// extended gcd return d, x, and y, s.t. d = gcd(a,b) and ax+by = d -void mpextendedgcd(mpint *a, mpint *b, mpint *d, mpint *x, mpint *y); - -// res = b**-1 mod m -void mpinvert(mpint *b, mpint *m, mpint *res); - -// bit counting -int mpsignif(mpint*); // number of sigificant bits in mantissa -int mplowbits0(mpint*); // k, where n = 2**k * q for odd q - -// well known constants -extern mpint *mpzero, *mpone, *mptwo; - -// sum[0:alen] = a[0:alen-1] + b[0:blen-1] -// prereq: alen >= blen, sum has room for alen+1 digits -void mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum); - -// diff[0:alen-1] = a[0:alen-1] - b[0:blen-1] -// prereq: alen >= blen, diff has room for alen digits -void mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff); - -// p[0:n] += m * b[0:n-1] -// prereq: p has room for n+1 digits -void mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p); - -// p[0:n] -= m * b[0:n-1] -// prereq: p has room for n+1 digits -int mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p); - -// p[0:alen*blen-1] = a[0:alen-1] * b[0:blen-1] -// prereq: alen >= blen, p has room for m*n digits -void mpvecmul(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p); - -// sign of a - b or zero if the same -int mpveccmp(mpdigit *a, int alen, mpdigit *b, int blen); - -// divide the 2 digit dividend by the one digit divisor and stick in quotient -// we assume that the result is one digit - overflow is all 1's -void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient); - -// playing with magnitudes -int mpmagcmp(mpint *b1, mpint *b2); -void mpmagadd(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2 -void mpmagsub(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2 - -// chinese remainder theorem -typedef struct CRTpre CRTpre; // precomputed values for converting - // twixt residues and mpint -typedef struct CRTres CRTres; // residue form of an mpint - -struct CRTres -{ - int n; // number of residues - mpint *r[1]; // residues -}; - -CRTpre* crtpre(int, mpint**); // precompute conversion values -CRTres* crtin(CRTpre*, mpint*); // convert mpint to residues -void crtout(CRTpre*, CRTres*, mpint*); // convert residues to mpint -void crtprefree(CRTpre*); -void crtresfree(CRTres*); - diff --git a/sys/src/cmd/unix/drawterm/include/u.h b/sys/src/cmd/unix/drawterm/include/u.h deleted file mode 100644 index 724410fff..000000000 --- a/sys/src/cmd/unix/drawterm/include/u.h +++ /dev/null @@ -1,26 +0,0 @@ -#include "dtos.h" - -/* avoid name conflicts */ -#undef accept -#undef listen - -/* sys calls */ -#undef bind -#undef chdir -#undef close -#undef create -#undef dup -#undef export -#undef fstat -#undef fwstat -#undef mount -#undef open -#undef start -#undef read -#undef remove -#undef seek -#undef stat -#undef write -#undef wstat -#undef unmount -#undef pipe diff --git a/sys/src/cmd/unix/drawterm/include/unix.h b/sys/src/cmd/unix/drawterm/include/unix.h deleted file mode 100644 index 862d9930d..000000000 --- a/sys/src/cmd/unix/drawterm/include/unix.h +++ /dev/null @@ -1,34 +0,0 @@ -#undef _FORTIFY_SOURCE /* stupid ubuntu warnings */ -#define __BSD_VISIBLE 1 /* FreeBSD 5.x */ -#define _BSD_SOURCE 1 -#define _NETBSD_SOURCE 1 /* NetBSD */ -#define _SVID_SOURCE 1 -#if !defined(__APPLE__) && !defined(__OpenBSD__) -# define _XOPEN_SOURCE 1000 -# define _XOPEN_SOURCE_EXTENDED 1 -#endif -#define _LARGEFILE64_SOURCE 1 -#define _FILE_OFFSET_BITS 64 - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <fcntl.h> -#include <setjmp.h> -#include <stddef.h> -#include <time.h> -#include <assert.h> -#include <unistd.h> -#include <stdarg.h> -#include <inttypes.h> -#include <ctype.h> -#include <errno.h> -#ifdef PTHREAD -#include <pthread.h> -#endif - -typedef long long p9_vlong; -typedef unsigned long long p9_uvlong; -typedef uintptr_t uintptr; diff --git a/sys/src/cmd/unix/drawterm/include/user.h b/sys/src/cmd/unix/drawterm/include/user.h deleted file mode 100644 index f6925ce1c..000000000 --- a/sys/src/cmd/unix/drawterm/include/user.h +++ /dev/null @@ -1,93 +0,0 @@ -/* sys calls */ -#define bind sysbind -#define chdir syschdir -#define close sysclose -#define create syscreate -#define dup sysdup -#define export sysexport -#define fstat sysfstat -#define fwstat sysfwstat -#define mount sysmount -#define open sysopen -#define read sysread -#define remove sysremove -#define seek sysseek -#define stat sysstat -#define write syswrite -#define wstat syswstat -#define unmount sysunmount -#define pipe syspipe -#define rendezvous sysrendezvous -#define getpid sysgetpid -#define time systime -#define nsec sysnsec -#define pread syspread -#define pwrite syspwrite -#undef sleep -#define sleep osmsleep - -extern int bind(char*, char*, int); -extern int chdir(char*); -extern int close(int); -extern int create(char*, int, ulong); -extern int dup(int, int); -extern int export(int); -extern int fstat(int, uchar*, int); -extern int fwstat(int, uchar*, int); -extern int mount(int, int, char*, int, char*); -extern int unmount(char*, char*); -extern int open(char*, int); -extern int pipe(int*); -extern long read(int, void*, long); -extern long readn(int, void*, long); -extern int remove(char*); -extern vlong seek(int, vlong, int); -extern int stat(char*, uchar*, int); -extern long write(int, void*, long); -extern int wstat(char*, uchar*, int); -extern void werrstr(char* ,...); - -extern Dir *dirstat(char*); -extern Dir *dirfstat(int); -extern int dirwstat(char*, Dir*); -extern int dirfwstat(int, Dir*); -extern long dirread(int, Dir*, long); - -extern int lfdfd(int); - -/* - * network dialing and authentication - */ -#define NETPATHLEN 40 -extern int accept(int, char*); -extern int announce(char*, char*); -extern int dial(char*, char*, char*, int*); -extern int hangup(int); -extern int listen(char*, char*); -extern char *netmkaddr(char*, char*, char*); -extern int reject(int, char*, char*); - -extern char* argv0; - -extern ulong truerand(void); -extern int pushssl(int, char*, char*, char*, int*); -extern int iounit(int); -extern long pread(int, void*, long, vlong); -extern long pwrite(int, void*, long, vlong); -extern void* rendezvous(void*, void*); -extern int kproc(char*, void(*)(void*), void*); -extern int getpid(void); -extern void panic(char*, ...); -extern void sleep(int); -extern void osyield(void); -extern void setmalloctag(void*, uintptr); -extern int errstr(char*, uint); -extern int rerrstr(char*, uint); -extern int encrypt(void*, void*, int); -extern int decrypt(void*, void*, int); -extern void qlock(QLock*); -extern void qunlock(QLock*); -extern vlong nsec(void); -extern void lock(Lock*); -extern void unlock(Lock*); -extern int iprint(char*, ...); diff --git a/sys/src/cmd/unix/drawterm/include/x b/sys/src/cmd/unix/drawterm/include/x deleted file mode 100644 index e69de29bb..000000000 --- a/sys/src/cmd/unix/drawterm/include/x +++ /dev/null diff --git a/sys/src/cmd/unix/drawterm/kern/Makefile b/sys/src/cmd/unix/drawterm/kern/Makefile deleted file mode 100644 index c4cf4b21b..000000000 --- a/sys/src/cmd/unix/drawterm/kern/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libkern.a - -OFILES=\ - allocb.$O\ - cache.$O\ - chan.$O\ - data.$O\ - dev.$O\ - devaudio.$O\ - devaudio-$(AUDIO).$O\ - devcons.$O\ - devdraw.$O\ - devfs-$(OS).$O\ - devip.$O\ - devip-$(OS).$O\ - devlfd.$O\ - devmnt.$O\ - devmouse.$O\ - devpipe.$O\ - devroot.$O\ - devssl.$O\ - devtls.$O\ - devtab.$O\ - error.$O\ - parse.$O\ - pgrp.$O\ - procinit.$O\ - rwlock.$O\ - sleep.$O\ - smalloc.$O\ - stub.$O\ - sysfile.$O\ - sysproc.$O\ - qio.$O\ - qlock.$O\ - term.$O\ - uart.$O\ - waserror.$O\ - $(OS).$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/kern/allocb.c b/sys/src/cmd/unix/drawterm/kern/allocb.c deleted file mode 100644 index ab1595c89..000000000 --- a/sys/src/cmd/unix/drawterm/kern/allocb.c +++ /dev/null @@ -1,165 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -enum -{ - Hdrspc = 64, /* leave room for high-level headers */ - Bdead = 0x51494F42, /* "QIOB" */ -}; - -struct -{ - Lock lk; - ulong bytes; -} ialloc; - -static Block* -_allocb(int size) -{ - Block *b; - uintptr addr; - - if((b = mallocz(sizeof(Block)+size+Hdrspc, 0)) == nil) - return nil; - - b->next = nil; - b->list = nil; - b->free = 0; - b->flag = 0; - - /* align start of data portion by rounding up */ - addr = (uintptr)b; - addr = ROUND(addr + sizeof(Block), BLOCKALIGN); - b->base = (uchar*)addr; - - /* align end of data portion by rounding down */ - b->lim = ((uchar*)b) + sizeof(Block)+size+Hdrspc; - addr = (uintptr)(b->lim); - addr = addr & ~(BLOCKALIGN-1); - b->lim = (uchar*)addr; - - /* leave sluff at beginning for added headers */ - b->rp = b->lim - ROUND(size, BLOCKALIGN); - if(b->rp < b->base) - panic("_allocb"); - b->wp = b->rp; - - return b; -} - -Block* -allocb(int size) -{ - Block *b; - - /* - * Check in a process and wait until successful. - * Can still error out of here, though. - */ - if(up == nil) - panic("allocb without up: %p\n", getcallerpc(&size)); - if((b = _allocb(size)) == nil){ - panic("allocb: no memory for %d bytes\n", size); - } - setmalloctag(b, getcallerpc(&size)); - - return b; -} - -Block* -iallocb(int size) -{ - Block *b; - static int m1, m2; - - if(ialloc.bytes > conf.ialloc){ - if((m1++%10000)==0) - print("iallocb: limited %lud/%lud\n", - ialloc.bytes, conf.ialloc); - return 0; - } - - if((b = _allocb(size)) == nil){ - if((m2++%10000)==0) - print("iallocb: no memory %lud/%lud\n", - ialloc.bytes, conf.ialloc); - return nil; - } - setmalloctag(b, getcallerpc(&size)); - b->flag = BINTR; - - ilock(&ialloc.lk); - ialloc.bytes += b->lim - b->base; - iunlock(&ialloc.lk); - - return b; -} - -void -freeb(Block *b) -{ - void *dead = (void*)Bdead; - - if(b == nil) - return; - - /* - * drivers which perform non cache coherent DMA manage their own buffer - * pool of uncached buffers and provide their own free routine. - */ - if(b->free) { - b->free(b); - return; - } - if(b->flag & BINTR) { - ilock(&ialloc.lk); - ialloc.bytes -= b->lim - b->base; - iunlock(&ialloc.lk); - } - - /* poison the block in case someone is still holding onto it */ - b->next = dead; - b->rp = dead; - b->wp = dead; - b->lim = dead; - b->base = dead; - - free(b); -} - -void -checkb(Block *b, char *msg) -{ - void *dead = (void*)Bdead; - - if(b == dead) - panic("checkb b %s %lux", msg, b); - if(b->base == dead || b->lim == dead || b->next == dead - || b->rp == dead || b->wp == dead){ - print("checkb: base 0x%8.8luX lim 0x%8.8luX next 0x%8.8luX\n", - b->base, b->lim, b->next); - print("checkb: rp 0x%8.8luX wp 0x%8.8luX\n", b->rp, b->wp); - panic("checkb dead: %s\n", msg); - } - - if(b->base > b->lim) - panic("checkb 0 %s %lux %lux", msg, b->base, b->lim); - if(b->rp < b->base) - panic("checkb 1 %s %lux %lux", msg, b->base, b->rp); - if(b->wp < b->base) - panic("checkb 2 %s %lux %lux", msg, b->base, b->wp); - if(b->rp > b->lim) - panic("checkb 3 %s %lux %lux", msg, b->rp, b->lim); - if(b->wp > b->lim) - panic("checkb 4 %s %lux %lux", msg, b->wp, b->lim); - -} - -void -iallocsummary(void) -{ - print("ialloc %lud/%lud\n", ialloc.bytes, conf.ialloc); -} diff --git a/sys/src/cmd/unix/drawterm/kern/cache.c b/sys/src/cmd/unix/drawterm/kern/cache.c deleted file mode 100644 index 56ee23ca7..000000000 --- a/sys/src/cmd/unix/drawterm/kern/cache.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - - -void -cinit(void) -{ -} - -void -copen(Chan *c) -{ - USED(c); -} - -int -cread(Chan *c, uchar *buf, int len, vlong off) -{ - USED(c); - USED(buf); - USED(len); - USED(off); - - return 0; -} - -void -cupdate(Chan *c, uchar *buf, int len, vlong off) -{ - USED(c); - USED(buf); - USED(len); - USED(off); -} - -void -cwrite(Chan* c, uchar *buf, int len, vlong off) -{ - USED(c); - USED(buf); - USED(len); - USED(off); -} diff --git a/sys/src/cmd/unix/drawterm/kern/chan.c b/sys/src/cmd/unix/drawterm/kern/chan.c deleted file mode 100644 index 7105f3a69..000000000 --- a/sys/src/cmd/unix/drawterm/kern/chan.c +++ /dev/null @@ -1,1494 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -int chandebug=0; /* toggled by sysr1 */ -QLock chanprint; /* probably asking for trouble (deadlocks) -rsc */ - -int domount(Chan**, Mhead**); - -void -dumpmount(void) /* DEBUGGING */ -{ - Pgrp *pg; - Mount *t; - Mhead **h, **he, *f; - - if(up == nil){ - print("no process for dumpmount\n"); - return; - } - pg = up->pgrp; - if(pg == nil){ - print("no pgrp for dumpmount\n"); - return; - } - rlock(&pg->ns); - if(waserror()) { - runlock(&pg->ns); - nexterror(); - } - - he = &pg->mnthash[MNTHASH]; - for(h = pg->mnthash; h < he; h++) { - for(f = *h; f; f = f->hash) { - print("head: %p: %s 0x%llux.%lud %C %lud -> \n", f, - f->from->name->s, f->from->qid.path, - f->from->qid.vers, devtab[f->from->type]->dc, - f->from->dev); - for(t = f->mount; t; t = t->next) - print("\t%p: %s (umh %p) (path %.8llux dev %C %lud)\n", t, t->to->name->s, t->to->umh, t->to->qid.path, devtab[t->to->type]->dc, t->to->dev); - } - } - poperror(); - runlock(&pg->ns); -} - - -char* -c2name(Chan *c) /* DEBUGGING */ -{ - if(c == nil) - return "<nil chan>"; - if(c->name == nil) - return "<nil name>"; - if(c->name->s == nil) - return "<nil name.s>"; - return c->name->s; -} - -enum -{ - CNAMESLOP = 20 -}; - -struct -{ - Lock lk; - int fid; - Chan *free; - Chan *list; -}chanalloc; - -typedef struct Elemlist Elemlist; - -struct Elemlist -{ - char *name; /* copy of name, so '/' can be overwritten */ - int nelems; - char **elems; - int *off; - int mustbedir; -}; - -#define SEP(c) ((c) == 0 || (c) == '/') -void cleancname(Cname*); - -int -isdotdot(char *p) -{ - return p[0]=='.' && p[1]=='.' && p[2]=='\0'; -} - -int -incref(Ref *r) -{ - int x; - - lock(&r->lk); - x = ++r->ref; - unlock(&r->lk); - return x; -} - -int -decref(Ref *r) -{ - int x; - - lock(&r->lk); - x = --r->ref; - unlock(&r->lk); - if(x < 0) - panic("decref, pc=0x%p", getcallerpc(&r)); - - return x; -} - -/* - * Rather than strncpy, which zeros the rest of the buffer, kstrcpy - * truncates if necessary, always zero terminates, does not zero fill, - * and puts ... at the end of the string if it's too long. Usually used to - * save a string in up->genbuf; - */ -void -kstrcpy(char *s, char *t, int ns) -{ - int nt; - - nt = strlen(t); - if(nt+1 <= ns){ - memmove(s, t, nt+1); - return; - } - /* too long */ - if(ns < 4){ - /* but very short! */ - strncpy(s, t, ns); - return; - } - /* truncate with ... at character boundary (very rare case) */ - memmove(s, t, ns-4); - ns -= 4; - s[ns] = '\0'; - /* look for first byte of UTF-8 sequence by skipping continuation bytes */ - while(ns>0 && (s[--ns]&0xC0)==0x80) - ; - strcpy(s+ns, "..."); -} - -int -emptystr(char *s) -{ - if(s == nil) - return 1; - if(s[0] == '\0') - return 1; - return 0; -} - -/* - * Atomically replace *p with copy of s - */ -void -kstrdup(char **p, char *s) -{ - int n; - char *t, *prev; - - n = strlen(s)+1; - /* if it's a user, we can wait for memory; if not, something's very wrong */ - if(up){ - t = smalloc(n); - setmalloctag(t, getcallerpc(&p)); - }else{ - t = malloc(n); - if(t == nil) - panic("kstrdup: no memory"); - } - memmove(t, s, n); - prev = *p; - *p = t; - free(prev); -} - -void -chandevreset(void) -{ - int i; - - for(i=0; devtab[i] != nil; i++) - devtab[i]->reset(); -} - -void -chandevinit(void) -{ - int i; - - for(i=0; devtab[i] != nil; i++) - devtab[i]->init(); -} - -void -chandevshutdown(void) -{ - int i; - - /* shutdown in reverse order */ - for(i=0; devtab[i] != nil; i++) - ; - for(i--; i >= 0; i--) - devtab[i]->shutdown(); -} - -Chan* -newchan(void) -{ - Chan *c; - - lock(&chanalloc.lk); - c = chanalloc.free; - if(c != 0) - chanalloc.free = c->next; - unlock(&chanalloc.lk); - - if(c == nil) { - c = smalloc(sizeof(Chan)); - lock(&chanalloc.lk); - c->fid = ++chanalloc.fid; - c->link = chanalloc.list; - chanalloc.list = c; - unlock(&chanalloc.lk); - } - - /* if you get an error before associating with a dev, - close calls rootclose, a nop */ - c->type = 0; - c->flag = 0; - c->ref.ref = 1; - c->dev = 0; - c->offset = 0; - c->iounit = 0; - c->umh = 0; - c->uri = 0; - c->dri = 0; - c->aux = 0; - c->mchan = 0; - c->mcp = 0; - c->mux = 0; - memset(&c->mqid, 0, sizeof(c->mqid)); - c->name = 0; - return c; -} - -static Ref ncname; - -Cname* -newcname(char *s) -{ - Cname *n; - int i; - - n = smalloc(sizeof(Cname)); - i = strlen(s); - n->len = i; - n->alen = i+CNAMESLOP; - n->s = smalloc(n->alen); - memmove(n->s, s, i+1); - n->ref.ref = 1; - incref(&ncname); - return n; -} - -void -cnameclose(Cname *n) -{ - if(n == nil) - return; - if(decref(&n->ref)) - return; - decref(&ncname); - free(n->s); - free(n); -} - -Cname* -addelem(Cname *n, char *s) -{ - int i, a; - char *t; - Cname *new; - - if(s[0]=='.' && s[1]=='\0') - return n; - - if(n->ref.ref > 1){ - /* copy on write */ - new = newcname(n->s); - cnameclose(n); - n = new; - } - - i = strlen(s); - if(n->len+1+i+1 > n->alen){ - a = n->len+1+i+1 + CNAMESLOP; - t = smalloc(a); - memmove(t, n->s, n->len+1); - free(n->s); - n->s = t; - n->alen = a; - } - if(n->len>0 && n->s[n->len-1]!='/' && s[0]!='/') /* don't insert extra slash if one is present */ - n->s[n->len++] = '/'; - memmove(n->s+n->len, s, i+1); - n->len += i; - if(isdotdot(s)) - cleancname(n); - return n; -} - -void -chanfree(Chan *c) -{ - c->flag = CFREE; - - if(c->umh != nil){ - putmhead(c->umh); - c->umh = nil; - } - if(c->umc != nil){ - cclose(c->umc); - c->umc = nil; - } - if(c->mux != nil){ - muxclose(c->mux); - c->mux = nil; - } - if(c->mchan != nil){ - cclose(c->mchan); - c->mchan = nil; - } - - cnameclose(c->name); - - lock(&chanalloc.lk); - c->next = chanalloc.free; - chanalloc.free = c; - unlock(&chanalloc.lk); -} - -void -cclose(Chan *c) -{ - if(c->flag&CFREE) - panic("cclose %p", getcallerpc(&c)); - - if(decref(&c->ref)) - return; - - if(!waserror()){ - devtab[c->type]->close(c); - poperror(); - } - chanfree(c); -} - -/* - * Make sure we have the only copy of c. (Copy on write.) - */ -Chan* -cunique(Chan *c) -{ - Chan *nc; - - if(c->ref.ref != 1) { - nc = cclone(c); - cclose(c); - c = nc; - } - - return c; -} - -int -eqqid(Qid a, Qid b) -{ - return a.path==b.path && a.vers==b.vers; -} - -int -eqchan(Chan *a, Chan *b, int pathonly) -{ - if(a->qid.path != b->qid.path) - return 0; - if(!pathonly && a->qid.vers!=b->qid.vers) - return 0; - if(a->type != b->type) - return 0; - if(a->dev != b->dev) - return 0; - return 1; -} - -int -eqchantdqid(Chan *a, int type, int dev, Qid qid, int pathonly) -{ - if(a->qid.path != qid.path) - return 0; - if(!pathonly && a->qid.vers!=qid.vers) - return 0; - if(a->type != type) - return 0; - if(a->dev != dev) - return 0; - return 1; -} - -Mhead* -newmhead(Chan *from) -{ - Mhead *mh; - - mh = smalloc(sizeof(Mhead)); - mh->ref.ref = 1; - mh->from = from; - incref(&from->ref); - -/* - n = from->name->len; - if(n >= sizeof(mh->fromname)) - n = sizeof(mh->fromname)-1; - memmove(mh->fromname, from->name->s, n); - mh->fromname[n] = 0; -*/ - return mh; -} - -int -cmount(Chan **newp, Chan *old, int flag, char *spec) -{ - Pgrp *pg; - int order, flg; - Mhead *m, **l, *mh; - Mount *nm, *f, *um, **h; - Chan *new; - - if(QTDIR & (old->qid.type^(*newp)->qid.type)) - error(Emount); - -if(old->umh)print("cmount old extra umh\n"); - - order = flag&MORDER; - - if((old->qid.type&QTDIR)==0 && order != MREPL) - error(Emount); - - new = *newp; - mh = new->umh; - - /* - * Not allowed to bind when the old directory - * is itself a union. (Maybe it should be allowed, but I don't see - * what the semantics would be.) - * - * We need to check mh->mount->next to tell unions apart from - * simple mount points, so that things like - * mount -c fd /root - * bind -c /root / - * work. The check of mount->mflag catches things like - * mount fd /root - * bind -c /root / - * - * This is far more complicated than it should be, but I don't - * see an easier way at the moment. -rsc - */ - if((flag&MCREATE) && mh && mh->mount - && (mh->mount->next || !(mh->mount->mflag&MCREATE))) - error(Emount); - - pg = up->pgrp; - wlock(&pg->ns); - - l = &MOUNTH(pg, old->qid); - for(m = *l; m; m = m->hash) { - if(eqchan(m->from, old, 1)) - break; - l = &m->hash; - } - - if(m == nil) { - /* - * nothing mounted here yet. create a mount - * head and add to the hash table. - */ - m = newmhead(old); - *l = m; - - /* - * if this is a union mount, add the old - * node to the mount chain. - */ - if(order != MREPL) - m->mount = newmount(m, old, 0, 0); - } - wlock(&m->lock); - if(waserror()){ - wunlock(&m->lock); - nexterror(); - } - wunlock(&pg->ns); - - nm = newmount(m, new, flag, spec); - if(mh != nil && mh->mount != nil) { - /* - * copy a union when binding it onto a directory - */ - flg = order; - if(order == MREPL) - flg = MAFTER; - h = &nm->next; - um = mh->mount; - for(um = um->next; um; um = um->next) { - f = newmount(m, um->to, flg, um->spec); - *h = f; - h = &f->next; - } - } - - if(m->mount && order == MREPL) { - mountfree(m->mount); - m->mount = 0; - } - - if(flag & MCREATE) - nm->mflag |= MCREATE; - - if(m->mount && order == MAFTER) { - for(f = m->mount; f->next; f = f->next) - ; - f->next = nm; - } - else { - for(f = nm; f->next; f = f->next) - ; - f->next = m->mount; - m->mount = nm; - } - - wunlock(&m->lock); - poperror(); - return nm->mountid; -} - -void -cunmount(Chan *mnt, Chan *mounted) -{ - Pgrp *pg; - Mhead *m, **l; - Mount *f, **p; - - if(mnt->umh) /* should not happen */ - print("cunmount newp extra umh %p has %p\n", mnt, mnt->umh); - - /* - * It _can_ happen that mounted->umh is non-nil, - * because mounted is the result of namec(Aopen) - * (see sysfile.c:/^sysunmount). - * If we open a union directory, it will have a umh. - * Although surprising, this is okay, since the - * cclose will take care of freeing the umh. - */ - - pg = up->pgrp; - wlock(&pg->ns); - - l = &MOUNTH(pg, mnt->qid); - for(m = *l; m; m = m->hash) { - if(eqchan(m->from, mnt, 1)) - break; - l = &m->hash; - } - - if(m == 0) { - wunlock(&pg->ns); - error(Eunmount); - } - - wlock(&m->lock); - if(mounted == 0) { - *l = m->hash; - wunlock(&pg->ns); - mountfree(m->mount); - m->mount = nil; - cclose(m->from); - wunlock(&m->lock); - putmhead(m); - return; - } - - p = &m->mount; - for(f = *p; f; f = f->next) { - /* BUG: Needs to be 2 pass */ - if(eqchan(f->to, mounted, 1) || - (f->to->mchan && eqchan(f->to->mchan, mounted, 1))) { - *p = f->next; - f->next = 0; - mountfree(f); - if(m->mount == nil) { - *l = m->hash; - cclose(m->from); - wunlock(&m->lock); - wunlock(&pg->ns); - putmhead(m); - return; - } - wunlock(&m->lock); - wunlock(&pg->ns); - return; - } - p = &f->next; - } - wunlock(&m->lock); - wunlock(&pg->ns); - error(Eunion); -} - -Chan* -cclone(Chan *c) -{ - Chan *nc; - Walkqid *wq; - - wq = devtab[c->type]->walk(c, nil, nil, 0); - if(wq == nil) - error("clone failed"); - nc = wq->clone; - free(wq); - nc->name = c->name; - if(c->name) - incref(&c->name->ref); - return nc; -} - -int -findmount(Chan **cp, Mhead **mp, int type, int dev, Qid qid) -{ - Pgrp *pg; - Mhead *m; - - pg = up->pgrp; - rlock(&pg->ns); - for(m = MOUNTH(pg, qid); m; m = m->hash){ - rlock(&m->lock); -if(m->from == nil){ - print("m %p m->from 0\n", m); - runlock(&m->lock); - continue; -} - if(eqchantdqid(m->from, type, dev, qid, 1)) { - runlock(&pg->ns); - if(mp != nil){ - incref(&m->ref); - if(*mp != nil) - putmhead(*mp); - *mp = m; - } - if(*cp != nil) - cclose(*cp); - incref(&m->mount->to->ref); - *cp = m->mount->to; - runlock(&m->lock); - return 1; - } - runlock(&m->lock); - } - - runlock(&pg->ns); - return 0; -} - -int -domount(Chan **cp, Mhead **mp) -{ - return findmount(cp, mp, (*cp)->type, (*cp)->dev, (*cp)->qid); -} - -Chan* -undomount(Chan *c, Cname *name) -{ - Chan *nc; - Pgrp *pg; - Mount *t; - Mhead **h, **he, *f; - - pg = up->pgrp; - rlock(&pg->ns); - if(waserror()) { - runlock(&pg->ns); - nexterror(); - } - - he = &pg->mnthash[MNTHASH]; - for(h = pg->mnthash; h < he; h++) { - for(f = *h; f; f = f->hash) { - if(strcmp(f->from->name->s, name->s) != 0) - continue; - for(t = f->mount; t; t = t->next) { - if(eqchan(c, t->to, 1)) { - /* - * We want to come out on the left hand side of the mount - * point using the element of the union that we entered on. - * To do this, find the element that has a from name of - * c->name->s. - */ - if(strcmp(t->head->from->name->s, name->s) != 0) - continue; - nc = t->head->from; - incref(&nc->ref); - cclose(c); - c = nc; - break; - } - } - } - } - poperror(); - runlock(&pg->ns); - return c; -} - -/* - * Either walks all the way or not at all. No partial results in *cp. - * *nerror is the number of names to display in an error message. - */ -static char Edoesnotexist[] = "does not exist"; -int -walk(Chan **cp, char **names, int nnames, int nomount, int *nerror) -{ - int dev, dotdot, i, n, nhave, ntry, type; - Chan *c, *nc; - Cname *cname; - Mount *f; - Mhead *mh, *nmh; - Walkqid *wq; - - c = *cp; - incref(&c->ref); - cname = c->name; - incref(&cname->ref); - mh = nil; - - /* - * While we haven't gotten all the way down the path: - * 1. step through a mount point, if any - * 2. send a walk request for initial dotdot or initial prefix without dotdot - * 3. move to the first mountpoint along the way. - * 4. repeat. - * - * An invariant is that each time through the loop, c is on the undomount - * side of the mount point, and c's name is cname. - */ - for(nhave=0; nhave<nnames; nhave+=n){ - if((c->qid.type&QTDIR)==0){ - if(nerror) - *nerror = nhave; - cnameclose(cname); - cclose(c); - strcpy(up->errstr, Enotdir); - if(mh != nil) -{print("walk 1\n"); - putmhead(mh); -} - return -1; - } - ntry = nnames - nhave; - if(ntry > MAXWELEM) - ntry = MAXWELEM; - dotdot = 0; - for(i=0; i<ntry; i++){ - if(isdotdot(names[nhave+i])){ - if(i==0) { - dotdot = 1; - ntry = 1; - } else - ntry = i; - break; - } - } - - if(!dotdot && !nomount) - domount(&c, &mh); - - type = c->type; - dev = c->dev; - - if((wq = devtab[type]->walk(c, nil, names+nhave, ntry)) == nil){ - /* try a union mount, if any */ - if(mh && !nomount){ - /* - * mh->mount == c, so start at mh->mount->next - */ - rlock(&mh->lock); - for(f = mh->mount->next; f; f = f->next) - if((wq = devtab[f->to->type]->walk(f->to, nil, names+nhave, ntry)) != nil) - break; - runlock(&mh->lock); - if(f != nil){ - type = f->to->type; - dev = f->to->dev; - } - } - if(wq == nil){ - cclose(c); - cnameclose(cname); - if(nerror) - *nerror = nhave+1; - if(mh != nil) - putmhead(mh); - return -1; - } - } - - nmh = nil; - if(dotdot) { - assert(wq->nqid == 1); - assert(wq->clone != nil); - - cname = addelem(cname, ".."); - nc = undomount(wq->clone, cname); - n = 1; - } else { - nc = nil; - if(!nomount) - for(i=0; i<wq->nqid && i<ntry-1; i++) - if(findmount(&nc, &nmh, type, dev, wq->qid[i])) - break; - if(nc == nil){ /* no mount points along path */ - if(wq->clone == nil){ - cclose(c); - cnameclose(cname); - if(wq->nqid==0 || (wq->qid[wq->nqid-1].type&QTDIR)){ - if(nerror) - *nerror = nhave+wq->nqid+1; - strcpy(up->errstr, Edoesnotexist); - }else{ - if(nerror) - *nerror = nhave+wq->nqid; - strcpy(up->errstr, Enotdir); - } - free(wq); - if(mh != nil) - putmhead(mh); - return -1; - } - n = wq->nqid; - nc = wq->clone; - }else{ /* stopped early, at a mount point */ - if(wq->clone != nil){ - cclose(wq->clone); - wq->clone = nil; - } - n = i+1; - } - for(i=0; i<n; i++) - cname = addelem(cname, names[nhave+i]); - } - cclose(c); - c = nc; - putmhead(mh); - mh = nmh; - free(wq); - } - - putmhead(mh); - - c = cunique(c); - - if(c->umh != nil){ //BUG - print("walk umh\n"); - putmhead(c->umh); - c->umh = nil; - } - - cnameclose(c->name); - c->name = cname; - - cclose(*cp); - *cp = c; - if(nerror) - *nerror = 0; - return 0; -} - -/* - * c is a mounted non-creatable directory. find a creatable one. - */ -Chan* -createdir(Chan *c, Mhead *m) -{ - Chan *nc; - Mount *f; - - rlock(&m->lock); - if(waserror()) { - runlock(&m->lock); - nexterror(); - } - for(f = m->mount; f; f = f->next) { - if(f->mflag&MCREATE) { - nc = cclone(f->to); - runlock(&m->lock); - poperror(); - cclose(c); - return nc; - } - } - error(Enocreate); - return 0; -} - -void -saveregisters(void) -{ -} - -/* - * In place, rewrite name to compress multiple /, eliminate ., and process .. - */ -void -cleancname(Cname *n) -{ - char *p; - - if(n->s[0] == '#'){ - p = strchr(n->s, '/'); - if(p == nil) - return; - cleanname(p); - - /* - * The correct name is #i rather than #i/, - * but the correct name of #/ is #/. - */ - if(strcmp(p, "/")==0 && n->s[1] != '/') - *p = '\0'; - }else - cleanname(n->s); - n->len = strlen(n->s); -} - -static void -growparse(Elemlist *e) -{ - char **new; - int *inew; - enum { Delta = 8 }; - - if(e->nelems % Delta == 0){ - new = smalloc((e->nelems+Delta) * sizeof(char*)); - memmove(new, e->elems, e->nelems*sizeof(char*)); - free(e->elems); - e->elems = new; - inew = smalloc((e->nelems+Delta+1) * sizeof(int)); - memmove(inew, e->off, e->nelems*sizeof(int)); - free(e->off); - e->off = inew; - } -} - -/* - * The name is known to be valid. - * Copy the name so slashes can be overwritten. - * An empty string will set nelem=0. - * A path ending in / or /. or /.//./ etc. will have - * e.mustbedir = 1, so that we correctly - * reject, e.g., "/adm/users/." when /adm/users is a file - * rather than a directory. - */ -static void -parsename(char *name, Elemlist *e) -{ - char *slash; - - kstrdup(&e->name, name); - name = e->name; - e->nelems = 0; - e->elems = nil; - e->off = smalloc(sizeof(int)); - e->off[0] = skipslash(name) - name; - for(;;){ - name = skipslash(name); - if(*name=='\0'){ - e->mustbedir = 1; - break; - } - growparse(e); - e->elems[e->nelems++] = name; - slash = utfrune(name, '/'); - if(slash == nil){ - e->off[e->nelems] = name+strlen(name) - e->name; - e->mustbedir = 0; - break; - } - e->off[e->nelems] = slash - e->name; - *slash++ = '\0'; - name = slash; - } -} - -void* -mymemrchr(void *va, int c, long n) -{ - uchar *a, *e; - - a = va; - for(e=a+n-1; e>a; e--) - if(*e == c) - return e; - return nil; -} - -/* - * Turn a name into a channel. - * &name[0] is known to be a valid address. It may be a kernel address. - * - * Opening with amode Aopen, Acreate, or Aremove guarantees - * that the result will be the only reference to that particular fid. - * This is necessary since we might pass the result to - * devtab[]->remove(). - * - * Opening Atodir, Amount, or Aaccess does not guarantee this. - * - * Opening Aaccess can, under certain conditions, return a - * correct Chan* but with an incorrect Cname attached. - * Since the functions that open Aaccess (sysstat, syswstat, sys_stat) - * do not use the Cname*, this avoids an unnecessary clone. - */ -Chan* -namec(char *aname, int amode, int omode, ulong perm) -{ - int n, prefix, len, t, nomount, npath; - Chan *c, *cnew; - Cname *cname; - Elemlist e; - Rune r; - Mhead *m; - char *createerr, tmperrbuf[ERRMAX]; - char *name; - - name = aname; - if(name[0] == '\0') - error("empty file name"); - validname(name, 1); - - /* - * Find the starting off point (the current slash, the root of - * a device tree, or the current dot) as well as the name to - * evaluate starting there. - */ - nomount = 0; - switch(name[0]){ - case '/': - c = up->slash; - incref(&c->ref); - break; - - case '#': - nomount = 1; - up->genbuf[0] = '\0'; - n = 0; - while(*name!='\0' && (*name != '/' || n < 2)){ - if(n >= sizeof(up->genbuf)-1) - error(Efilename); - up->genbuf[n++] = *name++; - } - up->genbuf[n] = '\0'; - /* - * noattach is sandboxing. - * - * the OK exceptions are: - * | it only gives access to pipes you create - * d this process's file descriptors - * e this process's environment - * the iffy exceptions are: - * c time and pid, but also cons and consctl - * p control of your own processes (and unfortunately - * any others left unprotected) - */ - n = chartorune(&r, up->genbuf+1)+1; - /* actually / is caught by parsing earlier */ - if(utfrune("M", r)) - error(Enoattach); - if(up->pgrp->noattach && utfrune("|decp", r)==nil) - error(Enoattach); - t = devno(r, 1); - if(t == -1) - error(Ebadsharp); - c = devtab[t]->attach(up->genbuf+n); - break; - - default: - c = up->dot; - incref(&c->ref); - break; - } - prefix = name - aname; - - e.name = nil; - e.elems = nil; - e.off = nil; - e.nelems = 0; - if(waserror()){ - cclose(c); - free(e.name); - free(e.elems); - free(e.off); -//dumpmount(); - nexterror(); - } - - /* - * Build a list of elements in the path. - */ - parsename(name, &e); - - /* - * On create, .... - */ - if(amode == Acreate){ - /* perm must have DMDIR if last element is / or /. */ - if(e.mustbedir && !(perm&DMDIR)){ - npath = e.nelems; - strcpy(tmperrbuf, "create without DMDIR"); - goto NameError; - } - - /* don't try to walk the last path element just yet. */ - if(e.nelems == 0) - error(Eexist); - e.nelems--; - } - - if(walk(&c, e.elems, e.nelems, nomount, &npath) < 0){ - if(npath < 0 || npath > e.nelems){ - print("namec %s walk error npath=%d\n", aname, npath); - nexterror(); - } - strcpy(tmperrbuf, up->errstr); - NameError: - len = prefix+e.off[npath]; - if(len < ERRMAX/3 || (name=mymemrchr(aname, '/', len))==nil || name==aname) - snprint(up->genbuf, sizeof up->genbuf, "%.*s", len, aname); - else - snprint(up->genbuf, sizeof up->genbuf, "...%.*s", (int)(len-(name-aname)), name); - snprint(up->errstr, ERRMAX, "%#q %s", up->genbuf, tmperrbuf); - nexterror(); - } - - if(e.mustbedir && !(c->qid.type&QTDIR)){ - npath = e.nelems; - strcpy(tmperrbuf, "not a directory"); - goto NameError; - } - - if(amode == Aopen && (omode&3) == OEXEC && (c->qid.type&QTDIR)){ - npath = e.nelems; - error("cannot exec directory"); - } - - switch(amode){ - case Aaccess: - if(!nomount) - domount(&c, nil); - break; - - case Abind: - m = nil; - if(!nomount) - domount(&c, &m); - if(c->umh != nil) - putmhead(c->umh); - c->umh = m; - break; - - case Aremove: - case Aopen: - Open: - /* save the name; domount might change c */ - cname = c->name; - incref(&cname->ref); - m = nil; - if(!nomount) - domount(&c, &m); - - /* our own copy to open or remove */ - c = cunique(c); - - /* now it's our copy anyway, we can put the name back */ - cnameclose(c->name); - c->name = cname; - - switch(amode){ - case Aremove: - putmhead(m); - break; - - case Aopen: - case Acreate: -if(c->umh != nil){ - print("cunique umh Open\n"); - putmhead(c->umh); - c->umh = nil; -} - - /* only save the mount head if it's a multiple element union */ - if(m && m->mount && m->mount->next) - c->umh = m; - else - putmhead(m); - - /* save registers else error() in open has wrong value of c saved */ - saveregisters(); - - if(omode == OEXEC) - c->flag &= ~CCACHE; - - c = devtab[c->type]->open(c, omode&~OCEXEC); - - if(omode & OCEXEC) - c->flag |= CCEXEC; - if(omode & ORCLOSE) - c->flag |= CRCLOSE; - break; - } - break; - - case Atodir: - /* - * Directories (e.g. for cd) are left before the mount point, - * so one may mount on / or . and see the effect. - */ - if(!(c->qid.type & QTDIR)) - error(Enotdir); - break; - - case Amount: - /* - * When mounting on an already mounted upon directory, - * one wants subsequent mounts to be attached to the - * original directory, not the replacement. Don't domount. - */ - break; - - case Acreate: - /* - * We've already walked all but the last element. - * If the last exists, try to open it OTRUNC. - * If omode&OEXCL is set, just give up. - */ - e.nelems++; - if(walk(&c, e.elems+e.nelems-1, 1, nomount, nil) == 0){ - if(omode&OEXCL) - error(Eexist); - omode |= OTRUNC; - goto Open; - } - - /* - * The semantics of the create(2) system call are that if the - * file exists and can be written, it is to be opened with truncation. - * On the other hand, the create(5) message fails if the file exists. - * If we get two create(2) calls happening simultaneously, - * they might both get here and send create(5) messages, but only - * one of the messages will succeed. To provide the expected create(2) - * semantics, the call with the failed message needs to try the above - * walk again, opening for truncation. This correctly solves the - * create/create race, in the sense that any observable outcome can - * be explained as one happening before the other. - * The create/create race is quite common. For example, it happens - * when two rc subshells simultaneously update the same - * environment variable. - * - * The implementation still admits a create/create/remove race: - * (A) walk to file, fails - * (B) walk to file, fails - * (A) create file, succeeds, returns - * (B) create file, fails - * (A) remove file, succeeds, returns - * (B) walk to file, return failure. - * - * This is hardly as common as the create/create race, and is really - * not too much worse than what might happen if (B) got a hold of a - * file descriptor and then the file was removed -- either way (B) can't do - * anything with the result of the create call. So we don't care about this race. - * - * Applications that care about more fine-grained decision of the races - * can use the OEXCL flag to get at the underlying create(5) semantics; - * by default we provide the common case. - * - * We need to stay behind the mount point in case we - * need to do the first walk again (should the create fail). - * - * We also need to cross the mount point and find the directory - * in the union in which we should be creating. - * - * The channel staying behind is c, the one moving forward is cnew. - */ - m = nil; - cnew = nil; /* is this assignment necessary? */ - if(!waserror()){ /* try create */ - if(!nomount && findmount(&cnew, &m, c->type, c->dev, c->qid)) - cnew = createdir(cnew, m); - else{ - cnew = c; - incref(&cnew->ref); - } - - /* - * We need our own copy of the Chan because we're - * about to send a create, which will move it. Once we have - * our own copy, we can fix the name, which might be wrong - * if findmount gave us a new Chan. - */ - cnew = cunique(cnew); - cnameclose(cnew->name); - cnew->name = c->name; - incref(&cnew->name->ref); - - devtab[cnew->type]->create(cnew, e.elems[e.nelems-1], omode&~(OEXCL|OCEXEC), perm); - poperror(); - if(omode & OCEXEC) - cnew->flag |= CCEXEC; - if(omode & ORCLOSE) - cnew->flag |= CRCLOSE; - if(m) - putmhead(m); - cclose(c); - c = cnew; - c->name = addelem(c->name, e.elems[e.nelems-1]); - break; - }else{ /* create failed */ - cclose(cnew); - if(m) - putmhead(m); - if(omode & OEXCL) - nexterror(); - /* save error */ - createerr = up->errstr; - up->errstr = tmperrbuf; - /* note: we depend that walk does not error */ - if(walk(&c, e.elems+e.nelems-1, 1, nomount, nil) < 0){ - up->errstr = createerr; - error(createerr); /* report true error */ - } - up->errstr = createerr; - omode |= OTRUNC; - goto Open; - } - panic("namec: not reached"); - - default: - panic("unknown namec access %d\n", amode); - } - - poperror(); - - /* place final element in genbuf for e.g. exec */ - if(e.nelems > 0) - kstrcpy(up->genbuf, e.elems[e.nelems-1], sizeof up->genbuf); - else - kstrcpy(up->genbuf, ".", sizeof up->genbuf); - free(e.name); - free(e.elems); - free(e.off); - - return c; -} - -/* - * name is valid. skip leading / and ./ as much as possible - */ -char* -skipslash(char *name) -{ - while(name[0]=='/' || (name[0]=='.' && (name[1]==0 || name[1]=='/'))) - name++; - return name; -} - -char isfrog[256]={ - /*NUL*/ 1, 1, 1, 1, 1, 1, 1, 1, /* 0 */ - /*BKS*/ 1, 1, 1, 1, 1, 1, 1, 1, /* 0x08 */ - /*DLE*/ 1, 1, 1, 1, 1, 1, 1, 1, /* 0x10 */ - /*CAN*/ 1, 1, 1, 1, 1, 1, 1, 1, /* 0x18 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */ - 0, 0, 0, 0, 0, 0, 0, 1, /* 0x28 (1 is '/', 0x2F) */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x38 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x48 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x58 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x68 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */ - 0, 0, 0, 0, 0, 0, 0, 1, /* 0x78 (1 is DEL, 0x7F) */ -}; - -/* - * Check that the name - * a) is in valid memory. - * b) is shorter than 2^16 bytes, so it can fit in a 9P string field. - * c) contains no frogs. - * The first byte is known to be addressible by the requester, so the - * routine works for kernel and user memory both. - * The parameter slashok flags whether a slash character is an error - * or a valid character. - */ -void -validname(char *aname, int slashok) -{ - char *ename, *name; - int c; - Rune r; - - name = aname; -/* - if(((ulong)name & KZERO) != KZERO) { - p = name; - t = BY2PG-((ulong)p&(BY2PG-1)); - while((ename=vmemchr(p, 0, t)) == nil) { - p += t; - t = BY2PG; - } - }else -*/ - ename = memchr(name, 0, (1<<16)); - - if(ename==nil || ename-name>=(1<<16)) - error("name too long"); - - while(*name){ - /* all characters above '~' are ok */ - c = *(uchar*)name; - if(c >= Runeself) - name += chartorune(&r, name); - else{ - if(isfrog[c]) - if(!slashok || c!='/'){ - snprint(up->genbuf, sizeof(up->genbuf), "%s: %q", Ebadchar, aname); - error(up->genbuf); - } - name++; - } - } -} - -void -isdir(Chan *c) -{ - if(c->qid.type & QTDIR) - return; - error(Enotdir); -} - -/* - * This is necessary because there are many - * pointers to the top of a given mount list: - * - * - the mhead in the namespace hash table - * - the mhead in chans returned from findmount: - * used in namec and then by unionread. - * - the mhead in chans returned from createdir: - * used in the open/create race protect, which is gone. - * - * The RWlock in the Mhead protects the mount list it contains. - * The mount list is deleted when we cunmount. - * The RWlock ensures that nothing is using the mount list at that time. - * - * It is okay to replace c->mh with whatever you want as - * long as you are sure you have a unique reference to it. - * - * This comment might belong somewhere else. - */ -void -putmhead(Mhead *m) -{ - if(m && decref(&m->ref) == 0){ - m->mount = (Mount*)0xCafeBeef; - free(m); - } -} diff --git a/sys/src/cmd/unix/drawterm/kern/dat.h b/sys/src/cmd/unix/drawterm/kern/dat.h deleted file mode 100644 index 9d00d0085..000000000 --- a/sys/src/cmd/unix/drawterm/kern/dat.h +++ /dev/null @@ -1,519 +0,0 @@ -#define KNAMELEN 28 /* max length of name held in kernel */ -#define DOMLEN 64 - -#define BLOCKALIGN 8 - -typedef struct Alarms Alarms; -typedef struct Block Block; -typedef struct CSN CSN; -typedef struct Chan Chan; -typedef struct Cmdbuf Cmdbuf; -typedef struct Cmdtab Cmdtab; -typedef struct Cname Cname; -typedef struct Conf Conf; -typedef struct Dev Dev; -typedef struct Dirtab Dirtab; -typedef struct Edfinterface Edfinterface; -typedef struct Egrp Egrp; -typedef struct Evalue Evalue; -typedef struct Fgrp Fgrp; -typedef struct FPsave FPsave; -typedef struct DevConf DevConf; -typedef struct Label Label; -typedef struct List List; -typedef struct Log Log; -typedef struct Logflag Logflag; -typedef struct Mntcache Mntcache; -typedef struct Mount Mount; -typedef struct Mntrpc Mntrpc; -typedef struct Mntwalk Mntwalk; -typedef struct Mnt Mnt; -typedef struct Mhead Mhead; -typedef struct Note Note; -typedef struct Page Page; -typedef struct Palloc Palloc; -typedef struct Perf Perf; -typedef struct Pgrps Pgrps; -typedef struct PhysUart PhysUart; -typedef struct Pgrp Pgrp; -typedef struct Physseg Physseg; -typedef struct Proc Proc; -typedef struct Pte Pte; -typedef struct Pthash Pthash; -typedef struct Queue Queue; -typedef struct Ref Ref; -typedef struct Rendez Rendez; -typedef struct Rgrp Rgrp; -typedef struct RWlock RWlock; -typedef struct Schedq Schedq; -typedef struct Segment Segment; -typedef struct Session Session; -typedef struct Task Task; -typedef struct Talarm Talarm; -typedef struct Timer Timer; -typedef struct Uart Uart; -typedef struct Ureg Ureg; -typedef struct Waitq Waitq; -typedef struct Walkqid Walkqid; -typedef int Devgen(Chan*, char*, Dirtab*, int, int, Dir*); - -#include "fcall.h" - -enum -{ - SnarfSize = 64*1024, -}; - -struct Conf -{ - ulong nmach; /* processors */ - ulong nproc; /* processes */ - ulong monitor; /* has monitor? */ - ulong npage0; /* total physical pages of memory */ - ulong npage1; /* total physical pages of memory */ - ulong npage; /* total physical pages of memory */ - ulong upages; /* user page pool */ - ulong nimage; /* number of page cache image headers */ - ulong nswap; /* number of swap pages */ - int nswppo; /* max # of pageouts per segment pass */ - ulong base0; /* base of bank 0 */ - ulong base1; /* base of bank 1 */ - ulong copymode; /* 0 is copy on write, 1 is copy on reference */ - ulong ialloc; /* max interrupt time allocation in bytes */ - ulong pipeqsize; /* size in bytes of pipe queues */ - int nuart; /* number of uart devices */ -}; - -struct Label -{ - jmp_buf buf; -}; - -struct Ref -{ - Lock lk; - long ref; -}; - -struct Rendez -{ - Lock lk; - Proc *p; -}; - -struct RWlock /* changed from kernel */ -{ - int readers; - Lock lk; - QLock x; - QLock k; -}; - -struct Talarm -{ - Lock lk; - Proc *list; -}; - -struct Alarms -{ - QLock lk; - Proc *head; -}; - -/* - * Access types in namec & channel flags - */ -enum -{ - Aaccess, /* as in stat, wstat */ - Abind, /* for left-hand-side of bind */ - Atodir, /* as in chdir */ - Aopen, /* for i/o */ - Amount, /* to be mounted or mounted upon */ - Acreate, /* is to be created */ - Aremove, /* will be removed by caller */ - - COPEN = 0x0001, /* for i/o */ - CMSG = 0x0002, /* the message channel for a mount */ -/* CCREATE = 0x0004, permits creation if c->mnt */ - CCEXEC = 0x0008, /* close on exec */ - CFREE = 0x0010, /* not in use */ - CRCLOSE = 0x0020, /* remove on close */ - CCACHE = 0x0080, /* client cache */ -}; - -/* flag values */ -enum -{ - BINTR = (1<<0), - BFREE = (1<<1), - Bipck = (1<<2), /* ip checksum */ - Budpck = (1<<3), /* udp checksum */ - Btcpck = (1<<4), /* tcp checksum */ - Bpktck = (1<<5), /* packet checksum */ -}; - -struct Block -{ - Block* next; - Block* list; - uchar* rp; /* first unconsumed byte */ - uchar* wp; /* first empty byte */ - uchar* lim; /* 1 past the end of the buffer */ - uchar* base; /* start of the buffer */ - void (*free)(Block*); - ushort flag; - ushort checksum; /* IP checksum of complete packet (minus media header) */ -}; -#define BLEN(s) ((s)->wp - (s)->rp) -#define BALLOC(s) ((s)->lim - (s)->base) - -struct Chan -{ - Ref ref; - Chan* next; /* allocation */ - Chan* link; - vlong offset; /* in file */ - ushort type; - ulong dev; - ushort mode; /* read/write */ - ushort flag; - Qid qid; - int fid; /* for devmnt */ - ulong iounit; /* chunk size for i/o; 0==default */ - Mhead* umh; /* mount point that derived Chan; used in unionread */ - Chan* umc; /* channel in union; held for union read */ - QLock umqlock; /* serialize unionreads */ - int uri; /* union read index */ - int dri; /* devdirread index */ - ulong mountid; - Mntcache *mcp; /* Mount cache pointer */ - Mnt *mux; /* Mnt for clients using me for messages */ - void* aux; - Qid pgrpid; /* for #p/notepg */ - ulong mid; /* for ns in devproc */ - Chan* mchan; /* channel to mounted server */ - Qid mqid; /* qid of root of mount point */ - Session*session; - Cname *name; -}; - -struct Cname -{ - Ref ref; - int alen; /* allocated length */ - int len; /* strlen(s) */ - char *s; -}; - -struct Dev -{ - int dc; - char* name; - - void (*reset)(void); - void (*init)(void); - void (*shutdown)(void); - Chan* (*attach)(char*); - Walkqid* (*walk)(Chan*, Chan*, char**, int); - int (*stat)(Chan*, uchar*, int); - Chan* (*open)(Chan*, int); - void (*create)(Chan*, char*, int, ulong); - void (*close)(Chan*); - long (*read)(Chan*, void*, long, vlong); - Block* (*bread)(Chan*, long, ulong); - long (*write)(Chan*, void*, long, vlong); - long (*bwrite)(Chan*, Block*, ulong); - void (*remove)(Chan*); - int (*wstat)(Chan*, uchar*, int); - void (*power)(int); /* power mgt: power(1) => on, power (0) => off */ - int (*config)(int, char*, DevConf*); // returns nil on error -}; - -struct Dirtab -{ - char name[KNAMELEN]; - Qid qid; - vlong length; - ulong perm; -}; - -struct Walkqid -{ - Chan *clone; - int nqid; - Qid qid[1]; -}; - -enum -{ - NSMAX = 1000, - NSLOG = 7, - NSCACHE = (1<<NSLOG), -}; - -struct Mntwalk /* state for /proc/#/ns */ -{ - int cddone; - ulong id; - Mhead* mh; - Mount* cm; -}; - -struct Mount -{ - ulong mountid; - Mount* next; - Mhead* head; - Mount* copy; - Mount* order; - Chan* to; /* channel replacing channel */ - int mflag; - char *spec; -}; - -struct Mhead -{ - Ref ref; - RWlock lock; - Chan* from; /* channel mounted upon */ - Mount* mount; /* what's mounted upon it */ - Mhead* hash; /* Hash chain */ -}; - -struct Mnt -{ - Lock lk; - /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */ - Chan *c; /* Channel to file service */ - Proc *rip; /* Reader in progress */ - Mntrpc *queue; /* Queue of pending requests on this channel */ - ulong id; /* Multiplexer id for channel check */ - Mnt *list; /* Free list */ - int flags; /* cache */ - int msize; /* data + IOHDRSZ */ - char *version; /* 9P version */ - Queue *q; /* input queue */ -}; - -enum -{ - NUser, /* note provided externally */ - NExit, /* deliver note quietly */ - NDebug, /* print debug message */ -}; - -struct Note -{ - char msg[ERRMAX]; - int flag; /* whether system posted it */ -}; - -enum -{ - RENDLOG = 5, - RENDHASH = 1<<RENDLOG, /* Hash to lookup rendezvous tags */ - MNTLOG = 5, - MNTHASH = 1<<MNTLOG, /* Hash to walk mount table */ - NFD = 100, /* per process file descriptors */ - PGHLOG = 9, - PGHSIZE = 1<<PGHLOG, /* Page hash for image lookup */ -}; -#define REND(p,s) ((p)->rendhash[(s)&((1<<RENDLOG)-1)]) -#define MOUNTH(p,qid) ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)]) - -struct Pgrp -{ - Ref ref; /* also used as a lock when mounting */ - int noattach; - ulong pgrpid; - QLock debug; /* single access via devproc.c */ - RWlock ns; /* Namespace n read/one write lock */ - Mhead *mnthash[MNTHASH]; -}; - -struct Rgrp -{ - Ref ref; - Proc *rendhash[RENDHASH]; /* Rendezvous tag hash */ -}; - -struct Egrp -{ - Ref ref; - RWlock lk; - Evalue **ent; - int nent; - int ment; - ulong path; /* qid.path of next Evalue to be allocated */ - ulong vers; /* of Egrp */ -}; - -struct Evalue -{ - char *name; - char *value; - int len; - Evalue *link; - Qid qid; -}; - -struct Fgrp -{ - Ref ref; - Chan **fd; - int nfd; /* number allocated */ - int maxfd; /* highest fd in use */ - int exceed; /* debugging */ -}; - -enum -{ - DELTAFD = 20, /* incremental increase in Fgrp.fd's */ - NERR = 20 -}; - -typedef uvlong Ticks; - -enum -{ - Running, - Rendezvous, - Wakeme, -}; - -struct Proc -{ - uint state; - uint mach; - - ulong pid; - ulong parentpid; - - Pgrp *pgrp; /* Process group for namespace */ - Fgrp *fgrp; /* File descriptor group */ - Rgrp *rgrp; - - Lock rlock; /* sync sleep/wakeup with postnote */ - Rendez *r; /* rendezvous point slept on */ - Rendez sleep; /* place for syssleep/debug */ - int notepending; /* note issued but not acted on */ - int kp; /* true if a kernel process */ - - void* rendtag; /* Tag for rendezvous */ - void* rendval; /* Value for rendezvous */ - Proc *rendhash; /* Hash list for tag values */ - - int nerrlab; - Label errlab[NERR]; - char user[KNAMELEN]; - char *syserrstr; /* last error from a system call, errbuf0 or 1 */ - char *errstr; /* reason we're unwinding the error stack, errbuf1 or 0 */ - char errbuf0[ERRMAX]; - char errbuf1[ERRMAX]; - char genbuf[128]; /* buffer used e.g. for last name element from namec */ - char text[KNAMELEN]; - - Chan *slash; - Chan *dot; - - Proc *qnext; - - void (*fn)(void*); - void *arg; - - char oproc[1024]; /* reserved for os */ - -}; - -enum -{ - PRINTSIZE = 256, - MAXCRYPT = 127, - NUMSIZE = 12, /* size of formatted number */ - MB = (1024*1024), - READSTR = 1000, /* temporary buffer size for device reads */ -}; - -extern char* conffile; -extern int cpuserver; -extern Dev* devtab[]; -extern char *eve; -extern char hostdomain[]; -extern uchar initcode[]; -extern Queue* kbdq; -extern Queue* kprintoq; -extern Ref noteidalloc; -extern Palloc palloc; -extern Queue *serialoq; -extern char* statename[]; -extern int nsyscall; -extern char *sysname; -extern uint qiomaxatomic; -extern Conf conf; -enum -{ - LRESPROF = 3, -}; - -/* - * action log - */ -struct Log { - Lock lk; - int opens; - char* buf; - char *end; - char *rptr; - int len; - int nlog; - int minread; - - int logmask; /* mask of things to debug */ - - QLock readq; - Rendez readr; -}; - -struct Logflag { - char* name; - int mask; -}; - -enum -{ - NCMDFIELD = 128 -}; - -struct Cmdbuf -{ - char *buf; - char **f; - int nf; -}; - -struct Cmdtab -{ - int index; /* used by client to switch on result */ - char *cmd; /* command name */ - int narg; /* expected #args; 0 ==> variadic */ -}; - -/* queue state bits, Qmsg, Qcoalesce, and Qkick can be set in qopen */ -enum -{ - /* Queue.state */ - Qstarve = (1<<0), /* consumer starved */ - Qmsg = (1<<1), /* message stream */ - Qclosed = (1<<2), /* queue has been closed/hungup */ - Qflow = (1<<3), /* producer flow controlled */ - Qcoalesce = (1<<4), /* coallesce packets on read */ - Qkick = (1<<5), /* always call the kick routine after qwrite */ -}; - -#define DEVDOTDOT -1 - -extern Proc *_getproc(void); -extern void _setproc(Proc*); -#define up (_getproc()) diff --git a/sys/src/cmd/unix/drawterm/kern/data.c b/sys/src/cmd/unix/drawterm/kern/data.c deleted file mode 100644 index 735e5e0c4..000000000 --- a/sys/src/cmd/unix/drawterm/kern/data.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -Proc *up; -Conf conf = -{ - 1, - 100, - 0, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 1024*1024*1024, - 0, -}; - -char *eve = "eve"; -ulong kerndate; -int cpuserver; -char hostdomain[] = "drawterm.net"; diff --git a/sys/src/cmd/unix/drawterm/kern/dev.c b/sys/src/cmd/unix/drawterm/kern/dev.c deleted file mode 100644 index 83bf624f3..000000000 --- a/sys/src/cmd/unix/drawterm/kern/dev.c +++ /dev/null @@ -1,468 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -extern ulong kerndate; - -void -mkqid(Qid *q, vlong path, ulong vers, int type) -{ - q->type = type; - q->vers = vers; - q->path = path; -} - -int -devno(int c, int user) -{ - int i; - - for(i = 0; devtab[i] != nil; i++) { - if(devtab[i]->dc == c) - return i; - } - if(user == 0) - panic("devno %C 0x%ux", c, c); - - return -1; -} - -void -devdir(Chan *c, Qid qid, char *n, vlong length, char *user, long perm, Dir *db) -{ - db->name = n; - if(c->flag&CMSG) - qid.type |= QTMOUNT; - db->qid = qid; - db->type = devtab[c->type]->dc; - db->dev = c->dev; - db->mode = perm; - db->mode |= qid.type << 24; - db->atime = seconds(); - db->mtime = kerndate; - db->length = length; - db->uid = user; - db->gid = eve; - db->muid = user; -} - -/* - * (here, Devgen is the prototype; devgen is the function in dev.c.) - * - * a Devgen is expected to return the directory entry for ".." - * if you pass it s==DEVDOTDOT (-1). otherwise... - * - * there are two contradictory rules. - * - * (i) if c is a directory, a Devgen is expected to list its children - * as you iterate s. - * - * (ii) whether or not c is a directory, a Devgen is expected to list - * its siblings as you iterate s. - * - * devgen always returns the list of children in the root - * directory. thus it follows (i) when c is the root and (ii) otherwise. - * many other Devgens follow (i) when c is a directory and (ii) otherwise. - * - * devwalk assumes (i). it knows that devgen breaks (i) - * for children that are themselves directories, and explicitly catches them. - * - * devstat assumes (ii). if the Devgen in question follows (i) - * for this particular c, devstat will not find the necessary info. - * with our particular Devgen functions, this happens only for - * directories, so devstat makes something up, assuming - * c->name, c->qid, eve, DMDIR|0555. - * - * devdirread assumes (i). the callers have to make sure - * that the Devgen satisfies (i) for the chan being read. - */ -/* - * the zeroth element of the table MUST be the directory itself for .. -*/ -int -devgen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp) -{ - if(tab == 0) - return -1; - if(i == DEVDOTDOT){ - /* nothing */ - }else if(name){ - for(i=1; i<ntab; i++) - if(strcmp(tab[i].name, name) == 0) - break; - if(i==ntab) - return -1; - tab += i; - }else{ - /* skip over the first element, that for . itself */ - i++; - if(i >= ntab) - return -1; - tab += i; - } - devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp); - return 1; -} - -void -devreset(void) -{ -} - -void -devinit(void) -{ -} - -void -devshutdown(void) -{ -} - -Chan* -devattach(int tc, char *spec) -{ - Chan *c; - char *buf; - - c = newchan(); - mkqid(&c->qid, 0, 0, QTDIR); - c->type = devno(tc, 0); - if(spec == nil) - spec = ""; - buf = smalloc(4+strlen(spec)+1); - sprint(buf, "#%C%s", tc, spec); - c->name = newcname(buf); - free(buf); - return c; -} - - -Chan* -devclone(Chan *c) -{ - Chan *nc; - - if(c->flag & COPEN) - panic("clone of open file type %C\n", devtab[c->type]->dc); - - nc = newchan(); - - nc->type = c->type; - nc->dev = c->dev; - nc->mode = c->mode; - nc->qid = c->qid; - nc->offset = c->offset; - nc->umh = nil; - nc->mountid = c->mountid; - nc->aux = c->aux; - nc->pgrpid = c->pgrpid; - nc->mid = c->mid; - nc->mqid = c->mqid; - nc->mcp = c->mcp; - return nc; -} - -Walkqid* -devwalk(Chan *c, Chan *nc, char **name, int nname, Dirtab *tab, int ntab, Devgen *gen) -{ - int i, j, alloc; - Walkqid *wq; - char *n; - Dir dir; - - if(nname > 0) - isdir(c); - - alloc = 0; - wq = smalloc(sizeof(Walkqid)+(nname-1)*sizeof(Qid)); - if(waserror()){ - if(alloc && wq->clone!=nil) - cclose(wq->clone); - free(wq); - return nil; - } - if(nc == nil){ - nc = devclone(c); - nc->type = 0; /* device doesn't know about this channel yet */ - alloc = 1; - } - wq->clone = nc; - - for(j=0; j<nname; j++){ - if(!(nc->qid.type&QTDIR)){ - if(j==0) - error(Enotdir); - goto Done; - } - n = name[j]; - if(strcmp(n, ".") == 0){ - Accept: - wq->qid[wq->nqid++] = nc->qid; - continue; - } - if(strcmp(n, "..") == 0){ - if((*gen)(nc, nil, tab, ntab, DEVDOTDOT, &dir) != 1){ - print("devgen walk .. in dev%s %llux broken\n", - devtab[nc->type]->name, nc->qid.path); - error("broken devgen"); - } - nc->qid = dir.qid; - goto Accept; - } - /* - * Ugly problem: If we're using devgen, make sure we're - * walking the directory itself, represented by the first - * entry in the table, and not trying to step into a sub- - * directory of the table, e.g. /net/net. Devgen itself - * should take care of the problem, but it doesn't have - * the necessary information (that we're doing a walk). - */ - if(gen==devgen && nc->qid.path!=tab[0].qid.path) - goto Notfound; - for(i=0;; i++) { - switch((*gen)(nc, n, tab, ntab, i, &dir)){ - case -1: - Notfound: - if(j == 0) - error(Enonexist); - kstrcpy(up->errstr, Enonexist, ERRMAX); - goto Done; - case 0: - continue; - case 1: - if(strcmp(n, dir.name) == 0){ - nc->qid = dir.qid; - goto Accept; - } - continue; - } - } - } - /* - * We processed at least one name, so will return some data. - * If we didn't process all nname entries succesfully, we drop - * the cloned channel and return just the Qids of the walks. - */ -Done: - poperror(); - if(wq->nqid < nname){ - if(alloc) - cclose(wq->clone); - wq->clone = nil; - }else if(wq->clone){ - /* attach cloned channel to same device */ - wq->clone->type = c->type; - } - return wq; -} - -int -devstat(Chan *c, uchar *db, int n, Dirtab *tab, int ntab, Devgen *gen) -{ - int i; - Dir dir; - char *p, *elem; - - for(i=0;; i++) - switch((*gen)(c, nil, tab, ntab, i, &dir)){ - case -1: - if(c->qid.type & QTDIR){ - if(c->name == nil) - elem = "???"; - else if(strcmp(c->name->s, "/") == 0) - elem = "/"; - else - for(elem=p=c->name->s; *p; p++) - if(*p == '/') - elem = p+1; - devdir(c, c->qid, elem, 0, eve, DMDIR|0555, &dir); - n = convD2M(&dir, db, n); - if(n == 0) - error(Ebadarg); - return n; - } - print("devstat %C %llux\n", devtab[c->type]->dc, c->qid.path); - - error(Enonexist); - case 0: - break; - case 1: - if(c->qid.path == dir.qid.path) { - if(c->flag&CMSG) - dir.mode |= DMMOUNT; - n = convD2M(&dir, db, n); - if(n == 0) - error(Ebadarg); - return n; - } - break; - } - error(Egreg); /* not reached? */ - return -1; -} - -long -devdirread(Chan *c, char *d, long n, Dirtab *tab, int ntab, Devgen *gen) -{ - long m, dsz; - struct{ - Dir d; - char slop[100]; - }dir; - - for(m=0; m<n; c->dri++) { - switch((*gen)(c, nil, tab, ntab, c->dri, &dir.d)){ - case -1: - return m; - - case 0: - break; - - case 1: - dsz = convD2M(&dir.d, (uchar*)d, n-m); - if(dsz <= BIT16SZ){ /* <= not < because this isn't stat; read is stuck */ - if(m == 0) - error(Eshort); - return m; - } - m += dsz; - d += dsz; - break; - } - } - - return m; -} - -/* - * error(Eperm) if open permission not granted for up->user. - */ -void -devpermcheck(char *fileuid, ulong perm, int omode) -{ - ulong t; - static int access[] = { 0400, 0200, 0600, 0100 }; - - if(strcmp(up->user, fileuid) == 0) - perm <<= 0; - else - if(strcmp(up->user, eve) == 0) - perm <<= 3; - else - perm <<= 6; - - t = access[omode&3]; - if((t&perm) != t) - error(Eperm); -} - -Chan* -devopen(Chan *c, int omode, Dirtab *tab, int ntab, Devgen *gen) -{ - int i; - Dir dir; - - for(i=0;; i++) { - switch((*gen)(c, nil, tab, ntab, i, &dir)){ - case -1: - goto Return; - case 0: - break; - case 1: - if(c->qid.path == dir.qid.path) { - devpermcheck(dir.uid, dir.mode, omode); - goto Return; - } - break; - } - } -Return: - c->offset = 0; - if((c->qid.type&QTDIR) && omode!=OREAD) - error(Eperm); - c->mode = openmode(omode); - c->flag |= COPEN; - return c; -} - -void -devcreate(Chan *c, char *name, int mode, ulong perm) -{ - USED(c); - USED(name); - USED(mode); - USED(perm); - - error(Eperm); -} - -Block* -devbread(Chan *c, long n, ulong offset) -{ - Block *bp; - - bp = allocb(n); - if(bp == 0) - error(Enomem); - if(waserror()) { - freeb(bp); - nexterror(); - } - bp->wp += devtab[c->type]->read(c, bp->wp, n, offset); - poperror(); - return bp; -} - -long -devbwrite(Chan *c, Block *bp, ulong offset) -{ - long n; - - if(waserror()) { - freeb(bp); - nexterror(); - } - n = devtab[c->type]->write(c, bp->rp, BLEN(bp), offset); - poperror(); - freeb(bp); - - return n; -} - -void -devremove(Chan *c) -{ - USED(c); - error(Eperm); -} - -int -devwstat(Chan *c, uchar *a, int n) -{ - USED(c); - USED(a); - USED(n); - - error(Eperm); - return 0; -} - -void -devpower(int a) -{ - USED(a); - error(Eperm); -} - -int -devconfig(int a, char *b, DevConf *c) -{ - USED(a); - USED(b); - USED(c); - error(Eperm); - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/kern/devaudio-none.c b/sys/src/cmd/unix/drawterm/kern/devaudio-none.c deleted file mode 100644 index 57a536651..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devaudio-none.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Linux and BSD - */ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" -#include "devaudio.h" - -/* maybe this should return -1 instead of sysfatal */ -void -audiodevopen(void) -{ - error("no audio support"); -} - -void -audiodevclose(void) -{ - error("no audio support"); -} - -int -audiodevread(void *a, int n) -{ - error("no audio support"); - return -1; -} - -int -audiodevwrite(void *a, int n) -{ - error("no audio support"); - return -1; -} - -void -audiodevsetvol(int what, int left, int right) -{ - error("no audio support"); -} - -void -audiodevgetvol(int what, int *left, int *right) -{ - error("no audio support"); -} - diff --git a/sys/src/cmd/unix/drawterm/kern/devaudio-unix.c b/sys/src/cmd/unix/drawterm/kern/devaudio-unix.c deleted file mode 100644 index ad5af7458..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devaudio-unix.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Linux and BSD - */ -#include <sys/ioctl.h> -#ifdef __linux__ -#include <linux/soundcard.h> -#else -#include <sys/soundcard.h> -#endif -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" -#include "devaudio.h" - -enum -{ - Channels = 2, - Rate = 44100, - Bits = 16, - Bigendian = 1, -}; - -static int afd = -1; -static int cfd= -1; -static int speed; - -/* maybe this should return -1 instead of sysfatal */ -void -audiodevopen(void) -{ - int t; - ulong ul; - - afd = -1; - cfd = -1; - if((afd = open("/dev/dsp", OWRITE)) < 0) - goto err; - if((cfd = open("/dev/mixer", ORDWR)) < 0) - goto err; - - t = Bits; - if(ioctl(afd, SNDCTL_DSP_SAMPLESIZE, &t) < 0) - goto err; - - t = Channels-1; - if(ioctl(afd, SNDCTL_DSP_STEREO, &t) < 0) - goto err; - - speed = Rate; - ul = Rate; - if(ioctl(afd, SNDCTL_DSP_SPEED, &ul) < 0) - goto err; - - return; - -err: - if(afd >= 0) - close(afd); - afd = -1; - oserror(); -} - -void -audiodevclose(void) -{ - close(afd); - close(cfd); - afd = -1; - cfd = -1; -} - -static struct { - int id9; - int id; -} names[] = { - Vaudio, SOUND_MIXER_VOLUME, - Vbass, SOUND_MIXER_BASS, - Vtreb, SOUND_MIXER_TREBLE, - Vline, SOUND_MIXER_LINE, - Vpcm, SOUND_MIXER_PCM, - Vsynth, SOUND_MIXER_SYNTH, - Vcd, SOUND_MIXER_CD, - Vmic, SOUND_MIXER_MIC, -// "record", SOUND_MIXER_RECLEV, -// "mix", SOUND_MIXER_IMIX, -// "pcm2", SOUND_MIXER_ALTPCM, - Vspeaker, SOUND_MIXER_SPEAKER -// "line1", SOUND_MIXER_LINE1, -// "line2", SOUND_MIXER_LINE2, -// "line3", SOUND_MIXER_LINE3, -// "digital1", SOUND_MIXER_DIGITAL1, -// "digital2", SOUND_MIXER_DIGITAL2, -// "digital3", SOUND_MIXER_DIGITAL3, -// "phonein", SOUND_MIXER_PHONEIN, -// "phoneout", SOUND_MIXER_PHONEOUT, -// "radio", SOUND_MIXER_RADIO, -// "video", SOUND_MIXER_VIDEO, -// "monitor", SOUND_MIXER_MONITOR, -// "igain", SOUND_MIXER_IGAIN, -// "ogain", SOUND_MIXER_OGAIN, -}; - -static int -lookname(int id9) -{ - int i; - - for(i=0; i<nelem(names); i++) - if(names[i].id9 == id9) - return names[i].id; - return -1; -} - -void -audiodevsetvol(int what, int left, int right) -{ - int id; - ulong x; - int can, v; - - if(cfd < 0) - error("audio device not open"); - if(what == Vspeed){ - x = left; - if(ioctl(afd, SNDCTL_DSP_SPEED, &x) < 0) - oserror(); - speed = x; - return; - } - if((id = lookname(what)) < 0) - return; - if(ioctl(cfd, SOUND_MIXER_READ_DEVMASK, &can) < 0) - can = ~0; - if(!(can & (1<<id))) - return; - v = left | (right<<8); - if(ioctl(cfd, MIXER_WRITE(id), &v) < 0) - oserror(); -} - -void -audiodevgetvol(int what, int *left, int *right) -{ - int id; - int can, v; - - if(cfd < 0) - error("audio device not open"); - if(what == Vspeed){ - *left = *right = speed; - return; - } - if((id = lookname(what)) < 0) - return; - if(ioctl(cfd, SOUND_MIXER_READ_DEVMASK, &can) < 0) - can = ~0; - if(!(can & (1<<id))) - return; - if(ioctl(cfd, MIXER_READ(id), &v) < 0) - oserror(); - *left = v&0xFF; - *right = (v>>8)&0xFF; -} - -int -audiodevwrite(void *v, int n) -{ - int m, tot; - - for(tot=0; tot<n; tot+=m) - if((m = write(afd, (uchar*)v+tot, n-tot)) <= 0) - oserror(); - return tot; -} - -int -audiodevread(void *v, int n) -{ - error("no reading"); - return -1; -} diff --git a/sys/src/cmd/unix/drawterm/kern/devaudio.c b/sys/src/cmd/unix/drawterm/kern/devaudio.c deleted file mode 100644 index b6d0cc512..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devaudio.c +++ /dev/null @@ -1,372 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" -#include "devaudio.h" - -enum -{ - Qdir = 0, - Qaudio, - Qvolume, - - Aclosed = 0, - Aread, - Awrite, - - Speed = 44100, - Ncmd = 50, /* max volume command words */ -}; - -Dirtab -audiodir[] = -{ - ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555, - "audio", {Qaudio}, 0, 0666, - "volume", {Qvolume}, 0, 0666, -}; - -static struct -{ - QLock lk; - Rendez vous; - int amode; /* Aclosed/Aread/Awrite for /audio */ -} audio; - -#define aqlock(a) qlock(&(a)->lk) -#define aqunlock(a) qunlock(&(a)->lk) - -static struct -{ - char* name; - int flag; - int ilval; /* initial values */ - int irval; -} volumes[] = -{ - "audio", Fout, 50, 50, - "synth", Fin|Fout, 0, 0, - "cd", Fin|Fout, 0, 0, - "line", Fin|Fout, 0, 0, - "mic", Fin|Fout|Fmono, 0, 0, - "speaker", Fout|Fmono, 0, 0, - - "treb", Fout, 50, 50, - "bass", Fout, 50, 50, - - "speed", Fin|Fout|Fmono, Speed, Speed, - 0 -}; - -static char Emode[] = "illegal open mode"; -static char Evolume[] = "illegal volume specifier"; - -static void -resetlevel(void) -{ - int i; - - for(i=0; volumes[i].name; i++) - audiodevsetvol(i, volumes[i].ilval, volumes[i].irval); -} - -static void -audioinit(void) -{ -} - -static Chan* -audioattach(char *param) -{ - return devattach('A', param); -} - -static Walkqid* -audiowalk(Chan *c, Chan *nc, char **name, int nname) -{ - return devwalk(c, nc, name, nname, audiodir, nelem(audiodir), devgen); -} - -static int -audiostat(Chan *c, uchar *db, int n) -{ - return devstat(c, db, n, audiodir, nelem(audiodir), devgen); -} - -static Chan* -audioopen(Chan *c, int omode) -{ - int amode; - - switch((ulong)c->qid.path) { - default: - error(Eperm); - break; - - case Qvolume: - case Qdir: - break; - - case Qaudio: - amode = Awrite; - if((omode&7) == OREAD) - amode = Aread; - aqlock(&audio); - if(waserror()){ - aqunlock(&audio); - nexterror(); - } - if(audio.amode != Aclosed) - error(Einuse); - audiodevopen(); - audio.amode = amode; - poperror(); - aqunlock(&audio); - break; - } - c = devopen(c, omode, audiodir, nelem(audiodir), devgen); - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - - return c; -} - -static void -audioclose(Chan *c) -{ - switch((ulong)c->qid.path) { - default: - error(Eperm); - break; - - case Qdir: - case Qvolume: - break; - - case Qaudio: - if(c->flag & COPEN) { - aqlock(&audio); - audiodevclose(); - audio.amode = Aclosed; - aqunlock(&audio); - } - break; - } -} - -static long -audioread(Chan *c, void *v, long n, vlong off) -{ - int liv, riv, lov, rov; - long m; - char buf[300]; - int j; - ulong offset = off; - char *a; - - a = v; - switch((ulong)c->qid.path) { - default: - error(Eperm); - break; - - case Qdir: - return devdirread(c, a, n, audiodir, nelem(audiodir), devgen); - - case Qaudio: - if(audio.amode != Aread) - error(Emode); - aqlock(&audio); - if(waserror()){ - aqunlock(&audio); - nexterror(); - } - n = audiodevread(v, n); - poperror(); - aqunlock(&audio); - break; - - case Qvolume: - j = 0; - buf[0] = 0; - for(m=0; volumes[m].name; m++){ - audiodevgetvol(m, &lov, &rov); - liv = lov; - riv = rov; - j += snprint(buf+j, sizeof(buf)-j, "%s", volumes[m].name); - if((volumes[m].flag & Fmono) || (liv==riv && lov==rov)){ - if((volumes[m].flag&(Fin|Fout))==(Fin|Fout) && liv==lov) - j += snprint(buf+j, sizeof(buf)-j, " %d", liv); - else{ - if(volumes[m].flag & Fin) - j += snprint(buf+j, sizeof(buf)-j, - " in %d", liv); - if(volumes[m].flag & Fout) - j += snprint(buf+j, sizeof(buf)-j, - " out %d", lov); - } - }else{ - if((volumes[m].flag&(Fin|Fout))==(Fin|Fout) && - liv==lov && riv==rov) - j += snprint(buf+j, sizeof(buf)-j, - " left %d right %d", - liv, riv); - else{ - if(volumes[m].flag & Fin) - j += snprint(buf+j, sizeof(buf)-j, - " in left %d right %d", - liv, riv); - if(volumes[m].flag & Fout) - j += snprint(buf+j, sizeof(buf)-j, - " out left %d right %d", - lov, rov); - } - } - j += snprint(buf+j, sizeof(buf)-j, "\n"); - } - return readstr(offset, a, n, buf); - } - return n; -} - -static long -audiowrite(Chan *c, void *vp, long n, vlong off) -{ - long m; - int i, v, left, right, in, out; - Cmdbuf *cb; - char *a; - - USED(off); - a = vp; - switch((ulong)c->qid.path) { - default: - error(Eperm); - break; - - case Qvolume: - v = Vaudio; - left = 1; - right = 1; - in = 1; - out = 1; - cb = parsecmd(vp, n); - if(waserror()){ - free(cb); - nexterror(); - } - - for(i = 0; i < cb->nf; i++){ - /* - * a number is volume - */ - if(cb->f[i][0] >= '0' && cb->f[i][0] <= '9') { - m = strtoul(cb->f[i], 0, 10); - if(!out) - goto cont0; - if(left && right) - audiodevsetvol(v, m, m); - else if(left) - audiodevsetvol(v, m, -1); - else if(right) - audiodevsetvol(v, -1, m); - goto cont0; - } - - for(m=0; volumes[m].name; m++) { - if(strcmp(cb->f[i], volumes[m].name) == 0) { - v = m; - in = 1; - out = 1; - left = 1; - right = 1; - goto cont0; - } - } - - if(strcmp(cb->f[i], "reset") == 0) { - resetlevel(); - goto cont0; - } - if(strcmp(cb->f[i], "in") == 0) { - in = 1; - out = 0; - goto cont0; - } - if(strcmp(cb->f[i], "out") == 0) { - in = 0; - out = 1; - goto cont0; - } - if(strcmp(cb->f[i], "left") == 0) { - left = 1; - right = 0; - goto cont0; - } - if(strcmp(cb->f[i], "right") == 0) { - left = 0; - right = 1; - goto cont0; - } - error(Evolume); - break; - cont0:; - } - free(cb); - poperror(); - break; - - case Qaudio: - if(audio.amode != Awrite) - error(Emode); - aqlock(&audio); - if(waserror()){ - aqunlock(&audio); - nexterror(); - } - n = audiodevwrite(vp, n); - poperror(); - aqunlock(&audio); - break; - } - return n; -} - -void -audioswab(uchar *a, uint n) -{ - ulong *p, *ep, b; - - p = (ulong*)a; - ep = p + (n>>2); - while(p < ep) { - b = *p; - b = (b>>24) | (b<<24) | - ((b&0xff0000) >> 8) | - ((b&0x00ff00) << 8); - *p++ = b; - } -} - -Dev audiodevtab = { - 'A', - "audio", - - devreset, - audioinit, - devshutdown, - audioattach, - audiowalk, - audiostat, - audioopen, - devcreate, - audioclose, - audioread, - devbread, - audiowrite, - devbwrite, - devremove, - devwstat, -}; diff --git a/sys/src/cmd/unix/drawterm/kern/devaudio.h b/sys/src/cmd/unix/drawterm/kern/devaudio.h deleted file mode 100644 index e6cc7ed21..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devaudio.h +++ /dev/null @@ -1,25 +0,0 @@ -enum -{ - Fmono = 1, - Fin = 2, - Fout = 4, - - Vaudio = 0, - Vsynth, - Vcd, - Vline, - Vmic, - Vspeaker, - Vtreb, - Vbass, - Vspeed, - Vpcm, - Nvol, -}; - -void audiodevopen(void); -void audiodevclose(void); -int audiodevread(void*, int); -int audiodevwrite(void*, int); -void audiodevgetvol(int, int*, int*); -void audiodevsetvol(int, int, int); diff --git a/sys/src/cmd/unix/drawterm/kern/devcons.c b/sys/src/cmd/unix/drawterm/kern/devcons.c deleted file mode 100644 index bd80d6eae..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devcons.c +++ /dev/null @@ -1,1193 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "keyboard.h" - -void (*consdebug)(void) = 0; -void (*screenputs)(char*, int) = 0; - -Queue* kbdq; /* unprocessed console input */ -Queue* lineq; /* processed console input */ -Queue* serialoq; /* serial console output */ -Queue* kprintoq; /* console output, for /dev/kprint */ -long kprintinuse; /* test and set whether /dev/kprint is open */ -Lock kprintlock; -int iprintscreenputs = 0; - -int panicking; - -struct -{ - int exiting; - int machs; -} active; - -static struct -{ - QLock lk; - - int raw; /* true if we shouldn't process input */ - int ctl; /* number of opens to the control file */ - int x; /* index into line */ - char line[1024]; /* current input line */ - - int count; - int ctlpoff; - - /* a place to save up characters at interrupt time before dumping them in the queue */ - Lock lockputc; - char istage[1024]; - char *iw; - char *ir; - char *ie; -} kbd = { - { 0 }, - 0, - 0, - 0, - { 0 }, - 0, - 0, - { 0 }, - { 0 }, - kbd.istage, - kbd.istage, - kbd.istage + sizeof(kbd.istage), -}; - -char *sysname; -vlong fasthz; - -static int readtime(ulong, char*, int); -static int readbintime(char*, int); -static int writetime(char*, int); -static int writebintime(char*, int); - -enum -{ - CMreboot, - CMpanic, -}; - -Cmdtab rebootmsg[] = -{ - CMreboot, "reboot", 0, - CMpanic, "panic", 0, -}; - -int -return0(void *v) -{ - return 0; -} - -void -printinit(void) -{ - lineq = qopen(2*1024, 0, 0, nil); - if(lineq == nil) - panic("printinit"); - qnoblock(lineq, 1); - - kbdq = qopen(4*1024, 0, 0, 0); - if(kbdq == nil) - panic("kbdinit"); - qnoblock(kbdq, 1); -} - -int -consactive(void) -{ - if(serialoq) - return qlen(serialoq) > 0; - return 0; -} - -void -prflush(void) -{ -/* - ulong now; - - now = m->ticks; - while(consactive()) - if(m->ticks - now >= HZ) - break; -*/ -} - -/* - * Print a string on the console. Convert \n to \r\n for serial - * line consoles. Locking of the queues is left up to the screen - * or uart code. Multi-line messages to serial consoles may get - * interspersed with other messages. - */ -static void -putstrn0(char *str, int n, int usewrite) -{ - /* - * if someone is reading /dev/kprint, - * put the message there. - * if not and there's an attached bit mapped display, - * put the message there. - * - * if there's a serial line being used as a console, - * put the message there. - */ - if(kprintoq != nil && !qisclosed(kprintoq)){ - if(usewrite) - qwrite(kprintoq, str, n); - else - qiwrite(kprintoq, str, n); - }else if(screenputs != 0) - screenputs(str, n); -} - -void -putstrn(char *str, int n) -{ - putstrn0(str, n, 0); -} - -int noprint; - -int -print(char *fmt, ...) -{ - int n; - va_list arg; - char buf[PRINTSIZE]; - - if(noprint) - return -1; - - va_start(arg, fmt); - n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf; - va_end(arg); - putstrn(buf, n); - - return n; -} - -void -panic(char *fmt, ...) -{ - int n; - va_list arg; - char buf[PRINTSIZE]; - - kprintoq = nil; /* don't try to write to /dev/kprint */ - - if(panicking) - for(;;); - panicking = 1; - - splhi(); - strcpy(buf, "panic: "); - va_start(arg, fmt); - n = vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf; - va_end(arg); - buf[n] = '\n'; - uartputs(buf, n+1); - if(consdebug) - (*consdebug)(); - spllo(); - prflush(); - putstrn(buf, n+1); - dumpstack(); - - exit(1); -} - -int -pprint(char *fmt, ...) -{ - int n; - Chan *c; - va_list arg; - char buf[2*PRINTSIZE]; - - if(up == nil || up->fgrp == nil) - return 0; - - c = up->fgrp->fd[2]; - if(c==0 || (c->mode!=OWRITE && c->mode!=ORDWR)) - return 0; - n = sprint(buf, "%s %lud: ", up->text, up->pid); - va_start(arg, fmt); - n = vseprint(buf+n, buf+sizeof(buf), fmt, arg) - buf; - va_end(arg); - - if(waserror()) - return 0; - devtab[c->type]->write(c, buf, n, c->offset); - poperror(); - - lock(&c->ref.lk); - c->offset += n; - unlock(&c->ref.lk); - - return n; -} - -static void -echoscreen(char *buf, int n) -{ - char *e, *p; - char ebuf[128]; - int x; - - p = ebuf; - e = ebuf + sizeof(ebuf) - 4; - while(n-- > 0){ - if(p >= e){ - screenputs(ebuf, p - ebuf); - p = ebuf; - } - x = *buf++; - if(x == 0x15){ - *p++ = '^'; - *p++ = 'U'; - *p++ = '\n'; - } else - *p++ = x; - } - if(p != ebuf) - screenputs(ebuf, p - ebuf); -} - -static void -echoserialoq(char *buf, int n) -{ - char *e, *p; - char ebuf[128]; - int x; - - p = ebuf; - e = ebuf + sizeof(ebuf) - 4; - while(n-- > 0){ - if(p >= e){ - qiwrite(serialoq, ebuf, p - ebuf); - p = ebuf; - } - x = *buf++; - if(x == '\n'){ - *p++ = '\r'; - *p++ = '\n'; - } else if(x == 0x15){ - *p++ = '^'; - *p++ = 'U'; - *p++ = '\n'; - } else - *p++ = x; - } - if(p != ebuf) - qiwrite(serialoq, ebuf, p - ebuf); -} - -static void -echo(char *buf, int n) -{ - static int ctrlt; - int x; - char *e, *p; - - e = buf+n; - for(p = buf; p < e; p++){ - switch(*p){ - case 0x10: /* ^P */ - if(cpuserver && !kbd.ctlpoff){ - active.exiting = 1; - return; - } - break; - case 0x14: /* ^T */ - ctrlt++; - if(ctrlt > 2) - ctrlt = 2; - continue; - } - - if(ctrlt != 2) - continue; - - /* ^T escapes */ - ctrlt = 0; - switch(*p){ - case 'S': - x = splhi(); - dumpstack(); - procdump(); - splx(x); - return; - case 's': - dumpstack(); - return; - case 'x': - xsummary(); - ixsummary(); - mallocsummary(); - pagersummary(); - return; - case 'd': - if(consdebug == 0) - consdebug = rdb; - else - consdebug = 0; - print("consdebug now 0x%p\n", consdebug); - return; - case 'D': - if(consdebug == 0) - consdebug = rdb; - consdebug(); - return; - case 'p': - x = spllo(); - procdump(); - splx(x); - return; - case 'q': - scheddump(); - return; - case 'k': - killbig(); - return; - case 'r': - exit(0); - return; - } - } - - qproduce(kbdq, buf, n); - if(kbd.raw) - return; - if(screenputs != 0) - echoscreen(buf, n); - if(serialoq) - echoserialoq(buf, n); -} - -/* - * Called by a uart interrupt for console input. - * - * turn '\r' into '\n' before putting it into the queue. - */ -int -kbdcr2nl(Queue *q, int ch) -{ - char *next; - - USED(q); - ilock(&kbd.lockputc); /* just a mutex */ - if(ch == '\r' && !kbd.raw) - ch = '\n'; - next = kbd.iw+1; - if(next >= kbd.ie) - next = kbd.istage; - if(next != kbd.ir){ - *kbd.iw = ch; - kbd.iw = next; - } - iunlock(&kbd.lockputc); - return 0; -} -static -void -_kbdputc(int c) -{ - Rune r; - char buf[UTFmax]; - int n; - - r = c; - n = runetochar(buf, &r); - if(n == 0) - return; - echo(buf, n); -// kbd.c = r; -// qproduce(kbdq, buf, n); -} - -/* _kbdputc, but with compose translation */ -int -kbdputc(Queue *q, int c) -{ - int i; - static int collecting, nk; - static Rune kc[5]; - - if(c == Kalt){ - collecting = 1; - nk = 0; - return 0; - } - - if(!collecting){ - _kbdputc(c); - return 0; - } - - kc[nk++] = c; - c = latin1(kc, nk); - if(c < -1) /* need more keystrokes */ - return 0; - if(c != -1) /* valid sequence */ - _kbdputc(c); - else - for(i=0; i<nk; i++) - _kbdputc(kc[i]); - nk = 0; - collecting = 0; - - return 0; -} - - -enum{ - Qdir, - Qbintime, - Qcons, - Qconsctl, - Qcpunote, - Qcputime, - Qdrivers, - Qkprint, - Qhostdomain, - Qhostowner, - Qnull, - Qosversion, - Qpgrpid, - Qpid, - Qppid, - Qrandom, - Qreboot, - Qsecstore, - Qshowfile, - Qsnarf, - Qswap, - Qsysname, - Qsysstat, - Qtime, - Quser, - Qzero, -}; - -enum -{ - VLNUMSIZE= 22, -}; - -static Dirtab consdir[]={ - ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555, - "bintime", {Qbintime}, 24, 0664, - "cons", {Qcons}, 0, 0660, - "consctl", {Qconsctl}, 0, 0220, - "cpunote", {Qcpunote}, 0, 0444, - "cputime", {Qcputime}, 6*NUMSIZE, 0444, - "drivers", {Qdrivers}, 0, 0444, - "hostdomain", {Qhostdomain}, DOMLEN, 0664, - "hostowner", {Qhostowner}, 0, 0664, - "kprint", {Qkprint, 0, QTEXCL}, 0, DMEXCL|0440, - "null", {Qnull}, 0, 0666, - "osversion", {Qosversion}, 0, 0444, - "pgrpid", {Qpgrpid}, NUMSIZE, 0444, - "pid", {Qpid}, NUMSIZE, 0444, - "ppid", {Qppid}, NUMSIZE, 0444, - "random", {Qrandom}, 0, 0444, - "reboot", {Qreboot}, 0, 0664, - "secstore", {Qsecstore}, 0, 0666, - "showfile", {Qshowfile}, 0, 0220, - "snarf", {Qsnarf}, 0, 0666, - "swap", {Qswap}, 0, 0664, - "sysname", {Qsysname}, 0, 0664, - "sysstat", {Qsysstat}, 0, 0666, - "time", {Qtime}, NUMSIZE+3*VLNUMSIZE, 0664, - "user", {Quser}, 0, 0666, - "zero", {Qzero}, 0, 0444, -}; - -char secstorebuf[65536]; -Dirtab *secstoretab = &consdir[Qsecstore]; -Dirtab *snarftab = &consdir[Qsnarf]; - -int -readnum(ulong off, char *buf, ulong n, ulong val, int size) -{ - char tmp[64]; - - snprint(tmp, sizeof(tmp), "%*.0lud", size-1, val); - tmp[size-1] = ' '; - if(off >= size) - return 0; - if(off+n > size) - n = size-off; - memmove(buf, tmp+off, n); - return n; -} - -int -readstr(ulong off, char *buf, ulong n, char *str) -{ - int size; - - size = strlen(str); - if(off >= size) - return 0; - if(off+n > size) - n = size-off; - memmove(buf, str+off, n); - return n; -} - -static void -consinit(void) -{ - todinit(); - randominit(); - /* - * at 115200 baud, the 1024 char buffer takes 56 ms to process, - * processing it every 22 ms should be fine - */ -/* addclock0link(kbdputcclock, 22); */ -} - -static Chan* -consattach(char *spec) -{ - return devattach('c', spec); -} - -static Walkqid* -conswalk(Chan *c, Chan *nc, char **name, int nname) -{ - return devwalk(c, nc, name,nname, consdir, nelem(consdir), devgen); -} - -static int -consstat(Chan *c, uchar *dp, int n) -{ - return devstat(c, dp, n, consdir, nelem(consdir), devgen); -} - -static Chan* -consopen(Chan *c, int omode) -{ - c->aux = nil; - c = devopen(c, omode, consdir, nelem(consdir), devgen); - switch((ulong)c->qid.path){ - case Qconsctl: - qlock(&kbd.lk); - kbd.ctl++; - qunlock(&kbd.lk); - break; - - case Qkprint: - lock(&kprintlock); - if(kprintinuse != 0){ - c->flag &= ~COPEN; - unlock(&kprintlock); - error(Einuse); - } - kprintinuse = 1; - unlock(&kprintlock); - if(kprintoq == nil){ - kprintoq = qopen(8*1024, Qcoalesce, 0, 0); - if(kprintoq == nil){ - c->flag &= ~COPEN; - error(Enomem); - } - qnoblock(kprintoq, 1); - }else - qreopen(kprintoq); - c->iounit = qiomaxatomic; - break; - - case Qsecstore: - if(omode == ORDWR) - error(Eperm); - if(omode != OREAD) - memset(secstorebuf, 0, sizeof secstorebuf); - break; - - case Qsnarf: - if(omode == ORDWR) - error(Eperm); - if(omode == OREAD) - c->aux = strdup(""); - else - c->aux = mallocz(SnarfSize, 1); - break; - } - return c; -} - -static void -consclose(Chan *c) -{ - switch((ulong)c->qid.path){ - /* last close of control file turns off raw */ - case Qconsctl: - if(c->flag&COPEN){ - qlock(&kbd.lk); - if(--kbd.ctl == 0) - kbd.raw = 0; - qunlock(&kbd.lk); - } - break; - - /* close of kprint allows other opens */ - case Qkprint: - if(c->flag & COPEN){ - kprintinuse = 0; - qhangup(kprintoq, nil); - } - break; - - case Qsnarf: - if(c->mode == OWRITE) - clipwrite(c->aux); - free(c->aux); - break; - } -} - -static long -consread(Chan *c, void *buf, long n, vlong off) -{ - char *b; - char tmp[128]; /* must be >= 6*NUMSIZE */ - char *cbuf = buf; - int ch, i, eol; - vlong offset = off; - - if(n <= 0) - return n; - switch((ulong)c->qid.path){ - case Qdir: - return devdirread(c, buf, n, consdir, nelem(consdir), devgen); - - case Qcons: - qlock(&kbd.lk); - if(waserror()) { - qunlock(&kbd.lk); - nexterror(); - } - if(kbd.raw) { - if(qcanread(lineq)) - n = qread(lineq, buf, n); - else { - /* read as much as possible */ - do { - i = qread(kbdq, cbuf, n); - cbuf += i; - n -= i; - } while (n>0 && qcanread(kbdq)); - n = cbuf - (char*)buf; - } - } else { - while(!qcanread(lineq)) { - qread(kbdq, &kbd.line[kbd.x], 1); - ch = kbd.line[kbd.x]; - eol = 0; - switch(ch){ - case '\b': - if(kbd.x) - kbd.x--; - break; - case 0x15: - kbd.x = 0; - break; - case '\n': - case 0x04: - eol = 1; - default: - kbd.line[kbd.x++] = ch; - break; - } - if(kbd.x == sizeof(kbd.line) || eol){ - if(ch == 0x04) - kbd.x--; - qwrite(lineq, kbd.line, kbd.x); - kbd.x = 0; - } - } - n = qread(lineq, buf, n); - } - qunlock(&kbd.lk); - poperror(); - return n; - - case Qcpunote: - sleep(&up->sleep, return0, nil); - - case Qcputime: - return 0; - - case Qkprint: - return qread(kprintoq, buf, n); - - case Qpgrpid: - return readnum((ulong)offset, buf, n, up->pgrp->pgrpid, NUMSIZE); - - case Qpid: - return readnum((ulong)offset, buf, n, up->pid, NUMSIZE); - - case Qppid: - return readnum((ulong)offset, buf, n, up->parentpid, NUMSIZE); - - case Qtime: - return readtime((ulong)offset, buf, n); - - case Qbintime: - return readbintime(buf, n); - - case Qhostowner: - return readstr((ulong)offset, buf, n, eve); - - case Qhostdomain: - return readstr((ulong)offset, buf, n, hostdomain); - - case Quser: - return readstr((ulong)offset, buf, n, up->user); - - case Qnull: - return 0; - - case Qsnarf: - if(offset == 0){ - free(c->aux); - c->aux = clipread(); - } - if(c->aux == nil) - return 0; - return readstr(offset, buf, n, c->aux); - - case Qsecstore: - return readstr(offset, buf, n, secstorebuf); - - case Qsysstat: - return 0; - - case Qswap: - return 0; - - case Qsysname: - if(sysname == nil) - return 0; - return readstr((ulong)offset, buf, n, sysname); - - case Qrandom: - return randomread(buf, n); - - case Qdrivers: - b = malloc(READSTR); - if(b == nil) - error(Enomem); - n = 0; - for(i = 0; devtab[i] != nil; i++) - n += snprint(b+n, READSTR-n, "#%C %s\n", devtab[i]->dc, devtab[i]->name); - if(waserror()){ - free(b); - nexterror(); - } - n = readstr((ulong)offset, buf, n, b); - free(b); - poperror(); - return n; - - case Qzero: - memset(buf, 0, n); - return n; - - case Qosversion: - snprint(tmp, sizeof tmp, "2000"); - n = readstr((ulong)offset, buf, n, tmp); - return n; - - default: - print("consread 0x%llux\n", c->qid.path); - error(Egreg); - } - return -1; /* never reached */ -} - -static long -conswrite(Chan *c, void *va, long n, vlong off) -{ - char buf[256]; - long l, bp; - char *a = va; - int fd; - Chan *swc; - ulong offset = off; - Cmdbuf *cb; - Cmdtab *ct; - - switch((ulong)c->qid.path){ - case Qcons: - /* - * Can't page fault in putstrn, so copy the data locally. - */ - l = n; - while(l > 0){ - bp = l; - if(bp > sizeof buf) - bp = sizeof buf; - memmove(buf, a, bp); - putstrn0(buf, bp, 1); - a += bp; - l -= bp; - } - break; - - case Qconsctl: - if(n >= sizeof(buf)) - n = sizeof(buf)-1; - strncpy(buf, a, n); - buf[n] = 0; - for(a = buf; a;){ - if(strncmp(a, "rawon", 5) == 0){ - qlock(&kbd.lk); - if(kbd.x){ - qwrite(kbdq, kbd.line, kbd.x); - kbd.x = 0; - } - kbd.raw = 1; - qunlock(&kbd.lk); - } else if(strncmp(a, "rawoff", 6) == 0){ - qlock(&kbd.lk); - kbd.raw = 0; - kbd.x = 0; - qunlock(&kbd.lk); - } else if(strncmp(a, "ctlpon", 6) == 0){ - kbd.ctlpoff = 0; - } else if(strncmp(a, "ctlpoff", 7) == 0){ - kbd.ctlpoff = 1; - } - if((a = strchr(a, ' '))) - a++; - } - break; - - case Qtime: - if(!iseve()) - error(Eperm); - return writetime(a, n); - - case Qbintime: - if(!iseve()) - error(Eperm); - return writebintime(a, n); - - case Qhostowner: - return hostownerwrite(a, n); - - case Qhostdomain: - return hostdomainwrite(a, n); - - case Quser: - return userwrite(a, n); - - case Qnull: - break; - - case Qreboot: - if(!iseve()) - error(Eperm); - cb = parsecmd(a, n); - - if(waserror()) { - free(cb); - nexterror(); - } - ct = lookupcmd(cb, rebootmsg, nelem(rebootmsg)); - switch(ct->index) { - case CMreboot: - rebootcmd(cb->nf-1, cb->f+1); - break; - case CMpanic: - panic("/dev/reboot"); - } - poperror(); - free(cb); - break; - - case Qsecstore: - if(offset >= sizeof secstorebuf || offset+n+1 >= sizeof secstorebuf) - error(Etoobig); - secstoretab->qid.vers++; - memmove(secstorebuf+offset, va, n); - return n; - - case Qshowfile: - return showfilewrite(a, n); - - case Qsnarf: - if(offset >= SnarfSize || offset+n >= SnarfSize) - error(Etoobig); - snarftab->qid.vers++; - memmove((uchar*)c->aux+offset, va, n); - return n; - - case Qsysstat: - n = 0; - break; - - case Qswap: - if(n >= sizeof buf) - error(Egreg); - memmove(buf, va, n); /* so we can NUL-terminate */ - buf[n] = 0; - /* start a pager if not already started */ - if(strncmp(buf, "start", 5) == 0){ - kickpager(); - break; - } - if(cpuserver && !iseve()) - error(Eperm); - if(buf[0]<'0' || '9'<buf[0]) - error(Ebadarg); - fd = strtoul(buf, 0, 0); - swc = fdtochan(fd, -1, 1, 1); - setswapchan(swc); - break; - - case Qsysname: - if(offset != 0) - error(Ebadarg); - if(n <= 0 || n >= sizeof buf) - error(Ebadarg); - strncpy(buf, a, n); - buf[n] = 0; - if(buf[n-1] == '\n') - buf[n-1] = 0; - kstrdup(&sysname, buf); - break; - - default: - print("conswrite: 0x%llux\n", c->qid.path); - error(Egreg); - } - return n; -} - -Dev consdevtab = { - 'c', - "cons", - - devreset, - consinit, - devshutdown, - consattach, - conswalk, - consstat, - consopen, - devcreate, - consclose, - consread, - devbread, - conswrite, - devbwrite, - devremove, - devwstat, -}; - -static uvlong uvorder = (uvlong) 0x0001020304050607ULL; - -static uchar* -le2vlong(vlong *to, uchar *f) -{ - uchar *t, *o; - int i; - - t = (uchar*)to; - o = (uchar*)&uvorder; - for(i = 0; i < sizeof(vlong); i++) - t[o[i]] = f[i]; - return f+sizeof(vlong); -} - -static uchar* -vlong2le(uchar *t, vlong from) -{ - uchar *f, *o; - int i; - - f = (uchar*)&from; - o = (uchar*)&uvorder; - for(i = 0; i < sizeof(vlong); i++) - t[i] = f[o[i]]; - return t+sizeof(vlong); -} - -static long order = 0x00010203; - -static uchar* -le2long(long *to, uchar *f) -{ - uchar *t, *o; - int i; - - t = (uchar*)to; - o = (uchar*)ℴ - for(i = 0; i < sizeof(long); i++) - t[o[i]] = f[i]; - return f+sizeof(long); -} - -/* -static uchar* -long2le(uchar *t, long from) -{ - uchar *f, *o; - int i; - - f = (uchar*)&from; - o = (uchar*)ℴ - for(i = 0; i < sizeof(long); i++) - t[i] = f[o[i]]; - return t+sizeof(long); -} -*/ - -char *Ebadtimectl = "bad time control"; - -/* - * like the old #c/time but with added info. Return - * - * secs nanosecs fastticks fasthz - */ -static int -readtime(ulong off, char *buf, int n) -{ - vlong nsec, ticks; - long sec; - char str[7*NUMSIZE]; - - nsec = todget(&ticks); - if(fasthz == (vlong)0) - fastticks((uvlong*)&fasthz); - sec = nsec/((uvlong) 1000000000); - snprint(str, sizeof(str), "%*.0lud %*.0llud %*.0llud %*.0llud ", - NUMSIZE-1, sec, - VLNUMSIZE-1, nsec, - VLNUMSIZE-1, ticks, - VLNUMSIZE-1, fasthz); - return readstr(off, buf, n, str); -} - -/* - * set the time in seconds - */ -static int -writetime(char *buf, int n) -{ - char b[13]; - long i; - vlong now; - - if(n >= sizeof(b)) - error(Ebadtimectl); - strncpy(b, buf, n); - b[n] = 0; - i = strtol(b, 0, 0); - if(i <= 0) - error(Ebadtimectl); - now = i*((vlong) 1000000000); - todset(now, 0, 0); - return n; -} - -/* - * read binary time info. all numbers are little endian. - * ticks and nsec are syncronized. - */ -static int -readbintime(char *buf, int n) -{ - int i; - vlong nsec, ticks; - uchar *b = (uchar*)buf; - - i = 0; - if(fasthz == (vlong)0) - fastticks((uvlong*)&fasthz); - nsec = todget(&ticks); - if(n >= 3*sizeof(uvlong)){ - vlong2le(b+2*sizeof(uvlong), fasthz); - i += sizeof(uvlong); - } - if(n >= 2*sizeof(uvlong)){ - vlong2le(b+sizeof(uvlong), ticks); - i += sizeof(uvlong); - } - if(n >= 8){ - vlong2le(b, nsec); - i += sizeof(vlong); - } - return i; -} - -/* - * set any of the following - * - time in nsec - * - nsec trim applied over some seconds - * - clock frequency - */ -static int -writebintime(char *buf, int n) -{ - uchar *p; - vlong delta; - long period; - - n--; - p = (uchar*)buf + 1; - switch(*buf){ - case 'n': - if(n < sizeof(vlong)) - error(Ebadtimectl); - le2vlong(&delta, p); - todset(delta, 0, 0); - break; - case 'd': - if(n < sizeof(vlong)+sizeof(long)) - error(Ebadtimectl); - p = le2vlong(&delta, p); - le2long(&period, p); - todset(-1, delta, period); - break; - case 'f': - if(n < sizeof(uvlong)) - error(Ebadtimectl); - le2vlong(&fasthz, p); - todsetfreq(fasthz); - break; - } - return n; -} - - -int -iprint(char *fmt, ...) -{ - int n, s; - va_list arg; - char buf[PRINTSIZE]; - - s = splhi(); - va_start(arg, fmt); - n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf; - va_end(arg); - if(screenputs != 0 && iprintscreenputs) - screenputs(buf, n); -#undef write - write(2, buf, n); - splx(s); - - return n; -} - diff --git a/sys/src/cmd/unix/drawterm/kern/devdraw.c b/sys/src/cmd/unix/drawterm/kern/devdraw.c deleted file mode 100644 index 8b6148e3c..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devdraw.c +++ /dev/null @@ -1,2148 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#define Image IMAGE -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> -#include <cursor.h> -#include "screen.h" - -enum -{ - Qtopdir = 0, - Qnew, - Q3rd, - Q2nd, - Qcolormap, - Qctl, - Qdata, - Qrefresh, -}; - -/* - * Qid path is: - * 4 bits of file type (qids above) - * 24 bits of mux slot number +1; 0 means not attached to client - */ -#define QSHIFT 4 /* location in qid of client # */ - -#define QID(q) ((((ulong)(q).path)&0x0000000F)>>0) -#define CLIENTPATH(q) ((((ulong)q)&0x7FFFFFF0)>>QSHIFT) -#define CLIENT(q) CLIENTPATH((q).path) - -#define NHASH (1<<5) -#define HASHMASK (NHASH-1) -#define IOUNIT (64*1024) - -typedef struct Client Client; -typedef struct Draw Draw; -typedef struct DImage DImage; -typedef struct DScreen DScreen; -typedef struct CScreen CScreen; -typedef struct FChar FChar; -typedef struct Refresh Refresh; -typedef struct Refx Refx; -typedef struct DName DName; - -ulong blanktime = 30; /* in minutes; a half hour */ - -struct Draw -{ - QLock lk; - int clientid; - int nclient; - Client** client; - int nname; - DName* name; - int vers; - int softscreen; - int blanked; /* screen turned off */ - ulong blanktime; /* time of last operation */ - ulong savemap[3*256]; -}; - -struct Client -{ - Ref r; - DImage* dimage[NHASH]; - CScreen* cscreen; - Refresh* refresh; - Rendez refrend; - uchar* readdata; - int nreaddata; - int busy; - int clientid; - int slot; - int refreshme; - int infoid; - int op; -}; - -struct Refresh -{ - DImage* dimage; - Rectangle r; - Refresh* next; -}; - -struct Refx -{ - Client* client; - DImage* dimage; -}; - -struct DName -{ - char *name; - Client *client; - DImage* dimage; - int vers; -}; - -struct FChar -{ - int minx; /* left edge of bits */ - int maxx; /* right edge of bits */ - uchar miny; /* first non-zero scan-line */ - uchar maxy; /* last non-zero scan-line + 1 */ - schar left; /* offset of baseline */ - uchar width; /* width of baseline */ -}; - -/* - * Reference counts in DImages: - * one per open by original client - * one per screen image or fill - * one per image derived from this one by name - */ -struct DImage -{ - int id; - int ref; - char *name; - int vers; - Memimage* image; - int ascent; - int nfchar; - FChar* fchar; - DScreen* dscreen; /* 0 if not a window */ - DImage* fromname; /* image this one is derived from, by name */ - DImage* next; -}; - -struct CScreen -{ - DScreen* dscreen; - CScreen* next; -}; - -struct DScreen -{ - int id; - int public; - int ref; - DImage *dimage; - DImage *dfill; - Memscreen* screen; - Client* owner; - DScreen* next; -}; - -static Draw sdraw; -static Memimage *screenimage; -static Memdata screendata; -static Rectangle flushrect; -static int waste; -static DScreen* dscreen; -extern void flushmemscreen(Rectangle); - void drawmesg(Client*, void*, int); - void drawuninstall(Client*, int); - void drawfreedimage(DImage*); - Client* drawclientofpath(ulong); - -static char Enodrawimage[] = "unknown id for draw image"; -static char Enodrawscreen[] = "unknown id for draw screen"; -static char Eshortdraw[] = "short draw message"; -static char Eshortread[] = "draw read too short"; -static char Eimageexists[] = "image id in use"; -static char Escreenexists[] = "screen id in use"; -static char Edrawmem[] = "image memory allocation failed"; -static char Ereadoutside[] = "readimage outside image"; -static char Ewriteoutside[] = "writeimage outside image"; -static char Enotfont[] = "image not a font"; -static char Eindex[] = "character index out of range"; -static char Enoclient[] = "no such draw client"; -/* static char Edepth[] = "image has bad depth"; */ -static char Enameused[] = "image name in use"; -static char Enoname[] = "no image with that name"; -static char Eoldname[] = "named image no longer valid"; -static char Enamed[] = "image already has name"; -static char Ewrongname[] = "wrong name for image"; - -int -drawcanqlock(void) -{ - return canqlock(&sdraw.lk); -} - -void -drawqlock(void) -{ - qlock(&sdraw.lk); -} - -void -drawqunlock(void) -{ - qunlock(&sdraw.lk); -} - -static int -drawgen(Chan *c, char *name, Dirtab *dt, int ndt, int s, Dir *dp) -{ - int t; - Qid q; - ulong path; - Client *cl; - - USED(name); - USED(dt); - USED(ndt); - - q.vers = 0; - - if(s == DEVDOTDOT){ - switch(QID(c->qid)){ - case Qtopdir: - case Q2nd: - mkqid(&q, Qtopdir, 0, QTDIR); - devdir(c, q, "#i", 0, eve, 0500, dp); - break; - case Q3rd: - cl = drawclientofpath(c->qid.path); - if(cl == nil) - strcpy(up->genbuf, "??"); - else - sprint(up->genbuf, "%d", cl->clientid); - mkqid(&q, Q2nd, 0, QTDIR); - devdir(c, q, up->genbuf, 0, eve, 0500, dp); - break; - default: - panic("drawwalk %llux", c->qid.path); - } - return 1; - } - - /* - * Top level directory contains the name of the device. - */ - t = QID(c->qid); - if(t == Qtopdir){ - switch(s){ - case 0: - mkqid(&q, Q2nd, 0, QTDIR); - devdir(c, q, "draw", 0, eve, 0555, dp); - break; - default: - return -1; - } - return 1; - } - - /* - * Second level contains "new" plus all the clients. - */ - if(t == Q2nd || t == Qnew){ - if(s == 0){ - mkqid(&q, Qnew, 0, QTFILE); - devdir(c, q, "new", 0, eve, 0666, dp); - } - else if(s <= sdraw.nclient){ - cl = sdraw.client[s-1]; - if(cl == 0) - return 0; - sprint(up->genbuf, "%d", cl->clientid); - mkqid(&q, (s<<QSHIFT)|Q3rd, 0, QTDIR); - devdir(c, q, up->genbuf, 0, eve, 0555, dp); - return 1; - } - else - return -1; - return 1; - } - - /* - * Third level. - */ - path = c->qid.path&~((1<<QSHIFT)-1); /* slot component */ - q.vers = c->qid.vers; - q.type = QTFILE; - switch(s){ - case 0: - q.path = path|Qcolormap; - devdir(c, q, "colormap", 0, eve, 0600, dp); - break; - case 1: - q.path = path|Qctl; - devdir(c, q, "ctl", 0, eve, 0600, dp); - break; - case 2: - q.path = path|Qdata; - devdir(c, q, "data", 0, eve, 0600, dp); - break; - case 3: - q.path = path|Qrefresh; - devdir(c, q, "refresh", 0, eve, 0400, dp); - break; - default: - return -1; - } - return 1; -} - -static -int -drawrefactive(void *a) -{ - Client *c; - - c = a; - return c->refreshme || c->refresh!=0; -} - -static -void -drawrefreshscreen(DImage *l, Client *client) -{ - while(l != nil && l->dscreen == nil) - l = l->fromname; - if(l != nil && l->dscreen->owner != client) - l->dscreen->owner->refreshme = 1; -} - -static -void -drawrefresh(Memimage *m, Rectangle r, void *v) -{ - Refx *x; - DImage *d; - Client *c; - Refresh *ref; - - USED(m); - - if(v == 0) - return; - x = v; - c = x->client; - d = x->dimage; - for(ref=c->refresh; ref; ref=ref->next) - if(ref->dimage == d){ - combinerect(&ref->r, r); - return; - } - ref = malloc(sizeof(Refresh)); - if(ref){ - ref->dimage = d; - ref->r = r; - ref->next = c->refresh; - c->refresh = ref; - } -} - -static void -addflush(Rectangle r) -{ - int abb, ar, anbb; - Rectangle nbb; - - if(sdraw.softscreen==0 || !rectclip(&r, screenimage->r)) - return; - - if(flushrect.min.x >= flushrect.max.x){ - flushrect = r; - waste = 0; - return; - } - nbb = flushrect; - combinerect(&nbb, r); - ar = Dx(r)*Dy(r); - abb = Dx(flushrect)*Dy(flushrect); - anbb = Dx(nbb)*Dy(nbb); - /* - * Area of new waste is area of new bb minus area of old bb, - * less the area of the new segment, which we assume is not waste. - * This could be negative, but that's OK. - */ - waste += anbb-abb - ar; - if(waste < 0) - waste = 0; - /* - * absorb if: - * total area is small - * waste is less than half total area - * rectangles touch - */ - if(anbb<=1024 || waste*2<anbb || rectXrect(flushrect, r)){ - flushrect = nbb; - return; - } - /* emit current state */ - if(flushrect.min.x < flushrect.max.x) - flushmemscreen(flushrect); - flushrect = r; - waste = 0; -} - -static -void -dstflush(int dstid, Memimage *dst, Rectangle r) -{ - Memlayer *l; - - if(dstid == 0){ - combinerect(&flushrect, r); - return; - } - /* how can this happen? -rsc, dec 12 2002 */ - if(dst == 0){ - print("nil dstflush\n"); - return; - } - l = dst->layer; - if(l == nil) - return; - do{ - if(l->screen->image->data != screenimage->data) - return; - r = rectaddpt(r, l->delta); - l = l->screen->image->layer; - }while(l); - addflush(r); -} - -void -drawflush(void) -{ - if(flushrect.min.x < flushrect.max.x) - flushmemscreen(flushrect); - flushrect = Rect(10000, 10000, -10000, -10000); -} - -void -drawflushr(Rectangle r) -{ - qlock(&sdraw.lk); - flushmemscreen(r); - qunlock(&sdraw.lk); -} - -static -int -drawcmp(char *a, char *b, int n) -{ - if(strlen(a) != n) - return 1; - return memcmp(a, b, n); -} - -DName* -drawlookupname(int n, char *str) -{ - DName *name, *ename; - - name = sdraw.name; - ename = &name[sdraw.nname]; - for(; name<ename; name++) - if(drawcmp(name->name, str, n) == 0) - return name; - return 0; -} - -int -drawgoodname(DImage *d) -{ - DName *n; - - /* if window, validate the screen's own images */ - if(d->dscreen) - if(drawgoodname(d->dscreen->dimage) == 0 - || drawgoodname(d->dscreen->dfill) == 0) - return 0; - if(d->name == nil) - return 1; - n = drawlookupname(strlen(d->name), d->name); - if(n==nil || n->vers!=d->vers) - return 0; - return 1; -} - -DImage* -drawlookup(Client *client, int id, int checkname) -{ - DImage *d; - - d = client->dimage[id&HASHMASK]; - while(d){ - if(d->id == id){ - if(checkname && !drawgoodname(d)) - error(Eoldname); - return d; - } - d = d->next; - } - return 0; -} - -DScreen* -drawlookupdscreen(int id) -{ - DScreen *s; - - s = dscreen; - while(s){ - if(s->id == id) - return s; - s = s->next; - } - return 0; -} - -DScreen* -drawlookupscreen(Client *client, int id, CScreen **cs) -{ - CScreen *s; - - s = client->cscreen; - while(s){ - if(s->dscreen->id == id){ - *cs = s; - return s->dscreen; - } - s = s->next; - } - error(Enodrawscreen); - return 0; -} - -Memimage* -drawinstall(Client *client, int id, Memimage *i, DScreen *dscreen) -{ - DImage *d; - - d = malloc(sizeof(DImage)); - if(d == 0) - return 0; - d->id = id; - d->ref = 1; - d->name = 0; - d->vers = 0; - d->image = i; - d->nfchar = 0; - d->fchar = 0; - d->fromname = 0; - d->dscreen = dscreen; - d->next = client->dimage[id&HASHMASK]; - client->dimage[id&HASHMASK] = d; - return i; -} - -Memscreen* -drawinstallscreen(Client *client, DScreen *d, int id, DImage *dimage, DImage *dfill, int public) -{ - Memscreen *s; - CScreen *c; - - c = malloc(sizeof(CScreen)); - if(dimage && dimage->image && dimage->image->chan == 0) - panic("bad image %p in drawinstallscreen", dimage->image); - - if(c == 0) - return 0; - if(d == 0){ - d = malloc(sizeof(DScreen)); - if(d == 0){ - free(c); - return 0; - } - s = malloc(sizeof(Memscreen)); - if(s == 0){ - free(c); - free(d); - return 0; - } - s->frontmost = 0; - s->rearmost = 0; - d->dimage = dimage; - if(dimage){ - s->image = dimage->image; - dimage->ref++; - } - d->dfill = dfill; - if(dfill){ - s->fill = dfill->image; - dfill->ref++; - } - d->ref = 0; - d->id = id; - d->screen = s; - d->public = public; - d->next = dscreen; - d->owner = client; - dscreen = d; - } - c->dscreen = d; - d->ref++; - c->next = client->cscreen; - client->cscreen = c; - return d->screen; -} - -void -drawdelname(DName *name) -{ - int i; - - i = name-sdraw.name; - memmove(name, name+1, (sdraw.nname-(i+1))*sizeof(DName)); - sdraw.nname--; -} - -void -drawfreedscreen(DScreen *this) -{ - DScreen *ds, *next; - - this->ref--; - if(this->ref < 0) - print("negative ref in drawfreedscreen\n"); - if(this->ref > 0) - return; - ds = dscreen; - if(ds == this){ - dscreen = this->next; - goto Found; - } - while((next = ds->next)){ /* assign = */ - if(next == this){ - ds->next = this->next; - goto Found; - } - ds = next; - } - error(Enodrawimage); - - Found: - if(this->dimage) - drawfreedimage(this->dimage); - if(this->dfill) - drawfreedimage(this->dfill); - free(this->screen); - free(this); -} - -void -drawfreedimage(DImage *dimage) -{ - int i; - Memimage *l; - DScreen *ds; - - dimage->ref--; - if(dimage->ref < 0) - print("negative ref in drawfreedimage\n"); - if(dimage->ref > 0) - return; - - /* any names? */ - for(i=0; i<sdraw.nname; ) - if(sdraw.name[i].dimage == dimage) - drawdelname(sdraw.name+i); - else - i++; - if(dimage->fromname){ /* acquired by name; owned by someone else*/ - drawfreedimage(dimage->fromname); - goto Return; - } - if(dimage->image == screenimage) /* don't free the display */ - goto Return; - ds = dimage->dscreen; - if(ds){ - l = dimage->image; - if(l->data == screenimage->data) - addflush(l->layer->screenr); - if(l->layer->refreshfn == drawrefresh) /* else true owner will clean up */ - free(l->layer->refreshptr); - l->layer->refreshptr = nil; - if(drawgoodname(dimage)) - memldelete(l); - else - memlfree(l); - drawfreedscreen(ds); - }else - freememimage(dimage->image); - Return: - free(dimage->fchar); - free(dimage); -} - -void -drawuninstallscreen(Client *client, CScreen *this) -{ - CScreen *cs, *next; - - cs = client->cscreen; - if(cs == this){ - client->cscreen = this->next; - drawfreedscreen(this->dscreen); - free(this); - return; - } - while((next = cs->next)){ /* assign = */ - if(next == this){ - cs->next = this->next; - drawfreedscreen(this->dscreen); - free(this); - return; - } - cs = next; - } -} - -void -drawuninstall(Client *client, int id) -{ - DImage *d, *next; - - d = client->dimage[id&HASHMASK]; - if(d == 0) - error(Enodrawimage); - if(d->id == id){ - client->dimage[id&HASHMASK] = d->next; - drawfreedimage(d); - return; - } - while((next = d->next)){ /* assign = */ - if(next->id == id){ - d->next = next->next; - drawfreedimage(next); - return; - } - d = next; - } - error(Enodrawimage); -} - -void -drawaddname(Client *client, DImage *di, int n, char *str) -{ - DName *name, *ename, *new, *t; - - name = sdraw.name; - ename = &name[sdraw.nname]; - for(; name<ename; name++) - if(drawcmp(name->name, str, n) == 0) - error(Enameused); - t = smalloc((sdraw.nname+1)*sizeof(DName)); - memmove(t, sdraw.name, sdraw.nname*sizeof(DName)); - free(sdraw.name); - sdraw.name = t; - new = &sdraw.name[sdraw.nname++]; - new->name = smalloc(n+1); - memmove(new->name, str, n); - new->name[n] = 0; - new->dimage = di; - new->client = client; - new->vers = ++sdraw.vers; -} - -Client* -drawnewclient(void) -{ - Client *cl, **cp; - int i; - - for(i=0; i<sdraw.nclient; i++){ - cl = sdraw.client[i]; - if(cl == 0) - break; - } - if(i == sdraw.nclient){ - cp = malloc((sdraw.nclient+1)*sizeof(Client*)); - if(cp == 0) - return 0; - memmove(cp, sdraw.client, sdraw.nclient*sizeof(Client*)); - free(sdraw.client); - sdraw.client = cp; - sdraw.nclient++; - cp[i] = 0; - } - cl = malloc(sizeof(Client)); - if(cl == 0) - return 0; - memset(cl, 0, sizeof(Client)); - cl->slot = i; - cl->clientid = ++sdraw.clientid; - cl->op = SoverD; - sdraw.client[i] = cl; - return cl; -} - -static int -drawclientop(Client *cl) -{ - int op; - - op = cl->op; - cl->op = SoverD; - return op; -} - -int -drawhasclients(void) -{ - /* - * if draw has ever been used, we can't resize the frame buffer, - * even if all clients have exited (nclients is cumulative); it's too - * hard to make work. - */ - return sdraw.nclient != 0; -} - -Client* -drawclientofpath(ulong path) -{ - Client *cl; - int slot; - - slot = CLIENTPATH(path); - if(slot == 0) - return nil; - cl = sdraw.client[slot-1]; - if(cl==0 || cl->clientid==0) - return nil; - return cl; -} - - -Client* -drawclient(Chan *c) -{ - Client *client; - - client = drawclientofpath(c->qid.path); - if(client == nil) - error(Enoclient); - return client; -} - -Memimage* -drawimage(Client *client, uchar *a) -{ - DImage *d; - - d = drawlookup(client, BGLONG(a), 1); - if(d == nil) - error(Enodrawimage); - return d->image; -} - -void -drawrectangle(Rectangle *r, uchar *a) -{ - r->min.x = BGLONG(a+0*4); - r->min.y = BGLONG(a+1*4); - r->max.x = BGLONG(a+2*4); - r->max.y = BGLONG(a+3*4); -} - -void -drawpoint(Point *p, uchar *a) -{ - p->x = BGLONG(a+0*4); - p->y = BGLONG(a+1*4); -} - -#define isvgascreen(dst) 1 - - -Point -drawchar(Memimage *dst, Memimage *rdst, Point p, - Memimage *src, Point *sp, DImage *font, int index, int op) -{ - FChar *fc; - Rectangle r; - Point sp1; - static Memimage *tmp; - - fc = &font->fchar[index]; - r.min.x = p.x+fc->left; - r.min.y = p.y-(font->ascent-fc->miny); - r.max.x = r.min.x+(fc->maxx-fc->minx); - r.max.y = r.min.y+(fc->maxy-fc->miny); - sp1.x = sp->x+fc->left; - sp1.y = sp->y+fc->miny; - - /* - * If we're drawing greyscale fonts onto a VGA screen, - * it's very costly to read the screen memory to do the - * alpha blending inside memdraw. If this is really a stringbg, - * then rdst is the bg image (in main memory) which we can - * refer to for the underlying dst pixels instead of reading dst - * directly. - */ - if(1 || (isvgascreen(dst) && !isvgascreen(rdst) /*&& font->image->depth > 1*/)){ - if(tmp == nil || tmp->chan != dst->chan || Dx(tmp->r) < Dx(r) || Dy(tmp->r) < Dy(r)){ - if(tmp) - freememimage(tmp); - tmp = allocmemimage(Rect(0,0,Dx(r),Dy(r)), dst->chan); - if(tmp == nil) - goto fallback; - } - memdraw(tmp, Rect(0,0,Dx(r),Dy(r)), rdst, r.min, memopaque, ZP, S); - memdraw(tmp, Rect(0,0,Dx(r),Dy(r)), src, sp1, font->image, Pt(fc->minx, fc->miny), op); - memdraw(dst, r, tmp, ZP, memopaque, ZP, S); - }else{ - fallback: - memdraw(dst, r, src, sp1, font->image, Pt(fc->minx, fc->miny), op); - } - - p.x += fc->width; - sp->x += fc->width; - return p; -} - -static int -initscreenimage(void) -{ - int width, depth; - ulong chan; - void *X; - Rectangle r; - - if(screenimage != nil) - return 1; - - screendata.base = nil; - screendata.bdata = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen, &X); - if(screendata.bdata == nil && X == nil) - return 0; - screendata.ref = 1; - - screenimage = allocmemimaged(r, chan, &screendata, X); - if(screenimage == nil){ - /* RSC: BUG: detach screen */ - return 0; - } - - screenimage->width = width; - screenimage->clipr = r; - return 1; -} - -void -deletescreenimage(void) -{ - qlock(&sdraw.lk); - /* RSC: BUG: detach screen */ - if(screenimage) - freememimage(screenimage); - screenimage = nil; - qunlock(&sdraw.lk); -} - -static Chan* -drawattach(char *spec) -{ - qlock(&sdraw.lk); - if(!initscreenimage()){ - qunlock(&sdraw.lk); - error("no frame buffer"); - } - qunlock(&sdraw.lk); - return devattach('i', spec); -} - -static Walkqid* -drawwalk(Chan *c, Chan *nc, char **name, int nname) -{ - if(screendata.bdata == nil) - error("no frame buffer"); - return devwalk(c, nc, name, nname, 0, 0, drawgen); -} - -static int -drawstat(Chan *c, uchar *db, int n) -{ - return devstat(c, db, n, 0, 0, drawgen); -} - -static Chan* -drawopen(Chan *c, int omode) -{ - Client *cl; - - if(c->qid.type & QTDIR){ - c = devopen(c, omode, 0, 0, drawgen); - c->iounit = IOUNIT; - } - - qlock(&sdraw.lk); - if(waserror()){ - qunlock(&sdraw.lk); - nexterror(); - } - - if(QID(c->qid) == Qnew){ - cl = drawnewclient(); - if(cl == 0) - error(Enodev); - c->qid.path = Qctl|((cl->slot+1)<<QSHIFT); - } - - switch(QID(c->qid)){ - case Qnew: - break; - - case Qctl: - cl = drawclient(c); - if(cl->busy) - error(Einuse); - cl->busy = 1; - flushrect = Rect(10000, 10000, -10000, -10000); - drawinstall(cl, 0, screenimage, 0); - incref(&cl->r); - break; - case Qcolormap: - case Qdata: - case Qrefresh: - cl = drawclient(c); - incref(&cl->r); - break; - } - qunlock(&sdraw.lk); - poperror(); - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - c->iounit = IOUNIT; - return c; -} - -static void -drawclose(Chan *c) -{ - int i; - DImage *d, **dp; - Client *cl; - Refresh *r; - - if(QID(c->qid) < Qcolormap) /* Qtopdir, Qnew, Q3rd, Q2nd have no client */ - return; - qlock(&sdraw.lk); - if(waserror()){ - qunlock(&sdraw.lk); - nexterror(); - } - - cl = drawclient(c); - if(QID(c->qid) == Qctl) - cl->busy = 0; - if((c->flag&COPEN) && (decref(&cl->r)==0)){ - while((r = cl->refresh)){ /* assign = */ - cl->refresh = r->next; - free(r); - } - /* free names */ - for(i=0; i<sdraw.nname; ) - if(sdraw.name[i].client == cl) - drawdelname(sdraw.name+i); - else - i++; - while(cl->cscreen) - drawuninstallscreen(cl, cl->cscreen); - /* all screens are freed, so now we can free images */ - dp = cl->dimage; - for(i=0; i<NHASH; i++){ - while((d = *dp) != nil){ - *dp = d->next; - drawfreedimage(d); - } - dp++; - } - sdraw.client[cl->slot] = 0; - drawflush(); /* to erase visible, now dead windows */ - free(cl); - } - qunlock(&sdraw.lk); - poperror(); -} - -long -drawread(Chan *c, void *a, long n, vlong off) -{ - int index, m; - ulong red, green, blue; - Client *cl; - uchar *p; - Refresh *r; - DImage *di; - Memimage *i; - ulong offset = off; - char buf[16]; - - if(c->qid.type & QTDIR) - return devdirread(c, a, n, 0, 0, drawgen); - cl = drawclient(c); - qlock(&sdraw.lk); - if(waserror()){ - qunlock(&sdraw.lk); - nexterror(); - } - switch(QID(c->qid)){ - case Qctl: - if(n < 12*12) - error(Eshortread); - if(cl->infoid < 0) - error(Enodrawimage); - if(cl->infoid == 0){ - i = screenimage; - if(i == nil) - error(Enodrawimage); - }else{ - di = drawlookup(cl, cl->infoid, 1); - if(di == nil) - error(Enodrawimage); - i = di->image; - } - n = sprint(a, "%11d %11d %11s %11d %11d %11d %11d %11d %11d %11d %11d %11d ", - cl->clientid, cl->infoid, chantostr(buf, i->chan), (i->flags&Frepl)==Frepl, - i->r.min.x, i->r.min.y, i->r.max.x, i->r.max.y, - i->clipr.min.x, i->clipr.min.y, i->clipr.max.x, i->clipr.max.y); - cl->infoid = -1; - break; - - case Qcolormap: - drawactive(1); /* to restore map from backup */ - p = malloc(4*12*256+1); - if(p == 0) - error(Enomem); - m = 0; - for(index = 0; index < 256; index++){ - getcolor(index, &red, &green, &blue); - m += sprint((char*)p+m, "%11d %11lud %11lud %11lud\n", index, red>>24, green>>24, blue>>24); - } - n = readstr(offset, a, n, (char*)p); - free(p); - break; - - case Qdata: - if(cl->readdata == nil) - error("no draw data"); - if(n < cl->nreaddata) - error(Eshortread); - n = cl->nreaddata; - memmove(a, cl->readdata, cl->nreaddata); - free(cl->readdata); - cl->readdata = nil; - break; - - case Qrefresh: - if(n < 5*4) - error(Ebadarg); - for(;;){ - if(cl->refreshme || cl->refresh) - break; - qunlock(&sdraw.lk); - if(waserror()){ - qlock(&sdraw.lk); /* restore lock for waserror() above */ - nexterror(); - } - sleep(&cl->refrend, drawrefactive, cl); - poperror(); - qlock(&sdraw.lk); - } - p = a; - while(cl->refresh && n>=5*4){ - r = cl->refresh; - BPLONG(p+0*4, r->dimage->id); - BPLONG(p+1*4, r->r.min.x); - BPLONG(p+2*4, r->r.min.y); - BPLONG(p+3*4, r->r.max.x); - BPLONG(p+4*4, r->r.max.y); - cl->refresh = r->next; - free(r); - p += 5*4; - n -= 5*4; - } - cl->refreshme = 0; - n = p-(uchar*)a; - } - qunlock(&sdraw.lk); - poperror(); - return n; -} - -void -drawwakeall(void) -{ - Client *cl; - int i; - - for(i=0; i<sdraw.nclient; i++){ - cl = sdraw.client[i]; - if(cl && (cl->refreshme || cl->refresh)) - wakeup(&cl->refrend); - } -} - -static long -drawwrite(Chan *c, void *a, long n, vlong offset) -{ - char buf[128], *fields[4], *q; - Client *cl; - int i, m, red, green, blue, x; - - USED(offset); - - if(c->qid.type & QTDIR) - error(Eisdir); - cl = drawclient(c); - qlock(&sdraw.lk); - if(waserror()){ - drawwakeall(); - qunlock(&sdraw.lk); - nexterror(); - } - switch(QID(c->qid)){ - case Qctl: - if(n != 4) - error("unknown draw control request"); - cl->infoid = BGLONG((uchar*)a); - break; - - case Qcolormap: - drawactive(1); /* to restore map from backup */ - m = n; - n = 0; - while(m > 0){ - x = m; - if(x > sizeof(buf)-1) - x = sizeof(buf)-1; - q = memccpy(buf, a, '\n', x); - if(q == 0) - break; - i = q-buf; - n += i; - a = (char*)a + i; - m -= i; - *q = 0; - if(tokenize(buf, fields, nelem(fields)) != 4) - error(Ebadarg); - i = strtoul(fields[0], 0, 0); - red = strtoul(fields[1], 0, 0); - green = strtoul(fields[2], 0, 0); - blue = strtoul(fields[3], &q, 0); - if(fields[3] == q) - error(Ebadarg); - if(red>255 || green>255 || blue>255 || i<0 || i>255) - error(Ebadarg); - red |= red<<8; - red |= red<<16; - green |= green<<8; - green |= green<<16; - blue |= blue<<8; - blue |= blue<<16; - setcolor(i, red, green, blue); - } - break; - - case Qdata: - drawmesg(cl, a, n); - drawwakeall(); - break; - - default: - error(Ebadusefd); - } - qunlock(&sdraw.lk); - poperror(); - return n; -} - -uchar* -drawcoord(uchar *p, uchar *maxp, int oldx, int *newx) -{ - int b, x; - - if(p >= maxp) - error(Eshortdraw); - b = *p++; - x = b & 0x7F; - if(b & 0x80){ - if(p+1 >= maxp) - error(Eshortdraw); - x |= *p++ << 7; - x |= *p++ << 15; - if(x & (1<<22)) - x |= ~0<<23; - }else{ - if(b & 0x40) - x |= ~0<<7; - x += oldx; - } - *newx = x; - return p; -} - -static void -printmesg(char *fmt, uchar *a, int plsprnt) -{ - char buf[256]; - char *p, *q; - int s; - - if(1|| plsprnt==0){ - SET(s); - SET(q); - SET(p); - USED(fmt); - USED(a); - p = buf; - USED(p); - USED(q); - USED(s); - return; - } - q = buf; - *q++ = *a++; - for(p=fmt; *p; p++){ - switch(*p){ - case 'l': - q += sprint(q, " %ld", (long)BGLONG(a)); - a += 4; - break; - case 'L': - q += sprint(q, " %.8lux", (ulong)BGLONG(a)); - a += 4; - break; - case 'R': - q += sprint(q, " [%d %d %d %d]", BGLONG(a), BGLONG(a+4), BGLONG(a+8), BGLONG(a+12)); - a += 16; - break; - case 'P': - q += sprint(q, " [%d %d]", BGLONG(a), BGLONG(a+4)); - a += 8; - break; - case 'b': - q += sprint(q, " %d", *a++); - break; - case 's': - q += sprint(q, " %d", BGSHORT(a)); - a += 2; - break; - case 'S': - q += sprint(q, " %.4ux", BGSHORT(a)); - a += 2; - break; - } - } - *q++ = '\n'; - *q = 0; - iprint("%.*s", (int)(q-buf), buf); -} - -void -drawmesg(Client *client, void *av, int n) -{ - int c, repl, m, y, dstid, scrnid, ni, ci, j, nw, e0, e1, op, ox, oy, oesize, esize, doflush; - uchar *u, *a, refresh; - char *fmt; - ulong value, chan; - Rectangle r, clipr; - Point p, q, *pp, sp; - Memimage *i, *dst, *src, *mask; - Memimage *l, **lp; - Memscreen *scrn; - DImage *font, *ll, *di, *ddst, *dsrc; - DName *dn; - DScreen *dscrn; - FChar *fc; - Refx *refx; - CScreen *cs; - Refreshfn reffn; - - a = av; - m = 0; - fmt = nil; - if(waserror()){ - if(fmt) printmesg(fmt, a, 1); - /* iprint("error: %s\n", up->errstr); */ - nexterror(); - } - while((n-=m) > 0){ - USED(fmt); - a += m; - switch(*a){ - default: - error("bad draw command"); - /* new allocate: 'b' id[4] screenid[4] refresh[1] chan[4] repl[1] R[4*4] clipR[4*4] rrggbbaa[4] */ - case 'b': - printmesg(fmt="LLbLbRRL", a, 0); - m = 1+4+4+1+4+1+4*4+4*4+4; - if(n < m) - error(Eshortdraw); - dstid = BGLONG(a+1); - scrnid = BGSHORT(a+5); - refresh = a[9]; - chan = BGLONG(a+10); - repl = a[14]; - drawrectangle(&r, a+15); - drawrectangle(&clipr, a+31); - value = BGLONG(a+47); - if(drawlookup(client, dstid, 0)) - error(Eimageexists); - if(scrnid){ - dscrn = drawlookupscreen(client, scrnid, &cs); - scrn = dscrn->screen; - if(repl || chan!=scrn->image->chan) - error("image parameters incompatible with screen"); - reffn = 0; - switch(refresh){ - case Refbackup: - break; - case Refnone: - reffn = memlnorefresh; - break; - case Refmesg: - reffn = drawrefresh; - break; - default: - error("unknown refresh method"); - } - l = memlalloc(scrn, r, reffn, 0, value); - if(l == 0) - error(Edrawmem); - addflush(l->layer->screenr); - l->clipr = clipr; - rectclip(&l->clipr, r); - if(drawinstall(client, dstid, l, dscrn) == 0){ - memldelete(l); - error(Edrawmem); - } - dscrn->ref++; - if(reffn){ - refx = nil; - if(reffn == drawrefresh){ - refx = malloc(sizeof(Refx)); - if(refx == 0){ - drawuninstall(client, dstid); - error(Edrawmem); - } - refx->client = client; - refx->dimage = drawlookup(client, dstid, 1); - } - memlsetrefresh(l, reffn, refx); - } - continue; - } - i = allocmemimage(r, chan); - if(i == 0) - error(Edrawmem); - if(repl) - i->flags |= Frepl; - i->clipr = clipr; - if(!repl) - rectclip(&i->clipr, r); - if(drawinstall(client, dstid, i, 0) == 0){ - freememimage(i); - error(Edrawmem); - } - memfillcolor(i, value); - continue; - - /* allocate screen: 'A' id[4] imageid[4] fillid[4] public[1] */ - case 'A': - printmesg(fmt="LLLb", a, 1); - m = 1+4+4+4+1; - if(n < m) - error(Eshortdraw); - dstid = BGLONG(a+1); - if(dstid == 0) - error(Ebadarg); - if(drawlookupdscreen(dstid)) - error(Escreenexists); - ddst = drawlookup(client, BGLONG(a+5), 1); - dsrc = drawlookup(client, BGLONG(a+9), 1); - if(ddst==0 || dsrc==0) - error(Enodrawimage); - if(drawinstallscreen(client, 0, dstid, ddst, dsrc, a[13]) == 0) - error(Edrawmem); - continue; - - /* set repl and clip: 'c' dstid[4] repl[1] clipR[4*4] */ - case 'c': - printmesg(fmt="LbR", a, 0); - m = 1+4+1+4*4; - if(n < m) - error(Eshortdraw); - ddst = drawlookup(client, BGLONG(a+1), 1); - if(ddst == nil) - error(Enodrawimage); - if(ddst->name) - error("can't change repl/clipr of shared image"); - dst = ddst->image; - if(a[5]) - dst->flags |= Frepl; - drawrectangle(&dst->clipr, a+6); - continue; - - /* draw: 'd' dstid[4] srcid[4] maskid[4] R[4*4] P[2*4] P[2*4] */ - case 'd': - printmesg(fmt="LLLRPP", a, 0); - m = 1+4+4+4+4*4+2*4+2*4; - if(n < m) - error(Eshortdraw); - dst = drawimage(client, a+1); - dstid = BGLONG(a+1); - src = drawimage(client, a+5); - mask = drawimage(client, a+9); - drawrectangle(&r, a+13); - drawpoint(&p, a+29); - drawpoint(&q, a+37); - op = drawclientop(client); - memdraw(dst, r, src, p, mask, q, op); - dstflush(dstid, dst, r); - continue; - - /* toggle debugging: 'D' val[1] */ - case 'D': - printmesg(fmt="b", a, 0); - m = 1+1; - if(n < m) - error(Eshortdraw); - drawdebug = a[1]; - continue; - - /* ellipse: 'e' dstid[4] srcid[4] center[2*4] a[4] b[4] thick[4] sp[2*4] alpha[4] phi[4]*/ - case 'e': - case 'E': - printmesg(fmt="LLPlllPll", a, 0); - m = 1+4+4+2*4+4+4+4+2*4+2*4; - if(n < m) - error(Eshortdraw); - dst = drawimage(client, a+1); - dstid = BGLONG(a+1); - src = drawimage(client, a+5); - drawpoint(&p, a+9); - e0 = BGLONG(a+17); - e1 = BGLONG(a+21); - if(e0<0 || e1<0) - error("invalid ellipse semidiameter"); - j = BGLONG(a+25); - if(j < 0) - error("negative ellipse thickness"); - drawpoint(&sp, a+29); - c = j; - if(*a == 'E') - c = -1; - ox = BGLONG(a+37); - oy = BGLONG(a+41); - op = drawclientop(client); - /* high bit indicates arc angles are present */ - if(ox & (1U<<31)){ - if((ox & (1<<30)) == 0) - ox &= ~(1U<<31); - memarc(dst, p, e0, e1, c, src, sp, ox, oy, op); - }else - memellipse(dst, p, e0, e1, c, src, sp, op); - dstflush(dstid, dst, Rect(p.x-e0-j, p.y-e1-j, p.x+e0+j+1, p.y+e1+j+1)); - continue; - - /* free: 'f' id[4] */ - case 'f': - printmesg(fmt="L", a, 1); - m = 1+4; - if(n < m) - error(Eshortdraw); - ll = drawlookup(client, BGLONG(a+1), 0); - if(ll && ll->dscreen && ll->dscreen->owner != client) - ll->dscreen->owner->refreshme = 1; - drawuninstall(client, BGLONG(a+1)); - continue; - - /* free screen: 'F' id[4] */ - case 'F': - printmesg(fmt="L", a, 1); - m = 1+4; - if(n < m) - error(Eshortdraw); - drawlookupscreen(client, BGLONG(a+1), &cs); - drawuninstallscreen(client, cs); - continue; - - /* initialize font: 'i' fontid[4] nchars[4] ascent[1] */ - case 'i': - printmesg(fmt="Llb", a, 1); - m = 1+4+4+1; - if(n < m) - error(Eshortdraw); - dstid = BGLONG(a+1); - if(dstid == 0) - error("can't use display as font"); - font = drawlookup(client, dstid, 1); - if(font == 0) - error(Enodrawimage); - if(font->image->layer) - error("can't use window as font"); - ni = BGLONG(a+5); - if(ni<=0 || ni>4096) - error("bad font size (4096 chars max)"); - free(font->fchar); /* should we complain if non-zero? */ - font->fchar = malloc(ni*sizeof(FChar)); - if(font->fchar == 0) - error("no memory for font"); - memset(font->fchar, 0, ni*sizeof(FChar)); - font->nfchar = ni; - font->ascent = a[9]; - continue; - - /* load character: 'l' fontid[4] srcid[4] index[2] R[4*4] P[2*4] left[1] width[1] */ - case 'l': - printmesg(fmt="LLSRPbb", a, 0); - m = 1+4+4+2+4*4+2*4+1+1; - if(n < m) - error(Eshortdraw); - font = drawlookup(client, BGLONG(a+1), 1); - if(font == 0) - error(Enodrawimage); - if(font->nfchar == 0) - error(Enotfont); - src = drawimage(client, a+5); - ci = BGSHORT(a+9); - if(ci >= font->nfchar) - error(Eindex); - drawrectangle(&r, a+11); - drawpoint(&p, a+27); - memdraw(font->image, r, src, p, memopaque, p, S); - fc = &font->fchar[ci]; - fc->minx = r.min.x; - fc->maxx = r.max.x; - fc->miny = r.min.y; - fc->maxy = r.max.y; - fc->left = a[35]; - fc->width = a[36]; - continue; - - /* draw line: 'L' dstid[4] p0[2*4] p1[2*4] end0[4] end1[4] radius[4] srcid[4] sp[2*4] */ - case 'L': - printmesg(fmt="LPPlllLP", a, 0); - m = 1+4+2*4+2*4+4+4+4+4+2*4; - if(n < m) - error(Eshortdraw); - dst = drawimage(client, a+1); - dstid = BGLONG(a+1); - drawpoint(&p, a+5); - drawpoint(&q, a+13); - e0 = BGLONG(a+21); - e1 = BGLONG(a+25); - j = BGLONG(a+29); - if(j < 0) - error("negative line width"); - src = drawimage(client, a+33); - drawpoint(&sp, a+37); - op = drawclientop(client); - memline(dst, p, q, e0, e1, j, src, sp, op); - /* avoid memlinebbox if possible */ - if(dstid==0 || dst->layer!=nil){ - /* BUG: this is terribly inefficient: update maximal containing rect*/ - r = memlinebbox(p, q, e0, e1, j); - dstflush(dstid, dst, insetrect(r, -(1+1+j))); - } - continue; - - /* create image mask: 'm' newid[4] id[4] */ -/* - * - case 'm': - printmesg("LL", a, 0); - m = 4+4; - if(n < m) - error(Eshortdraw); - break; - * - */ - - /* attach to a named image: 'n' dstid[4] j[1] name[j] */ - case 'n': - printmesg(fmt="Lz", a, 0); - m = 1+4+1; - if(n < m) - error(Eshortdraw); - j = a[5]; - if(j == 0) /* give me a non-empty name please */ - error(Eshortdraw); - m += j; - if(n < m) - error(Eshortdraw); - dstid = BGLONG(a+1); - if(drawlookup(client, dstid, 0)) - error(Eimageexists); - dn = drawlookupname(j, (char*)a+6); - if(dn == nil) - error(Enoname); - if(drawinstall(client, dstid, dn->dimage->image, 0) == 0) - error(Edrawmem); - di = drawlookup(client, dstid, 0); - if(di == 0) - error("draw: can't happen"); - di->vers = dn->vers; - di->name = smalloc(j+1); - di->fromname = dn->dimage; - di->fromname->ref++; - memmove(di->name, a+6, j); - di->name[j] = 0; - client->infoid = dstid; - continue; - - /* name an image: 'N' dstid[4] in[1] j[1] name[j] */ - case 'N': - printmesg(fmt="Lbz", a, 0); - m = 1+4+1+1; - if(n < m) - error(Eshortdraw); - c = a[5]; - j = a[6]; - if(j == 0) /* give me a non-empty name please */ - error(Eshortdraw); - m += j; - if(n < m) - error(Eshortdraw); - di = drawlookup(client, BGLONG(a+1), 0); - if(di == 0) - error(Enodrawimage); - if(di->name) - error(Enamed); - if(c) - drawaddname(client, di, j, (char*)a+7); - else{ - dn = drawlookupname(j, (char*)a+7); - if(dn == nil) - error(Enoname); - if(dn->dimage != di) - error(Ewrongname); - drawdelname(dn); - } - continue; - - /* position window: 'o' id[4] r.min [2*4] screenr.min [2*4] */ - case 'o': - printmesg(fmt="LPP", a, 0); - m = 1+4+2*4+2*4; - if(n < m) - error(Eshortdraw); - dst = drawimage(client, a+1); - if(dst->layer){ - drawpoint(&p, a+5); - drawpoint(&q, a+13); - r = dst->layer->screenr; - ni = memlorigin(dst, p, q); - if(ni < 0) - error("image origin failed"); - if(ni > 0){ - addflush(r); - addflush(dst->layer->screenr); - ll = drawlookup(client, BGLONG(a+1), 1); - drawrefreshscreen(ll, client); - } - } - continue; - - /* set compositing operator for next draw operation: 'O' op */ - case 'O': - printmesg(fmt="b", a, 0); - m = 1+1; - if(n < m) - error(Eshortdraw); - client->op = a[1]; - continue; - - /* filled polygon: 'P' dstid[4] n[2] wind[4] ignore[2*4] srcid[4] sp[2*4] p0[2*4] dp[2*2*n] */ - /* polygon: 'p' dstid[4] n[2] end0[4] end1[4] radius[4] srcid[4] sp[2*4] p0[2*4] dp[2*2*n] */ - case 'p': - case 'P': - printmesg(fmt="LslllLPP", a, 0); - m = 1+4+2+4+4+4+4+2*4; - if(n < m) - error(Eshortdraw); - dstid = BGLONG(a+1); - dst = drawimage(client, a+1); - ni = BGSHORT(a+5); - if(ni < 0) - error("negative count in polygon"); - e0 = BGLONG(a+7); - e1 = BGLONG(a+11); - j = 0; - if(*a == 'p'){ - j = BGLONG(a+15); - if(j < 0) - error("negative polygon line width"); - } - src = drawimage(client, a+19); - drawpoint(&sp, a+23); - drawpoint(&p, a+31); - ni++; - pp = malloc(ni*sizeof(Point)); - if(pp == nil) - error(Enomem); - doflush = 0; - if(dstid==0 || (dst->layer && dst->layer->screen->image->data == screenimage->data)) - doflush = 1; /* simplify test in loop */ - ox = oy = 0; - esize = 0; - u = a+m; - for(y=0; y<ni; y++){ - q = p; - oesize = esize; - u = drawcoord(u, a+n, ox, &p.x); - u = drawcoord(u, a+n, oy, &p.y); - ox = p.x; - oy = p.y; - if(doflush){ - esize = j; - if(*a == 'p'){ - if(y == 0){ - c = memlineendsize(e0); - if(c > esize) - esize = c; - } - if(y == ni-1){ - c = memlineendsize(e1); - if(c > esize) - esize = c; - } - } - if(*a=='P' && e0!=1 && e0 !=~0) - r = dst->clipr; - else if(y > 0){ - r = Rect(q.x-oesize, q.y-oesize, q.x+oesize+1, q.y+oesize+1); - combinerect(&r, Rect(p.x-esize, p.y-esize, p.x+esize+1, p.y+esize+1)); - } - if(rectclip(&r, dst->clipr)) /* should perhaps be an arg to dstflush */ - dstflush(dstid, dst, r); - } - pp[y] = p; - } - if(y == 1) - dstflush(dstid, dst, Rect(p.x-esize, p.y-esize, p.x+esize+1, p.y+esize+1)); - op = drawclientop(client); - if(*a == 'p') - mempoly(dst, pp, ni, e0, e1, j, src, sp, op); - else - memfillpoly(dst, pp, ni, e0, src, sp, op); - free(pp); - m = u-a; - continue; - - /* read: 'r' id[4] R[4*4] */ - case 'r': - printmesg(fmt="LR", a, 0); - m = 1+4+4*4; - if(n < m) - error(Eshortdraw); - i = drawimage(client, a+1); - drawrectangle(&r, a+5); - if(!rectinrect(r, i->r)) - error(Ereadoutside); - c = bytesperline(r, i->depth); - c *= Dy(r); - free(client->readdata); - client->readdata = mallocz(c, 0); - if(client->readdata == nil) - error("readimage malloc failed"); - client->nreaddata = memunload(i, r, client->readdata, c); - if(client->nreaddata < 0){ - free(client->readdata); - client->readdata = nil; - error("bad readimage call"); - } - continue; - - /* string: 's' dstid[4] srcid[4] fontid[4] P[2*4] clipr[4*4] sp[2*4] ni[2] ni*(index[2]) */ - /* stringbg: 'x' dstid[4] srcid[4] fontid[4] P[2*4] clipr[4*4] sp[2*4] ni[2] bgid[4] bgpt[2*4] ni*(index[2]) */ - case 's': - case 'x': - printmesg(fmt="LLLPRPs", a, 0); - m = 1+4+4+4+2*4+4*4+2*4+2; - if(*a == 'x') - m += 4+2*4; - if(n < m) - error(Eshortdraw); - - dst = drawimage(client, a+1); - dstid = BGLONG(a+1); - src = drawimage(client, a+5); - font = drawlookup(client, BGLONG(a+9), 1); - if(font == 0) - error(Enodrawimage); - if(font->nfchar == 0) - error(Enotfont); - drawpoint(&p, a+13); - drawrectangle(&r, a+21); - drawpoint(&sp, a+37); - ni = BGSHORT(a+45); - u = a+m; - m += ni*2; - if(n < m) - error(Eshortdraw); - clipr = dst->clipr; - dst->clipr = r; - op = drawclientop(client); - l = dst; - if(*a == 'x'){ - /* paint background */ - l = drawimage(client, a+47); - drawpoint(&q, a+51); - r.min.x = p.x; - r.min.y = p.y-font->ascent; - r.max.x = p.x; - r.max.y = r.min.y+Dy(font->image->r); - j = ni; - while(--j >= 0){ - ci = BGSHORT(u); - if(ci<0 || ci>=font->nfchar){ - dst->clipr = clipr; - error(Eindex); - } - r.max.x += font->fchar[ci].width; - u += 2; - } - memdraw(dst, r, l, q, memopaque, ZP, op); - u -= 2*ni; - } - q = p; - while(--ni >= 0){ - ci = BGSHORT(u); - if(ci<0 || ci>=font->nfchar){ - dst->clipr = clipr; - error(Eindex); - } - q = drawchar(dst, l, q, src, &sp, font, ci, op); - u += 2; - } - dst->clipr = clipr; - p.y -= font->ascent; - dstflush(dstid, dst, Rect(p.x, p.y, q.x, p.y+Dy(font->image->r))); - continue; - - /* use public screen: 'S' id[4] chan[4] */ - case 'S': - printmesg(fmt="Ll", a, 0); - m = 1+4+4; - if(n < m) - error(Eshortdraw); - dstid = BGLONG(a+1); - if(dstid == 0) - error(Ebadarg); - dscrn = drawlookupdscreen(dstid); - if(dscrn==0 || (dscrn->public==0 && dscrn->owner!=client)) - error(Enodrawscreen); - if(dscrn->screen->image->chan != BGLONG(a+5)) - error("inconsistent chan"); - if(drawinstallscreen(client, dscrn, 0, 0, 0, 0) == 0) - error(Edrawmem); - continue; - - /* top or bottom windows: 't' top[1] nw[2] n*id[4] */ - case 't': - printmesg(fmt="bsL", a, 0); - m = 1+1+2; - if(n < m) - error(Eshortdraw); - nw = BGSHORT(a+2); - if(nw < 0) - error(Ebadarg); - if(nw == 0) - continue; - m += nw*4; - if(n < m) - error(Eshortdraw); - lp = malloc(nw*sizeof(Memimage*)); - if(lp == 0) - error(Enomem); - if(waserror()){ - free(lp); - nexterror(); - } - for(j=0; j<nw; j++) - lp[j] = drawimage(client, a+1+1+2+j*4); - if(lp[0]->layer == 0) - error("images are not windows"); - for(j=1; j<nw; j++) - if(lp[j]->layer->screen != lp[0]->layer->screen) - error("images not on same screen"); - if(a[1]) - memltofrontn(lp, nw); - else - memltorearn(lp, nw); - if(lp[0]->layer->screen->image->data == screenimage->data) - for(j=0; j<nw; j++) - addflush(lp[j]->layer->screenr); - ll = drawlookup(client, BGLONG(a+1+1+2), 1); - drawrefreshscreen(ll, client); - poperror(); - free(lp); - continue; - - /* visible: 'v' */ - case 'v': - printmesg(fmt="", a, 0); - m = 1; - drawflush(); - continue; - - /* write: 'y' id[4] R[4*4] data[x*1] */ - /* write from compressed data: 'Y' id[4] R[4*4] data[x*1] */ - case 'y': - case 'Y': - printmesg(fmt="LR", a, 0); - // iprint("load %c\n", *a); - m = 1+4+4*4; - if(n < m) - error(Eshortdraw); - dstid = BGLONG(a+1); - dst = drawimage(client, a+1); - drawrectangle(&r, a+5); - if(!rectinrect(r, dst->r)) - error(Ewriteoutside); - y = memload(dst, r, a+m, n-m, *a=='Y'); - if(y < 0) - error("bad writeimage call"); - dstflush(dstid, dst, r); - m += y; - continue; - } - } - poperror(); -} - -Dev drawdevtab = { - 'i', - "draw", - - devreset, - devinit, - devshutdown, - drawattach, - drawwalk, - drawstat, - drawopen, - devcreate, - drawclose, - drawread, - devbread, - drawwrite, - devbwrite, - devremove, - devwstat, -}; - -/* - * On 8 bit displays, load the default color map - */ -void -drawcmap(void) -{ - int r, g, b, cr, cg, cb, v; - int num, den; - int i, j; - - drawactive(1); /* to restore map from backup */ - for(r=0,i=0; r!=4; r++) - for(v=0; v!=4; v++,i+=16){ - for(g=0,j=v-r; g!=4; g++) - for(b=0;b!=4;b++,j++){ - den = r; - if(g > den) - den = g; - if(b > den) - den = b; - if(den == 0) /* divide check -- pick grey shades */ - cr = cg = cb = v*17; - else{ - num = 17*(4*den+v); - cr = r*num/den; - cg = g*num/den; - cb = b*num/den; - } - setcolor(i+(j&15), - cr*0x01010101, cg*0x01010101, cb*0x01010101); - } - } -} - -void -drawblankscreen(int blank) -{ - int i, nc; - ulong *p; - - if(blank == sdraw.blanked) - return; - if(!canqlock(&sdraw.lk)) - return; - if(!initscreenimage()){ - qunlock(&sdraw.lk); - return; - } - p = sdraw.savemap; - nc = screenimage->depth > 8 ? 256 : 1<<screenimage->depth; - - /* - * blankscreen uses the hardware to blank the screen - * when possible. to help in cases when it is not possible, - * we set the color map to be all black. - */ - if(blank == 0){ /* turn screen on */ - for(i=0; i<nc; i++, p+=3) - setcolor(i, p[0], p[1], p[2]); - // blankscreen(0); - }else{ /* turn screen off */ - // blankscreen(1); - for(i=0; i<nc; i++, p+=3){ - getcolor(i, &p[0], &p[1], &p[2]); - setcolor(i, 0, 0, 0); - } - } - sdraw.blanked = blank; - qunlock(&sdraw.lk); -} - -/* - * record activity on screen, changing blanking as appropriate - */ -void -drawactive(int active) -{ -/* - if(active){ - drawblankscreen(0); - sdraw.blanktime = MACHP(0)->ticks; - }else{ - if(blanktime && sdraw.blanktime && TK2SEC(MACHP(0)->ticks - sdraw.blanktime)/60 >= blanktime) - drawblankscreen(1); - } -*/ -} - -int -drawidletime(void) -{ - return 0; -/* return TK2SEC(MACHP(0)->ticks - sdraw.blanktime)/60; */ -} - diff --git a/sys/src/cmd/unix/drawterm/kern/devfs-posix.c b/sys/src/cmd/unix/drawterm/kern/devfs-posix.c deleted file mode 100644 index 23a7dbc4f..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devfs-posix.c +++ /dev/null @@ -1,635 +0,0 @@ -#include "u.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <dirent.h> -#include <fcntl.h> -#include <errno.h> -#include <stdio.h> /* for remove, rename */ -#include <limits.h> - -#ifndef NAME_MAX -# define NAME_MAX 256 -#endif -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - - -typedef struct Ufsinfo Ufsinfo; - -enum -{ - NUID = 256, - NGID = 256, - MAXPATH = 1024, - MAXCOMP = 128 -}; - -struct Ufsinfo -{ - int mode; - int fd; - int uid; - int gid; - DIR* dir; - vlong offset; - QLock oq; - char nextname[NAME_MAX]; -}; - -char *base = "/"; - -static Qid fsqid(char*, struct stat *); -static void fspath(Chan*, char*, char*); -static ulong fsdirread(Chan*, uchar*, int, ulong); -static int fsomode(int); - -/* clumsy hack, but not worse than the Path stuff in the last one */ -static char* -uc2name(Chan *c) -{ - char *s; - - if(c->name == nil) - return "/"; - s = c2name(c); - if(s[0]=='#' && s[1]=='U') - return s+2; - return s; -} - -static char* -lastelem(Chan *c) -{ - char *s, *t; - - s = uc2name(c); - if((t = strrchr(s, '/')) == nil) - return s; - if(t[1] == 0) - return t; - return t+1; -} - -static Chan* -fsattach(char *spec) -{ - Chan *c; - struct stat stbuf; - static int devno; - Ufsinfo *uif; - - if(stat(base, &stbuf) < 0) - error(strerror(errno)); - - c = devattach('U', spec); - - uif = mallocz(sizeof(Ufsinfo), 1); - uif->mode = stbuf.st_mode; - uif->uid = stbuf.st_uid; - uif->gid = stbuf.st_gid; - - c->aux = uif; - c->dev = devno++; - c->qid.type = QTDIR; -/*print("fsattach %s\n", c2name(c));*/ - - return c; -} - -static Chan* -fsclone(Chan *c, Chan *nc) -{ - Ufsinfo *uif; - - uif = mallocz(sizeof(Ufsinfo), 1); - *uif = *(Ufsinfo*)c->aux; - nc->aux = uif; - - return nc; -} - -static int -fswalk1(Chan *c, char *name) -{ - struct stat stbuf; - char path[MAXPATH]; - Ufsinfo *uif; - - fspath(c, name, path); - - /*print("** fs walk '%s' -> %s\n", path, name); */ - - if(stat(path, &stbuf) < 0) - return 0; - - uif = c->aux; - - uif->mode = stbuf.st_mode; - uif->uid = stbuf.st_uid; - uif->gid = stbuf.st_gid; - - c->qid = fsqid(path, &stbuf); - - return 1; -} - -extern Cname* addelem(Cname*, char*); - -static Walkqid* -fswalk(Chan *c, Chan *nc, char **name, int nname) -{ - int i; - Cname *cname; - Walkqid *wq; - - if(nc != nil) - panic("fswalk: nc != nil"); - wq = smalloc(sizeof(Walkqid)+(nname-1)*sizeof(Qid)); - nc = devclone(c); - cname = c->name; - incref(&cname->ref); - - fsclone(c, nc); - wq->clone = nc; - for(i=0; i<nname; i++){ - nc->name = cname; - if(fswalk1(nc, name[i]) == 0) - break; - cname = addelem(cname, name[i]); - wq->qid[i] = nc->qid; - } - nc->name = cname; - if(i != nname){ - cclose(nc); - wq->clone = nil; - } - wq->nqid = i; - return wq; -} - -static int -fsstat(Chan *c, uchar *buf, int n) -{ - Dir d; - struct stat stbuf; - char path[MAXPATH]; - - if(n < BIT16SZ) - error(Eshortstat); - - fspath(c, 0, path); - if(stat(path, &stbuf) < 0) - error(strerror(errno)); - - d.name = lastelem(c); - d.uid = "unknown"; - d.gid = "unknown"; - d.muid = "unknown"; - d.qid = c->qid; - d.mode = (c->qid.type<<24)|(stbuf.st_mode&0777); - d.atime = stbuf.st_atime; - d.mtime = stbuf.st_mtime; - d.length = stbuf.st_size; - d.type = 'U'; - d.dev = c->dev; - return convD2M(&d, buf, n); -} - -static Chan* -fsopen(Chan *c, int mode) -{ - char path[MAXPATH]; - int m, isdir; - Ufsinfo *uif; - -/*print("fsopen %s\n", c2name(c));*/ - m = mode & (OTRUNC|3); - switch(m) { - case 0: - break; - case 1: - case 1|16: - break; - case 2: - case 0|16: - case 2|16: - break; - case 3: - break; - default: - error(Ebadarg); - } - - isdir = c->qid.type & QTDIR; - - if(isdir && mode != OREAD) - error(Eperm); - - m = fsomode(m & 3); - c->mode = openmode(mode); - - uif = c->aux; - - fspath(c, 0, path); - if(isdir) { - uif->dir = opendir(path); - if(uif->dir == 0) - error(strerror(errno)); - } - else { - if(mode & OTRUNC) - m |= O_TRUNC; - uif->fd = open(path, m, 0666); - - if(uif->fd < 0) - error(strerror(errno)); - } - uif->offset = 0; - - c->offset = 0; - c->flag |= COPEN; - return c; -} - -static void -fscreate(Chan *c, char *name, int mode, ulong perm) -{ - int fd, m; - char path[MAXPATH]; - struct stat stbuf; - Ufsinfo *uif; - - m = fsomode(mode&3); - - fspath(c, name, path); - - uif = c->aux; - - if(perm & DMDIR) { - if(m) - error(Eperm); - - if(mkdir(path, perm & 0777) < 0) - error(strerror(errno)); - - fd = open(path, 0); - if(fd >= 0) { - chmod(path, perm & 0777); - chown(path, uif->uid, uif->uid); - } - close(fd); - - uif->dir = opendir(path); - if(uif->dir == 0) - error(strerror(errno)); - } - else { - fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0666); - if(fd >= 0) { - if(m != 1) { - close(fd); - fd = open(path, m); - } - chmod(path, perm & 0777); - chown(path, uif->uid, uif->gid); - } - if(fd < 0) - error(strerror(errno)); - uif->fd = fd; - } - - if(stat(path, &stbuf) < 0) - error(strerror(errno)); - c->qid = fsqid(path, &stbuf); - c->offset = 0; - c->flag |= COPEN; - c->mode = openmode(mode); -} - -static void -fsclose(Chan *c) -{ - Ufsinfo *uif; - - uif = c->aux; - - if(c->flag & COPEN) { - if(c->qid.type & QTDIR) - closedir(uif->dir); - else - close(uif->fd); - } - - free(uif); -} - -static long -fsread(Chan *c, void *va, long n, vlong offset) -{ - int fd, r; - Ufsinfo *uif; - -/*print("fsread %s\n", c2name(c));*/ - if(c->qid.type & QTDIR) - return fsdirread(c, va, n, offset); - - uif = c->aux; - qlock(&uif->oq); - if(waserror()) { - qunlock(&uif->oq); - nexterror(); - } - fd = uif->fd; - if(uif->offset != offset) { - r = lseek(fd, offset, 0); - if(r < 0) - error(strerror(errno)); - uif->offset = offset; - } - - n = read(fd, va, n); - if(n < 0) - error(strerror(errno)); - - uif->offset += n; - qunlock(&uif->oq); - poperror(); - - return n; -} - -static long -fswrite(Chan *c, void *va, long n, vlong offset) -{ - int fd, r; - Ufsinfo *uif; - - uif = c->aux; - - qlock(&uif->oq); - if(waserror()) { - qunlock(&uif->oq); - nexterror(); - } - fd = uif->fd; - if(uif->offset != offset) { - r = lseek(fd, offset, 0); - if(r < 0) - error(strerror(errno)); - uif->offset = offset; - } - - n = write(fd, va, n); - if(n < 0) - error(strerror(errno)); - - uif->offset += n; - qunlock(&uif->oq); - poperror(); - - return n; -} - -static void -fsremove(Chan *c) -{ - int n; - char path[MAXPATH]; - - fspath(c, 0, path); - if(c->qid.type & QTDIR) - n = rmdir(path); - else - n = remove(path); - if(n < 0) - error(strerror(errno)); -} - -int -fswstat(Chan *c, uchar *buf, int n) -{ - Dir d; - struct stat stbuf; - char old[MAXPATH], new[MAXPATH]; - char strs[MAXPATH*3], *p; - Ufsinfo *uif; - - if(convM2D(buf, n, &d, strs) != n) - error(Ebadstat); - - fspath(c, 0, old); - if(stat(old, &stbuf) < 0) - error(strerror(errno)); - - uif = c->aux; - - if(d.name[0] && strcmp(d.name, lastelem(c)) != 0) { - fspath(c, 0, old); - strcpy(new, old); - p = strrchr(new, '/'); - strcpy(p+1, d.name); - if(rename(old, new) < 0) - error(strerror(errno)); - } - - fspath(c, 0, old); - if(~d.mode != 0 && (int)(d.mode&0777) != (int)(stbuf.st_mode&0777)) { - if(chmod(old, d.mode&0777) < 0) - error(strerror(errno)); - uif->mode &= ~0777; - uif->mode |= d.mode&0777; - } -/* - p = name2pass(gid, d.gid); - if(p == 0) - error(Eunknown); - - if(p->id != stbuf.st_gid) { - if(chown(old, stbuf.st_uid, p->id) < 0) - error(strerror(errno)); - - uif->gid = p->id; - } -*/ - return n; -} - -static Qid -fsqid(char *p, struct stat *st) -{ - Qid q; - int dev; - ulong h; - static int nqdev; - static uchar *qdev; - - if(qdev == 0) - qdev = mallocz(65536U, 1); - - q.type = 0; - if((st->st_mode&S_IFMT) == S_IFDIR) - q.type = QTDIR; - - dev = st->st_dev & 0xFFFFUL; - if(qdev[dev] == 0) - qdev[dev] = ++nqdev; - - h = 0; - while(*p != '\0') - h += *p++ * 13; - - q.path = (vlong)qdev[dev]<<32; - q.path |= h; - q.vers = st->st_mtime; - - return q; -} - -static void -fspath(Chan *c, char *ext, char *path) -{ - strcpy(path, base); - strcat(path, "/"); - strcat(path, uc2name(c)); - if(ext){ - strcat(path, "/"); - strcat(path, ext); - } - cleanname(path); -} - -static int -isdots(char *name) -{ - if(name[0] != '.') - return 0; - if(name[1] == '\0') - return 1; - if(name[1] != '.') - return 0; - if(name[2] == '\0') - return 1; - return 0; -} - -static int -p9readdir(char *name, Ufsinfo *uif) -{ - struct dirent *de; - - if(uif->nextname[0]){ - strcpy(name, uif->nextname); - uif->nextname[0] = 0; - return 1; - } - - de = readdir(uif->dir); - if(de == NULL) - return 0; - - strcpy(name, de->d_name); - return 1; -} - -static ulong -fsdirread(Chan *c, uchar *va, int count, ulong offset) -{ - int i; - Dir d; - long n; - char de[NAME_MAX]; - struct stat stbuf; - char path[MAXPATH], dirpath[MAXPATH]; - Ufsinfo *uif; - -/*print("fsdirread %s\n", c2name(c));*/ - i = 0; - uif = c->aux; - - errno = 0; - if(uif->offset != offset) { - if(offset != 0) - error("bad offset in fsdirread"); - uif->offset = offset; /* sync offset */ - uif->nextname[0] = 0; - rewinddir(uif->dir); - } - - fspath(c, 0, dirpath); - - while(i+BIT16SZ < count) { - if(!p9readdir(de, uif)) - break; - - if(de[0]==0 || isdots(de)) - continue; - - d.name = de; - sprint(path, "%s/%s", dirpath, de); - memset(&stbuf, 0, sizeof stbuf); - - if(stat(path, &stbuf) < 0) { - /* fprint(2, "dir: bad path %s\n", path); */ - /* but continue... probably a bad symlink */ - } - - d.uid = "unknown"; - d.gid = "unknown"; - d.muid = "unknown"; - d.qid = fsqid(path, &stbuf); - d.mode = (d.qid.type<<24)|(stbuf.st_mode&0777); - d.atime = stbuf.st_atime; - d.mtime = stbuf.st_mtime; - d.length = stbuf.st_size; - d.type = 'U'; - d.dev = c->dev; - n = convD2M(&d, (uchar*)va+i, count-i); - if(n == BIT16SZ){ - strcpy(uif->nextname, de); - break; - } - i += n; - } -/*print("got %d\n", i);*/ - uif->offset += i; - return i; -} - -static int -fsomode(int m) -{ - switch(m) { - case 0: /* OREAD */ - case 3: /* OEXEC */ - return 0; - case 1: /* OWRITE */ - return 1; - case 2: /* ORDWR */ - return 2; - } - error(Ebadarg); - return 0; -} - -Dev fsdevtab = { - 'U', - "fs", - - devreset, - devinit, - devshutdown, - fsattach, - fswalk, - fsstat, - fsopen, - fscreate, - fsclose, - fsread, - devbread, - fswrite, - devbwrite, - fsremove, - fswstat, -}; diff --git a/sys/src/cmd/unix/drawterm/kern/devfs-win32.c b/sys/src/cmd/unix/drawterm/kern/devfs-win32.c deleted file mode 100644 index 9997bd027..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devfs-win32.c +++ /dev/null @@ -1,707 +0,0 @@ -/* - * Disable Unicode until the calls to FindFirstFile etc - * are changed to use wide character strings. - */ -#undef UNICODE -#include <windows.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#ifndef NAME_MAX -# define NAME_MAX 256 -#endif -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -typedef struct DIR DIR; -typedef struct Ufsinfo Ufsinfo; - -enum -{ - NUID = 256, - NGID = 256, - MAXPATH = 1024, - MAXCOMP = 128 -}; - -struct DIR -{ - HANDLE handle; - char* path; - int index; - WIN32_FIND_DATA wfd; -}; - -struct Ufsinfo -{ - int mode; - int fd; - int uid; - int gid; - DIR* dir; - ulong offset; - QLock oq; - char nextname[NAME_MAX]; -}; - -DIR* opendir(char*); -int readdir(char*, DIR*); -void closedir(DIR*); -void rewinddir(DIR*); - -char *base = "c:/."; - -static Qid fsqid(char*, struct stat *); -static void fspath(Chan*, char*, char*); -// static void fsperm(Chan*, int); -static ulong fsdirread(Chan*, uchar*, int, ulong); -static int fsomode(int); -static int chown(char *path, int uid, int); - -/* clumsy hack, but not worse than the Path stuff in the last one */ -static char* -uc2name(Chan *c) -{ - char *s; - - if(c->name == nil) - return "/"; - s = c2name(c); - if(s[0]=='#' && s[1]=='U') - return s+2; - return s; -} - -static char* -lastelem(Chan *c) -{ - char *s, *t; - - s = uc2name(c); - if((t = strrchr(s, '/')) == nil) - return s; - if(t[1] == 0) - return t; - return t+1; -} - -static Chan* -fsattach(char *spec) -{ - Chan *c; - struct stat stbuf; - static int devno; - Ufsinfo *uif; - - if(stat(base, &stbuf) < 0) - error(strerror(errno)); - - c = devattach('U', spec); - - uif = mallocz(sizeof(Ufsinfo), 1); - uif->gid = stbuf.st_gid; - uif->uid = stbuf.st_uid; - uif->mode = stbuf.st_mode; - - c->aux = uif; - c->dev = devno++; - c->qid.type = QTDIR; -/*print("fsattach %s\n", c2name(c));*/ - - return c; -} - -static Chan* -fsclone(Chan *c, Chan *nc) -{ - Ufsinfo *uif; - - uif = mallocz(sizeof(Ufsinfo), 1); - *uif = *(Ufsinfo*)c->aux; - nc->aux = uif; - - return nc; -} - -static int -fswalk1(Chan *c, char *name) -{ - struct stat stbuf; - char path[MAXPATH]; - Ufsinfo *uif; - - fspath(c, name, path); - - /* print("** fs walk '%s' -> %s\n", path, name); */ - - if(stat(path, &stbuf) < 0) - return 0; - - uif = c->aux; - - uif->gid = stbuf.st_gid; - uif->uid = stbuf.st_uid; - uif->mode = stbuf.st_mode; - - c->qid = fsqid(path, &stbuf); - - return 1; -} - -extern Cname* addelem(Cname*, char*); - -static Walkqid* -fswalk(Chan *c, Chan *nc, char **name, int nname) -{ - int i; - Cname *cname; - Walkqid *wq; - - if(nc != nil) - panic("fswalk: nc != nil"); - wq = smalloc(sizeof(Walkqid)+(nname-1)*sizeof(Qid)); - nc = devclone(c); - cname = c->name; - incref(&cname->ref); - - fsclone(c, nc); - wq->clone = nc; - for(i=0; i<nname; i++){ - nc->name = cname; - if(fswalk1(nc, name[i]) == 0) - break; - cname = addelem(cname, name[i]); - wq->qid[i] = nc->qid; - } - nc->name = cname; - if(i != nname){ - cclose(nc); - wq->clone = nil; - } - wq->nqid = i; - return wq; -} - -static int -fsstat(Chan *c, uchar *buf, int n) -{ - Dir d; - struct stat stbuf; - char path[MAXPATH]; - - if(n < BIT16SZ) - error(Eshortstat); - - fspath(c, 0, path); - if(stat(path, &stbuf) < 0) - error(strerror(errno)); - - d.name = lastelem(c); - d.uid = "unknown"; - d.gid = "unknown"; - d.muid = "unknown"; - d.qid = c->qid; - d.mode = (c->qid.type<<24)|(stbuf.st_mode&0777); - d.atime = stbuf.st_atime; - d.mtime = stbuf.st_mtime; - d.length = stbuf.st_size; - d.type = 'U'; - d.dev = c->dev; - return convD2M(&d, buf, n); -} - -static Chan* -fsopen(Chan *c, int mode) -{ - char path[MAXPATH]; - int m, isdir; - Ufsinfo *uif; - -/*print("fsopen %s\n", c2name(c));*/ - m = mode & (OTRUNC|3); - switch(m) { - case 0: - break; - case 1: - case 1|16: - break; - case 2: - case 0|16: - case 2|16: - break; - case 3: - break; - default: - error(Ebadarg); - } - - isdir = c->qid.type & QTDIR; - - if(isdir && mode != OREAD) - error(Eperm); - - m = fsomode(m & 3); - c->mode = openmode(mode); - - uif = c->aux; - - fspath(c, 0, path); - if(isdir) { - uif->dir = opendir(path); - if(uif->dir == 0) - error(strerror(errno)); - } - else { - if(mode & OTRUNC) - m |= O_TRUNC; - uif->fd = open(path, m|_O_BINARY, 0666); - - if(uif->fd < 0) - error(strerror(errno)); - } - uif->offset = 0; - - c->offset = 0; - c->flag |= COPEN; - return c; -} - -static void -fscreate(Chan *c, char *name, int mode, ulong perm) -{ - int fd, m; - char path[MAXPATH]; - struct stat stbuf; - Ufsinfo *uif; - - m = fsomode(mode&3); - - fspath(c, name, path); - - uif = c->aux; - - if(perm & DMDIR) { - if(m) - error(Eperm); - - if(mkdir(path) < 0) - error(strerror(errno)); - - fd = open(path, 0); - if(fd >= 0) { - chmod(path, perm & 0777); - chown(path, uif->uid, uif->uid); - } - close(fd); - - uif->dir = opendir(path); - if(uif->dir == 0) - error(strerror(errno)); - } - else { - fd = open(path, _O_WRONLY|_O_BINARY|_O_CREAT|_O_TRUNC, 0666); - if(fd >= 0) { - if(m != 1) { - close(fd); - fd = open(path, m|_O_BINARY); - } - chmod(path, perm & 0777); - chown(path, uif->uid, uif->gid); - } - if(fd < 0) - error(strerror(errno)); - uif->fd = fd; - } - - if(stat(path, &stbuf) < 0) - error(strerror(errno)); - c->qid = fsqid(path, &stbuf); - c->offset = 0; - c->flag |= COPEN; - c->mode = openmode(mode); -} - -static void -fsclose(Chan *c) -{ - Ufsinfo *uif; - - uif = c->aux; - - if(c->flag & COPEN) { - if(c->qid.type & QTDIR) - closedir(uif->dir); - else - close(uif->fd); - } - - free(uif); -} - -static long -fsread(Chan *c, void *va, long n, vlong offset) -{ - int fd, r; - Ufsinfo *uif; - -/*print("fsread %s\n", c2name(c));*/ - if(c->qid.type & QTDIR) - return fsdirread(c, va, n, offset); - - uif = c->aux; - qlock(&uif->oq); - if(waserror()) { - qunlock(&uif->oq); - nexterror(); - } - fd = uif->fd; - if(uif->offset != offset) { - r = lseek(fd, offset, 0); - if(r < 0) - error(strerror(errno)); - uif->offset = offset; - } - - n = read(fd, va, n); - if(n < 0) - error(strerror(errno)); - - uif->offset += n; - qunlock(&uif->oq); - poperror(); - - return n; -} - -static long -fswrite(Chan *c, void *va, long n, vlong offset) -{ - int fd, r; - Ufsinfo *uif; - - uif = c->aux; - - qlock(&uif->oq); - if(waserror()) { - qunlock(&uif->oq); - nexterror(); - } - fd = uif->fd; - if(uif->offset != offset) { - r = lseek(fd, offset, 0); - if(r < 0) - error(strerror(errno)); - uif->offset = offset; - } - - n = write(fd, va, n); - if(n < 0) - error(strerror(errno)); - - uif->offset += n; - qunlock(&uif->oq); - poperror(); - - return n; -} - -static void -fsremove(Chan *c) -{ - int n; - char path[MAXPATH]; - - fspath(c, 0, path); - if(c->qid.type & QTDIR) - n = rmdir(path); - else - n = remove(path); - if(n < 0) - error(strerror(errno)); -} - -static int -fswstat(Chan *c, uchar *buf, int n) -{ - Dir d; - struct stat stbuf; - char old[MAXPATH], new[MAXPATH]; - char strs[MAXPATH*3], *p; - Ufsinfo *uif; - - if (convM2D(buf, n, &d, strs) != n) - error(Ebadstat); - - fspath(c, 0, old); - if(stat(old, &stbuf) < 0) - error(strerror(errno)); - - uif = c->aux; - -// if(uif->uid != stbuf.st_uid) -// error(Eowner); - - if(d.name[0] && strcmp(d.name, lastelem(c)) != 0) { - fspath(c, 0, old); - strcpy(new, old); - p = strrchr(new, '/'); - strcpy(p+1, d.name); - if(rename(old, new) < 0) - error(strerror(errno)); - } - - fspath(c, 0, old); - if(~d.mode != 0 && (int)(d.mode&0777) != (int)(stbuf.st_mode&0777)) { - if(chmod(old, d.mode&0777) < 0) - error(strerror(errno)); - uif->mode &= ~0777; - uif->mode |= d.mode&0777; - } -/* - p = name2pass(gid, d.gid); - if(p == 0) - error(Eunknown); - - if(p->id != stbuf.st_gid) { - if(chown(old, stbuf.st_uid, p->id) < 0) - error(sys_errlist[errno]); - - uif->gid = p->id; - } -*/ - return n; -} - -static Qid -fsqid(char *p, struct stat *st) -{ - Qid q; - int dev; - ulong h; - static int nqdev; - static uchar *qdev; - - if(qdev == 0) - qdev = mallocz(65536U, 1); - - q.type = 0; - if((st->st_mode&S_IFMT) == S_IFDIR) - q.type = QTDIR; - - dev = st->st_dev & 0xFFFFUL; - if(qdev[dev] == 0) - qdev[dev] = ++nqdev; - - h = 0; - while(*p != '\0') - h += *p++ * 13; - - q.path = (vlong)qdev[dev]<<32; - q.path |= h; - q.vers = st->st_mtime; - - return q; -} - -static void -fspath(Chan *c, char *ext, char *path) -{ - strcpy(path, base); - strcat(path, "/"); - strcat(path, uc2name(c)); - if(ext) { - strcat(path, "/"); - strcat(path, ext); - } - cleanname(path); -} - -static int -isdots(char *name) -{ - if(name[0] != '.') - return 0; - if(name[1] == '\0') - return 1; - if(name[1] != '.') - return 0; - if(name[2] == '\0') - return 1; - return 0; -} - -static int -p9readdir(char *name, Ufsinfo *uif) -{ - if(uif->nextname[0]){ - strcpy(name, uif->nextname); - uif->nextname[0] = 0; - return 1; - } - - return readdir(name, uif->dir); -} - -static ulong -fsdirread(Chan *c, uchar *va, int count, ulong offset) -{ - int i; - Dir d; - long n; - char de[NAME_MAX]; - struct stat stbuf; - char path[MAXPATH], dirpath[MAXPATH]; - Ufsinfo *uif; - -/*print("fsdirread %s\n", c2name(c));*/ - i = 0; - uif = c->aux; - - errno = 0; - if(uif->offset != offset) { - if(offset != 0) - error("bad offset in fsdirread"); - uif->offset = offset; /* sync offset */ - uif->nextname[0] = 0; - rewinddir(uif->dir); - } - - fspath(c, 0, dirpath); - - while(i+BIT16SZ < count) { - if(!p9readdir(de, uif)) - break; - - if(de[0]==0 || isdots(de)) - continue; - - d.name = de; - sprint(path, "%s/%s", dirpath, de); - memset(&stbuf, 0, sizeof stbuf); - - if(stat(path, &stbuf) < 0) { - print("dir: bad path %s\n", path); - /* but continue... probably a bad symlink */ - } - - d.uid = "unknown"; - d.gid = "unknown"; - d.muid = "unknown"; - d.qid = fsqid(path, &stbuf); - d.mode = (d.qid.type<<24)|(stbuf.st_mode&0777); - d.atime = stbuf.st_atime; - d.mtime = stbuf.st_mtime; - d.length = stbuf.st_size; - d.type = 'U'; - d.dev = c->dev; - n = convD2M(&d, (uchar*)va+i, count-i); - if(n == BIT16SZ){ - strcpy(uif->nextname, de); - break; - } - i += n; - } -/*print("got %d\n", i);*/ - uif->offset += i; - return i; -} - -static int -fsomode(int m) -{ - switch(m) { - case 0: /* OREAD */ - case 3: /* OEXEC */ - return 0; - case 1: /* OWRITE */ - return 1; - case 2: /* ORDWR */ - return 2; - } - error(Ebadarg); - return 0; -} -void -closedir(DIR *d) -{ - FindClose(d->handle); - free(d->path); -} - -int -readdir(char *name, DIR *d) -{ - if(d->index != 0) { - if(FindNextFile(d->handle, &d->wfd) == FALSE) - return 0; - } - strcpy(name, (char*)d->wfd.cFileName); - d->index++; - - return 1; -} - -void -rewinddir(DIR *d) -{ - FindClose(d->handle); - d->handle = FindFirstFile(d->path, &d->wfd); - d->index = 0; -} - -static int -chown(char *path, int uid, int perm) -{ -/* panic("chown"); */ - return 0; -} - -DIR* -opendir(char *p) -{ - DIR *d; - char path[MAX_PATH]; - - - snprint(path, sizeof(path), "%s/*.*", p); - - d = mallocz(sizeof(DIR), 1); - if(d == 0) - return 0; - - d->index = 0; - - d->handle = FindFirstFile(path, &d->wfd); - if(d->handle == INVALID_HANDLE_VALUE) { - free(d); - return 0; - } - - d->path = strdup(path); - return d; -} - -Dev fsdevtab = { - 'U', - "fs", - - devreset, - devinit, - devshutdown, - fsattach, - fswalk, - fsstat, - fsopen, - fscreate, - fsclose, - fsread, - devbread, - fswrite, - devbwrite, - fsremove, - fswstat, -}; diff --git a/sys/src/cmd/unix/drawterm/kern/devip-posix.c b/sys/src/cmd/unix/drawterm/kern/devip-posix.c deleted file mode 100644 index 7f6171e4e..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devip-posix.c +++ /dev/null @@ -1,210 +0,0 @@ -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <netinet/tcp.h> -#include <netdb.h> - -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "devip.h" - -#undef listen -#undef accept -#undef bind - -void -osipinit(void) -{ - char buf[1024]; - gethostname(buf, sizeof(buf)); - kstrdup(&sysname, buf); - -} - -int -so_socket(int type) -{ - int fd, one; - - switch(type) { - default: - error("bad protocol type"); - case S_TCP: - type = SOCK_STREAM; - break; - case S_UDP: - type = SOCK_DGRAM; - break; - } - - fd = socket(AF_INET, type, 0); - if(fd < 0) - oserror(); - - one = 1; - if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof(one)) > 0){ - oserrstr(); - print("setsockopt: %r"); - } - - return fd; -} - - -void -so_connect(int fd, unsigned long raddr, unsigned short rport) -{ - struct sockaddr_in sin; - - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - hnputs(&sin.sin_port, rport); - hnputl(&sin.sin_addr.s_addr, raddr); - - if(connect(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) - oserror(); -} - -void -so_getsockname(int fd, unsigned long *laddr, unsigned short *lport) -{ - socklen_t len; - struct sockaddr_in sin; - - len = sizeof(sin); - if(getsockname(fd, (struct sockaddr*)&sin, &len) < 0) - oserror(); - - if(sin.sin_family != AF_INET || len != sizeof(sin)) - error("not AF_INET"); - - *laddr = nhgetl(&sin.sin_addr.s_addr); - *lport = nhgets(&sin.sin_port); -} - -void -so_listen(int fd) -{ - if(listen(fd, 5) < 0) - oserror(); -} - -int -so_accept(int fd, unsigned long *raddr, unsigned short *rport) -{ - int nfd; - socklen_t len; - struct sockaddr_in sin; - - len = sizeof(sin); - nfd = accept(fd, (struct sockaddr*)&sin, &len); - if(nfd < 0) - oserror(); - - if(sin.sin_family != AF_INET || len != sizeof(sin)) - error("not AF_INET"); - - *raddr = nhgetl(&sin.sin_addr.s_addr); - *rport = nhgets(&sin.sin_port); - return nfd; -} - -void -so_bind(int fd, int su, unsigned short port) -{ - int i, one; - struct sockaddr_in sin; - - one = 1; - if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one)) < 0){ - oserrstr(); - print("setsockopt: %r"); - } - - if(su) { - for(i = 600; i < 1024; i++) { - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = i; - - if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) >= 0) - return; - } - oserror(); - } - - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - hnputs(&sin.sin_port, port); - - if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) - oserror(); -} - -int -so_gethostbyname(char *host, char**hostv, int n) -{ - int i; - char buf[32]; - unsigned char *p; - struct hostent *hp; - - hp = gethostbyname(host); - if(hp == 0) - return 0; - - for(i = 0; hp->h_addr_list[i] && i < n; i++) { - p = (unsigned char*)hp->h_addr_list[i]; - sprint(buf, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); - hostv[i] = strdup(buf); - if(hostv[i] == 0) - break; - } - return i; -} - -char* -hostlookup(char *host) -{ - char buf[100]; - uchar *p; - struct hostent *he; - - he = gethostbyname(host); - if(he != 0 && he->h_addr_list[0]) { - p = (uchar*)he->h_addr_list[0]; - sprint(buf, "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3]); - } else - strcpy(buf, host); - - return strdup(buf); -} - -int -so_getservbyname(char *service, char *net, char *port) -{ - struct servent *s; - - s = getservbyname(service, net); - if(s == 0) - return -1; - - sprint(port, "%d", nhgets(&s->s_port)); - return 0; -} - -int -so_send(int fd, void *d, int n, int f) -{ - return send(fd, d, n, f); -} - -int -so_recv(int fd, void *d, int n, int f) -{ - return recv(fd, d, n, f); -} diff --git a/sys/src/cmd/unix/drawterm/kern/devip-win32.c b/sys/src/cmd/unix/drawterm/kern/devip-win32.c deleted file mode 100644 index 3caa67ad1..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devip-win32.c +++ /dev/null @@ -1,212 +0,0 @@ -#include <windows.h> -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "devip.h" - -#ifdef MSVC -#pragma comment(lib, "wsock32.lib") -#endif - -#undef listen -#undef accept -#undef bind - -void -osipinit(void) -{ - WSADATA wasdat; - char buf[1024]; - - if(WSAStartup(MAKEWORD(1, 1), &wasdat) != 0) - panic("no winsock.dll"); - - gethostname(buf, sizeof(buf)); - kstrdup(&sysname, buf); -} - -int -so_socket(int type) -{ - int fd, one; - - switch(type) { - default: - error("bad protocol type"); - case S_TCP: - type = SOCK_STREAM; - break; - case S_UDP: - type = SOCK_DGRAM; - break; - } - - fd = socket(AF_INET, type, 0); - if(fd < 0) - oserror(); - - one = 1; - if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof(one)) > 0){ - oserrstr(); - print("setsockopt: %s\n", up->errstr); - } - - return fd; -} - - -void -so_connect(int fd, unsigned long raddr, unsigned short rport) -{ - struct sockaddr_in sin; - - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - hnputs(&sin.sin_port, rport); - hnputl(&sin.sin_addr.s_addr, raddr); - - if(connect(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) - oserror(); -} - -void -so_getsockname(int fd, unsigned long *laddr, unsigned short *lport) -{ - int len; - struct sockaddr_in sin; - - len = sizeof(sin); - if(getsockname(fd, (struct sockaddr*)&sin, &len) < 0) - oserror(); - - if(sin.sin_family != AF_INET || len != sizeof(sin)) - error("not AF_INET"); - - *laddr = nhgetl(&sin.sin_addr.s_addr); - *lport = nhgets(&sin.sin_port); -} - -void -so_listen(int fd) -{ - if(listen(fd, 5) < 0) - oserror(); -} - -int -so_accept(int fd, unsigned long *raddr, unsigned short *rport) -{ - int nfd, len; - struct sockaddr_in sin; - - len = sizeof(sin); - nfd = accept(fd, (struct sockaddr*)&sin, &len); - if(nfd < 0) - oserror(); - - if(sin.sin_family != AF_INET || len != sizeof(sin)) - error("not AF_INET"); - - *raddr = nhgetl(&sin.sin_addr.s_addr); - *rport = nhgets(&sin.sin_port); - return nfd; -} - -void -so_bind(int fd, int su, unsigned short port) -{ - int i, one; - struct sockaddr_in sin; - - one = 1; - if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one)) < 0){ - oserrstr(); - print("setsockopt: %s", up->errstr); - } - - if(su) { - for(i = 600; i < 1024; i++) { - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = i; - - if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) >= 0) - return; - } - oserror(); - } - - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - hnputs(&sin.sin_port, port); - - if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) - oserror(); -} - -int -so_gethostbyname(char *host, char**hostv, int n) -{ - int i; - char buf[32]; - unsigned char *p; - struct hostent *hp; - - hp = gethostbyname(host); - if(hp == 0) - return 0; - - for(i = 0; hp->h_addr_list[i] && i < n; i++) { - p = (unsigned char*)hp->h_addr_list[i]; - sprint(buf, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); - hostv[i] = strdup(buf); - if(hostv[i] == 0) - break; - } - return i; -} - -char* -hostlookup(char *host) -{ - char buf[100]; - uchar *p; - HOSTENT *he; - - he = gethostbyname(host); - if(he != 0 && he->h_addr_list[0]) { - p = (uchar*)he->h_addr_list[0]; - sprint(buf, "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3]); - } else - strcpy(buf, host); - - return strdup(buf); -} - -int -so_getservbyname(char *service, char *net, char *port) -{ - struct servent *s; - - s = getservbyname(service, net); - if(s == 0) - return -1; - - sprint(port, "%d", nhgets(&s->s_port)); - return 0; -} - -int -so_send(int fd, void *d, int n, int f) -{ - return send(fd, d, n, f); -} - -int -so_recv(int fd, void *d, int n, int f) -{ - return recv(fd, d, n, f); -} diff --git a/sys/src/cmd/unix/drawterm/kern/devip.c b/sys/src/cmd/unix/drawterm/kern/devip.c deleted file mode 100644 index f192aebcb..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devip.c +++ /dev/null @@ -1,938 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "devip.h" - -void hnputl(void *p, unsigned long v); -void hnputs(void *p, unsigned short v); -unsigned long nhgetl(void *p); -unsigned short nhgets(void *p); -unsigned long parseip(char *to, char *from); -void csclose(Chan*); -long csread(Chan*, void*, long, vlong); -long cswrite(Chan*, void*, long, vlong); - -void osipinit(void); - -enum -{ - Qtopdir = 1, /* top level directory */ - Qcs, - Qprotodir, /* directory for a protocol */ - Qclonus, - Qconvdir, /* directory for a conversation */ - Qdata, - Qctl, - Qstatus, - Qremote, - Qlocal, - Qlisten, - - MAXPROTO = 4 -}; -#define TYPE(x) ((int)((x).path & 0xf)) -#define CONV(x) ((int)(((x).path >> 4)&0xfff)) -#define PROTO(x) ((int)(((x).path >> 16)&0xff)) -#define QID(p, c, y) (((p)<<16) | ((c)<<4) | (y)) - -typedef struct Proto Proto; -typedef struct Conv Conv; -struct Conv -{ - int x; - Ref r; - int sfd; - int perm; - char owner[KNAMELEN]; - char* state; - ulong laddr; - ushort lport; - ulong raddr; - ushort rport; - int restricted; - char cerr[KNAMELEN]; - Proto* p; -}; - -struct Proto -{ - Lock l; - int x; - int stype; - char name[KNAMELEN]; - int nc; - int maxconv; - Conv** conv; - Qid qid; -}; - -static int np; -static Proto proto[MAXPROTO]; -int eipfmt(Fmt*); - -static Conv* protoclone(Proto*, char*, int); -static void setladdr(Conv*); - -int -ipgen(Chan *c, char *nname, Dirtab *d, int nd, int s, Dir *dp) -{ - Qid q; - Conv *cv; - char *p; - - USED(nname); - q.vers = 0; - q.type = 0; - switch(TYPE(c->qid)) { - case Qtopdir: - if(s >= 1+np) - return -1; - - if(s == 0){ - q.path = QID(s, 0, Qcs); - devdir(c, q, "cs", 0, "network", 0666, dp); - }else{ - s--; - q.path = QID(s, 0, Qprotodir); - q.type = QTDIR; - devdir(c, q, proto[s].name, 0, "network", DMDIR|0555, dp); - } - return 1; - case Qprotodir: - if(s < proto[PROTO(c->qid)].nc) { - cv = proto[PROTO(c->qid)].conv[s]; - sprint(up->genbuf, "%d", s); - q.path = QID(PROTO(c->qid), s, Qconvdir); - q.type = QTDIR; - devdir(c, q, up->genbuf, 0, cv->owner, DMDIR|0555, dp); - return 1; - } - s -= proto[PROTO(c->qid)].nc; - switch(s) { - default: - return -1; - case 0: - p = "clone"; - q.path = QID(PROTO(c->qid), 0, Qclonus); - break; - } - devdir(c, q, p, 0, "network", 0555, dp); - return 1; - case Qconvdir: - cv = proto[PROTO(c->qid)].conv[CONV(c->qid)]; - switch(s) { - default: - return -1; - case 0: - q.path = QID(PROTO(c->qid), CONV(c->qid), Qdata); - devdir(c, q, "data", 0, cv->owner, cv->perm, dp); - return 1; - case 1: - q.path = QID(PROTO(c->qid), CONV(c->qid), Qctl); - devdir(c, q, "ctl", 0, cv->owner, cv->perm, dp); - return 1; - case 2: - p = "status"; - q.path = QID(PROTO(c->qid), CONV(c->qid), Qstatus); - break; - case 3: - p = "remote"; - q.path = QID(PROTO(c->qid), CONV(c->qid), Qremote); - break; - case 4: - p = "local"; - q.path = QID(PROTO(c->qid), CONV(c->qid), Qlocal); - break; - case 5: - p = "listen"; - q.path = QID(PROTO(c->qid), CONV(c->qid), Qlisten); - break; - } - devdir(c, q, p, 0, cv->owner, 0444, dp); - return 1; - } - return -1; -} - -static void -newproto(char *name, int type, int maxconv) -{ - int l; - Proto *p; - - if(np >= MAXPROTO) { - print("no %s: increase MAXPROTO", name); - return; - } - - p = &proto[np]; - strcpy(p->name, name); - p->stype = type; - p->qid.path = QID(np, 0, Qprotodir); - p->qid.type = QTDIR; - p->x = np++; - p->maxconv = maxconv; - l = sizeof(Conv*)*(p->maxconv+1); - p->conv = mallocz(l, 1); - if(p->conv == 0) - panic("no memory"); -} - -void -ipinit(void) -{ - osipinit(); - - newproto("udp", S_UDP, 10); - newproto("tcp", S_TCP, 30); - - fmtinstall('I', eipfmt); - fmtinstall('E', eipfmt); - -} - -Chan * -ipattach(char *spec) -{ - Chan *c; - - c = devattach('I', spec); - c->qid.path = QID(0, 0, Qtopdir); - c->qid.type = QTDIR; - c->qid.vers = 0; - return c; -} - -static Walkqid* -ipwalk(Chan *c, Chan *nc, char **name, int nname) -{ - return devwalk(c, nc, name, nname, 0, 0, ipgen); -} - -int -ipstat(Chan *c, uchar *dp, int n) -{ - return devstat(c, dp, n, 0, 0, ipgen); -} - -Chan * -ipopen(Chan *c, int omode) -{ - Proto *p; - ulong raddr; - ushort rport; - int perm, sfd; - Conv *cv, *lcv; - - omode &= 3; - perm = 0; - switch(omode) { - case OREAD: - perm = 4; - break; - case OWRITE: - perm = 2; - break; - case ORDWR: - perm = 6; - break; - } - - switch(TYPE(c->qid)) { - default: - break; - case Qtopdir: - case Qprotodir: - case Qconvdir: - case Qstatus: - case Qremote: - case Qlocal: - if(omode != OREAD) - error(Eperm); - break; - case Qclonus: - p = &proto[PROTO(c->qid)]; - cv = protoclone(p, up->user, -1); - if(cv == 0) - error(Enodev); - c->qid.path = QID(p->x, cv->x, Qctl); - c->qid.vers = 0; - break; - case Qdata: - case Qctl: - p = &proto[PROTO(c->qid)]; - lock(&p->l); - cv = p->conv[CONV(c->qid)]; - lock(&cv->r.lk); - if((perm & (cv->perm>>6)) != perm) { - if(strcmp(up->user, cv->owner) != 0 || - (perm & cv->perm) != perm) { - unlock(&cv->r.lk); - unlock(&p->l); - error(Eperm); - } - } - cv->r.ref++; - if(cv->r.ref == 1) { - memmove(cv->owner, up->user, KNAMELEN); - cv->perm = 0660; - } - unlock(&cv->r.lk); - unlock(&p->l); - break; - case Qlisten: - p = &proto[PROTO(c->qid)]; - lcv = p->conv[CONV(c->qid)]; - sfd = so_accept(lcv->sfd, &raddr, &rport); - cv = protoclone(p, up->user, sfd); - if(cv == 0) { - close(sfd); - error(Enodev); - } - cv->raddr = raddr; - cv->rport = rport; - setladdr(cv); - cv->state = "Established"; - c->qid.path = QID(p->x, cv->x, Qctl); - break; - } - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - return c; -} - -void -ipclose(Chan *c) -{ - Conv *cc; - - switch(TYPE(c->qid)) { - case Qcs: - csclose(c); - break; - case Qdata: - case Qctl: - if((c->flag & COPEN) == 0) - break; - cc = proto[PROTO(c->qid)].conv[CONV(c->qid)]; - if(decref(&cc->r) != 0) - break; - strcpy(cc->owner, "network"); - cc->perm = 0666; - cc->state = "Closed"; - cc->laddr = 0; - cc->raddr = 0; - cc->lport = 0; - cc->rport = 0; - close(cc->sfd); - break; - } -} - -long -ipread(Chan *ch, void *a, long n, vlong offset) -{ - int r; - Conv *c; - Proto *x; - uchar ip[4]; - char buf[128], *p; - -/*print("ipread %s %lux\n", c2name(ch), (long)ch->qid.path);*/ - p = a; - switch(TYPE(ch->qid)) { - default: - error(Eperm); - case Qcs: - return csread(ch, a, n, offset); - case Qprotodir: - case Qtopdir: - case Qconvdir: - return devdirread(ch, a, n, 0, 0, ipgen); - case Qctl: - sprint(buf, "%d", CONV(ch->qid)); - return readstr(offset, p, n, buf); - case Qremote: - c = proto[PROTO(ch->qid)].conv[CONV(ch->qid)]; - hnputl(ip, c->raddr); - sprint(buf, "%I!%d\n", ip, c->rport); - return readstr(offset, p, n, buf); - case Qlocal: - c = proto[PROTO(ch->qid)].conv[CONV(ch->qid)]; - hnputl(ip, c->laddr); - sprint(buf, "%I!%d\n", ip, c->lport); - return readstr(offset, p, n, buf); - case Qstatus: - x = &proto[PROTO(ch->qid)]; - c = x->conv[CONV(ch->qid)]; - sprint(buf, "%s/%d %d %s \n", - c->p->name, c->x, c->r.ref, c->state); - return readstr(offset, p, n, buf); - case Qdata: - c = proto[PROTO(ch->qid)].conv[CONV(ch->qid)]; - r = so_recv(c->sfd, a, n, 0); - if(r < 0){ - oserrstr(); - nexterror(); - } - return r; - } -} - -static void -setladdr(Conv *c) -{ - so_getsockname(c->sfd, &c->laddr, &c->lport); -} - -static void -setlport(Conv *c) -{ - if(c->restricted == 0 && c->lport == 0) - return; - - so_bind(c->sfd, c->restricted, c->lport); -} - -static void -setladdrport(Conv *c, char *str) -{ - char *p, addr[4]; - - p = strchr(str, '!'); - if(p == 0) { - p = str; - c->laddr = 0; - } - else { - *p++ = 0; - parseip(addr, str); - c->laddr = nhgetl((uchar*)addr); - } - if(*p == '*') - c->lport = 0; - else - c->lport = atoi(p); - - setlport(c); -} - -static char* -setraddrport(Conv *c, char *str) -{ - char *p, addr[4]; - - p = strchr(str, '!'); - if(p == 0) - return "malformed address"; - *p++ = 0; - parseip(addr, str); - c->raddr = nhgetl((uchar*)addr); - c->rport = atoi(p); - p = strchr(p, '!'); - if(p) { - if(strcmp(p, "!r") == 0) - c->restricted = 1; - } - return 0; -} - -long -ipwrite(Chan *ch, void *a, long n, vlong offset) -{ - Conv *c; - Proto *x; - int r, nf; - char *p, *fields[3], buf[128]; - - switch(TYPE(ch->qid)) { - default: - error(Eperm); - case Qcs: - return cswrite(ch, a, n, offset); - case Qctl: - x = &proto[PROTO(ch->qid)]; - c = x->conv[CONV(ch->qid)]; - if(n > sizeof(buf)-1) - n = sizeof(buf)-1; - memmove(buf, a, n); - buf[n] = '\0'; - - nf = tokenize(buf, fields, 3); - if(strcmp(fields[0], "connect") == 0){ - switch(nf) { - default: - error("bad args to connect"); - case 2: - p = setraddrport(c, fields[1]); - if(p != 0) - error(p); - break; - case 3: - p = setraddrport(c, fields[1]); - if(p != 0) - error(p); - c->lport = atoi(fields[2]); - setlport(c); - break; - } - so_connect(c->sfd, c->raddr, c->rport); - setladdr(c); - c->state = "Established"; - return n; - } - if(strcmp(fields[0], "announce") == 0) { - switch(nf){ - default: - error("bad args to announce"); - case 2: - setladdrport(c, fields[1]); - break; - } - so_listen(c->sfd); - c->state = "Announced"; - return n; - } - if(strcmp(fields[0], "bind") == 0){ - switch(nf){ - default: - error("bad args to bind"); - case 2: - c->lport = atoi(fields[1]); - break; - } - setlport(c); - return n; - } - error("bad control message"); - case Qdata: - x = &proto[PROTO(ch->qid)]; - c = x->conv[CONV(ch->qid)]; - r = so_send(c->sfd, a, n, 0); - if(r < 0){ - oserrstr(); - nexterror(); - } - return r; - } - return n; -} - -static Conv* -protoclone(Proto *p, char *user, int nfd) -{ - Conv *c, **pp, **ep; - - c = 0; - lock(&p->l); - if(waserror()) { - unlock(&p->l); - nexterror(); - } - ep = &p->conv[p->maxconv]; - for(pp = p->conv; pp < ep; pp++) { - c = *pp; - if(c == 0) { - c = mallocz(sizeof(Conv), 1); - if(c == 0) - error(Enomem); - lock(&c->r.lk); - c->r.ref = 1; - c->p = p; - c->x = pp - p->conv; - p->nc++; - *pp = c; - break; - } - lock(&c->r.lk); - if(c->r.ref == 0) { - c->r.ref++; - break; - } - unlock(&c->r.lk); - } - if(pp >= ep) { - unlock(&p->l); - poperror(); - return 0; - } - - strcpy(c->owner, user); - c->perm = 0660; - c->state = "Closed"; - c->restricted = 0; - c->laddr = 0; - c->raddr = 0; - c->lport = 0; - c->rport = 0; - c->sfd = nfd; - if(nfd == -1) - c->sfd = so_socket(p->stype); - - unlock(&c->r.lk); - unlock(&p->l); - poperror(); - return c; -} - -enum -{ - Isprefix= 16, -}; - -uchar prefixvals[256] = -{ -/*0x00*/ 0 | Isprefix, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x10*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x20*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x30*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x40*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x50*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x60*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x70*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x80*/ 1 | Isprefix, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0x90*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0xA0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0xB0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0xC0*/ 2 | Isprefix, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0xD0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0xE0*/ 3 | Isprefix, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/*0xF0*/ 4 | Isprefix, - 0, 0, 0, 0, 0, 0, 0, -/*0xF8*/ 5 | Isprefix, - 0, 0, 0, -/*0xFC*/ 6 | Isprefix, - 0, -/*0xFE*/ 7 | Isprefix, -/*0xFF*/ 8 | Isprefix, -}; - -int -eipfmt(Fmt *f) -{ - char buf[5*8]; - static char *efmt = "%.2lux%.2lux%.2lux%.2lux%.2lux%.2lux"; - static char *ifmt = "%d.%d.%d.%d"; - uchar *p, ip[16]; - ulong ul; - - switch(f->r) { - case 'E': /* Ethernet address */ - p = va_arg(f->args, uchar*); - snprint(buf, sizeof buf, efmt, p[0], p[1], p[2], p[3], p[4], p[5]); - return fmtstrcpy(f, buf); - - case 'I': - ul = va_arg(f->args, ulong); - hnputl(ip, ul); - snprint(buf, sizeof buf, ifmt, ip[0], ip[1], ip[2], ip[3]); - return fmtstrcpy(f, buf); - } - return fmtstrcpy(f, "(eipfmt)"); -} - -void -hnputl(void *p, unsigned long v) -{ - unsigned char *a; - - a = p; - a[0] = v>>24; - a[1] = v>>16; - a[2] = v>>8; - a[3] = v; -} - -void -hnputs(void *p, unsigned short v) -{ - unsigned char *a; - - a = p; - a[0] = v>>8; - a[1] = v; -} - -unsigned long -nhgetl(void *p) -{ - unsigned char *a; - a = p; - return (a[0]<<24)|(a[1]<<16)|(a[2]<<8)|(a[3]<<0); -} - -unsigned short -nhgets(void *p) -{ - unsigned char *a; - a = p; - return (a[0]<<8)|(a[1]<<0); -} - -#define CLASS(p) ((*(unsigned char*)(p))>>6) - -unsigned long -parseip(char *to, char *from) -{ - int i; - char *p; - - p = from; - memset(to, 0, 4); - for(i = 0; i < 4 && *p; i++){ - to[i] = strtoul(p, &p, 10); - if(*p != '.' && *p != 0){ - memset(to, 0, 4); - return 0; - } - if(*p == '.') - p++; - } - switch(CLASS(to)){ - case 0: /* class A - 1 byte net */ - case 1: - if(i == 3){ - to[3] = to[2]; - to[2] = to[1]; - to[1] = 0; - } else if (i == 2){ - to[3] = to[1]; - to[1] = 0; - } - break; - case 2: /* class B - 2 byte net */ - if(i == 3){ - to[3] = to[2]; - to[2] = 0; - } - break; - } - return nhgetl(to); -} - -void -csclose(Chan *c) -{ - free(c->aux); -} - -long -csread(Chan *c, void *a, long n, vlong offset) -{ - if(c->aux == nil) - return 0; - return readstr(offset, a, n, c->aux); -} - -static struct -{ - char *name; - uint num; -} tab[] = { - "cs", 1, - "echo", 7, - "discard", 9, - "systat", 11, - "daytime", 13, - "netstat", 15, - "chargen", 19, - "ftp-data", 20, - "ftp", 21, - "ssh", 22, - "telnet", 23, - "smtp", 25, - "time", 37, - "whois", 43, - "dns", 53, - "domain", 53, - "uucp", 64, - "gopher", 70, - "rje", 77, - "finger", 79, - "http", 80, - "link", 87, - "supdup", 95, - "hostnames", 101, - "iso-tsap", 102, - "x400", 103, - "x400-snd", 104, - "csnet-ns", 105, - "pop-2", 109, - "pop3", 110, - "portmap", 111, - "uucp-path", 117, - "nntp", 119, - "netbios", 139, - "imap4", 143, - "NeWS", 144, - "print-srv", 170, - "z39.50", 210, - "fsb", 400, - "sysmon", 401, - "proxy", 402, - "proxyd", 404, - "https", 443, - "cifs", 445, - "ssmtp", 465, - "rexec", 512, - "login", 513, - "shell", 514, - "printer", 515, - "courier", 530, - "cscan", 531, - "uucp", 540, - "snntp", 563, - "9fs", 564, - "whoami", 565, - "guard", 566, - "ticket", 567, - "dlsftp", 666, - "fmclient", 729, - "imaps", 993, - "pop3s", 995, - "ingreslock", 1524, - "pptp", 1723, - "nfs", 2049, - "webster", 2627, - "weather", 3000, - "secstore", 5356, - "Xdisplay", 6000, - "styx", 6666, - "mpeg", 6667, - "rstyx", 6668, - "infdb", 6669, - "infsigner", 6671, - "infcsigner", 6672, - "inflogin", 6673, - "bandt", 7330, - "face", 32000, - "dhashgate", 11978, - "exportfs", 17007, - "rexexec", 17009, - "ncpu", 17010, - "cpu", 17013, - "glenglenda1", 17020, - "glenglenda2", 17021, - "glenglenda3", 17022, - "glenglenda4", 17023, - "glenglenda5", 17024, - "glenglenda6", 17025, - "glenglenda7", 17026, - "glenglenda8", 17027, - "glenglenda9", 17028, - "glenglenda10", 17029, - "flyboy", 17032, - "dlsftp", 17033, - "venti", 17034, - "wiki", 17035, - "vica", 17036, - 0 -}; - -static int -lookupport(char *s) -{ - int i; - char buf[10], *p; - - i = strtol(s, &p, 0); - if(*s && *p == 0) - return i; - - i = so_getservbyname(s, "tcp", buf); - if(i != -1) - return atoi(buf); - for(i=0; tab[i].name; i++) - if(strcmp(s, tab[i].name) == 0) - return tab[i].num; - return 0; -} - -static ulong -lookuphost(char *s) -{ - char to[4]; - ulong ip; - - memset(to, 0, sizeof to); - parseip(to, s); - ip = nhgetl(to); - if(ip != 0) - return ip; - if((s = hostlookup(s)) == nil) - return 0; - parseip(to, s); - ip = nhgetl(to); - free(s); - return ip; -} - -long -cswrite(Chan *c, void *a, long n, vlong offset) -{ - char *f[4]; - char *s, *ns; - ulong ip; - int nf, port; - - s = malloc(n+1); - if(s == nil) - error(Enomem); - if(waserror()){ - free(s); - nexterror(); - } - memmove(s, a, n); - s[n] = 0; - nf = getfields(s, f, nelem(f), 0, "!"); - if(nf != 3) - error("can't translate"); - - port = lookupport(f[2]); - if(port <= 0) - error("no translation for port found"); - - ip = lookuphost(f[1]); - if(ip == 0) - error("no translation for host found"); - - ns = smprint("/net/%s/clone %I!%d", f[0], ip, port); - if(ns == nil) - error(Enomem); - free(c->aux); - c->aux = ns; - poperror(); - free(s); - return n; -} - -Dev ipdevtab = -{ - 'I', - "ip", - - devreset, - ipinit, - devshutdown, - ipattach, - ipwalk, - ipstat, - ipopen, - devcreate, - ipclose, - ipread, - devbread, - ipwrite, - devbwrite, - devremove, - devwstat, -}; - diff --git a/sys/src/cmd/unix/drawterm/kern/devip.h b/sys/src/cmd/unix/drawterm/kern/devip.h deleted file mode 100644 index 950ad398d..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devip.h +++ /dev/null @@ -1,19 +0,0 @@ -enum -{ - S_TCP, - S_UDP -}; - -int so_socket(int type); -void so_connect(int, unsigned long, unsigned short); -void so_getsockname(int, unsigned long*, unsigned short*); -void so_bind(int, int, unsigned short); -void so_listen(int); -int so_send(int, void*, int, int); -int so_recv(int, void*, int, int); -int so_accept(int, unsigned long*, unsigned short*); -int so_getservbyname(char*, char*, char*); -int so_gethostbyname(char*, char**, int); - -char* hostlookup(char*); - diff --git a/sys/src/cmd/unix/drawterm/kern/devlfd.c b/sys/src/cmd/unix/drawterm/kern/devlfd.c deleted file mode 100644 index 7c61e0c1e..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devlfd.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "u.h" -#include <errno.h> -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#undef pread -#undef pwrite - -Chan* -lfdchan(int fd) -{ - Chan *c; - - c = newchan(); - c->type = devno('L', 0); - c->aux = (void*)(uintptr)fd; - c->name = newcname("fd"); - c->mode = ORDWR; - c->qid.type = 0; - c->qid.path = 0; - c->qid.vers = 0; - c->dev = 0; - c->offset = 0; - return c; -} - -int -lfdfd(int fd) -{ - return newfd(lfdchan(fd)); -} - -static Chan* -lfdattach(char *x) -{ - USED(x); - - error(Egreg); - return nil; -} - -static Walkqid* -lfdwalk(Chan *c, Chan *nc, char **name, int nname) -{ - USED(c); - USED(nc); - USED(name); - USED(nname); - - error(Egreg); - return nil; -} - -static int -lfdstat(Chan *c, uchar *dp, int n) -{ - USED(c); - USED(dp); - USED(n); - error(Egreg); - return -1; -} - -static Chan* -lfdopen(Chan *c, int omode) -{ - USED(c); - USED(omode); - - error(Egreg); - return nil; -} - -static void -lfdclose(Chan *c) -{ - close((int)(uintptr)c->aux); -} - -static long -lfdread(Chan *c, void *buf, long n, vlong off) -{ - USED(off); /* can't pread on pipes */ - n = read((int)(uintptr)c->aux, buf, n); - if(n < 0){ - iprint("error %d\n", errno); - oserror(); - } - return n; -} - -static long -lfdwrite(Chan *c, void *buf, long n, vlong off) -{ - USED(off); /* can't pread on pipes */ - - n = write((int)(uintptr)c->aux, buf, n); - if(n < 0){ - iprint("error %d\n", errno); - oserror(); - } - return n; -} - -Dev lfddevtab = { - 'L', - "lfd", - - devreset, - devinit, - devshutdown, - lfdattach, - lfdwalk, - lfdstat, - lfdopen, - devcreate, - lfdclose, - lfdread, - devbread, - lfdwrite, - devbwrite, - devremove, - devwstat, -}; diff --git a/sys/src/cmd/unix/drawterm/kern/devmnt.c b/sys/src/cmd/unix/drawterm/kern/devmnt.c deleted file mode 100644 index 9121bfdb4..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devmnt.c +++ /dev/null @@ -1,1216 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -/* - * References are managed as follows: - * The channel to the server - a network connection or pipe - has one - * reference for every Chan open on the server. The server channel has - * c->mux set to the Mnt used for muxing control to that server. Mnts - * have no reference count; they go away when c goes away. - * Each channel derived from the mount point has mchan set to c, - * and increfs/decrefs mchan to manage references on the server - * connection. - */ - -#define MAXRPC (IOHDRSZ+8192) - -struct Mntrpc -{ - Chan* c; /* Channel for whom we are working */ - Mntrpc* list; /* Free/pending list */ - Fcall request; /* Outgoing file system protocol message */ - Fcall reply; /* Incoming reply */ - Mnt* m; /* Mount device during rpc */ - Rendez r; /* Place to hang out */ - uchar* rpc; /* I/O Data buffer */ - uint rpclen; /* len of buffer */ - Block *b; /* reply blocks */ - char done; /* Rpc completed */ - uvlong stime; /* start time for mnt statistics */ - ulong reqlen; /* request length for mnt statistics */ - ulong replen; /* reply length for mnt statistics */ - Mntrpc* flushed; /* message this one flushes */ -}; - -enum -{ - TAGSHIFT = 5, /* ulong has to be 32 bits */ - TAGMASK = (1<<TAGSHIFT)-1, - NMASK = (64*1024)>>TAGSHIFT, -}; - -struct Mntalloc -{ - Lock lk; - Mnt* list; /* Mount devices in use */ - Mnt* mntfree; /* Free list */ - Mntrpc* rpcfree; - int nrpcfree; - int nrpcused; - ulong id; - ulong tagmask[NMASK]; -}mntalloc; - -void mattach(Mnt*, Chan*, char*); -Mnt* mntchk(Chan*); -void mntdirfix(uchar*, Chan*); -Mntrpc* mntflushalloc(Mntrpc*, ulong); -void mntflushfree(Mnt*, Mntrpc*); -void mntfree(Mntrpc*); -void mntgate(Mnt*); -void mntpntfree(Mnt*); -void mntqrm(Mnt*, Mntrpc*); -Mntrpc* mntralloc(Chan*, ulong); -long mntrdwr(int, Chan*, void*, long, vlong); -int mntrpcread(Mnt*, Mntrpc*); -void mountio(Mnt*, Mntrpc*); -void mountmux(Mnt*, Mntrpc*); -void mountrpc(Mnt*, Mntrpc*); -int rpcattn(void*); -Chan* mntchan(void); - -char Esbadstat[] = "invalid directory entry received from server"; -char Enoversion[] = "version not established for mount channel"; - - -void (*mntstats)(int, Chan*, uvlong, ulong); - -static void -mntreset(void) -{ - mntalloc.id = 1; - mntalloc.tagmask[0] = 1; /* don't allow 0 as a tag */ - mntalloc.tagmask[NMASK-1] = 0x80000000UL; /* don't allow NOTAG */ - fmtinstall('F', fcallfmt); - fmtinstall('D', dirfmt); -/* We can't install %M since eipfmt does and is used in the kernel [sape] */ - - cinit(); -} - -/* - * Version is not multiplexed: message sent only once per connection. - */ -long -mntversion(Chan *c, char *version, int msize, int returnlen) -{ - Fcall f; - uchar *msg; - Mnt *m; - char *v; - long k, l; - uvlong oo; - char buf[128]; - - qlock(&c->umqlock); /* make sure no one else does this until we've established ourselves */ - if(waserror()){ - qunlock(&c->umqlock); - nexterror(); - } - - /* defaults */ - if(msize == 0) - msize = MAXRPC; - if(msize > c->iounit && c->iounit != 0) - msize = c->iounit; - v = version; - if(v == nil || v[0] == '\0') - v = VERSION9P; - - /* validity */ - if(msize < 0) - error("bad iounit in version call"); - if(strncmp(v, VERSION9P, strlen(VERSION9P)) != 0) - error("bad 9P version specification"); - - m = c->mux; - - if(m != nil){ - qunlock(&c->umqlock); - poperror(); - - strecpy(buf, buf+sizeof buf, m->version); - k = strlen(buf); - if(strncmp(buf, v, k) != 0){ - snprint(buf, sizeof buf, "incompatible 9P versions %s %s", m->version, v); - error(buf); - } - if(returnlen > 0){ - if(returnlen < k) - error(Eshort); - memmove(version, buf, k); - } - return k; - } - - f.type = Tversion; - f.tag = NOTAG; - f.msize = msize; - f.version = v; - msg = malloc(8192+IOHDRSZ); - if(msg == nil) - exhausted("version memory"); - if(waserror()){ - free(msg); - nexterror(); - } - k = convS2M(&f, msg, 8192+IOHDRSZ); - if(k == 0) - error("bad fversion conversion on send"); - - lock(&c->ref.lk); - oo = c->offset; - c->offset += k; - unlock(&c->ref.lk); - - l = devtab[c->type]->write(c, msg, k, oo); - - if(l < k){ - lock(&c->ref.lk); - c->offset -= k - l; - unlock(&c->ref.lk); - error("short write in fversion"); - } - - /* message sent; receive and decode reply */ - k = devtab[c->type]->read(c, msg, 8192+IOHDRSZ, c->offset); - if(k <= 0) - error("EOF receiving fversion reply"); - - lock(&c->ref.lk); - c->offset += k; - unlock(&c->ref.lk); - - l = convM2S(msg, k, &f); - if(l != k) - error("bad fversion conversion on reply"); - if(f.type != Rversion){ - if(f.type == Rerror) - error(f.ename); - error("unexpected reply type in fversion"); - } - if(f.msize > msize) - error("server tries to increase msize in fversion"); - if(f.msize<256 || f.msize>1024*1024) - error("nonsense value of msize in fversion"); - k = strlen(f.version); - if(strncmp(f.version, v, k) != 0) - error("bad 9P version returned from server"); - - /* now build Mnt associated with this connection */ - lock(&mntalloc.lk); - m = mntalloc.mntfree; - if(m != 0) - mntalloc.mntfree = m->list; - else { - m = malloc(sizeof(Mnt)); - if(m == 0) { - unlock(&mntalloc.lk); - exhausted("mount devices"); - } - } - m->list = mntalloc.list; - mntalloc.list = m; - m->version = nil; - kstrdup(&m->version, f.version); - m->id = mntalloc.id++; - m->q = qopen(10*MAXRPC, 0, 0, nil); - m->msize = f.msize; - unlock(&mntalloc.lk); - - if(returnlen > 0){ - if(returnlen < k) - error(Eshort); - memmove(version, f.version, k); - } - - poperror(); /* msg */ - free(msg); - - lock(&m->lk); - m->queue = 0; - m->rip = 0; - - c->flag |= CMSG; - c->mux = m; - m->c = c; - unlock(&m->lk); - - poperror(); /* c */ - qunlock(&c->umqlock); - - return k; -} - -Chan* -mntauth(Chan *c, char *spec) -{ - Mnt *m; - Mntrpc *r; - - m = c->mux; - - if(m == nil){ - mntversion(c, VERSION9P, MAXRPC, 0); - m = c->mux; - if(m == nil) - error(Enoversion); - } - - c = mntchan(); - if(waserror()) { - /* Close must not be called since it will - * call mnt recursively - */ - chanfree(c); - nexterror(); - } - - r = mntralloc(0, m->msize); - - if(waserror()) { - mntfree(r); - nexterror(); - } - - r->request.type = Tauth; - r->request.afid = c->fid; - r->request.uname = up->user; - r->request.aname = spec; - mountrpc(m, r); - - c->qid = r->reply.aqid; - c->mchan = m->c; - incref(&m->c->ref); - c->mqid = c->qid; - c->mode = ORDWR; - - poperror(); /* r */ - mntfree(r); - - poperror(); /* c */ - - return c; - -} - -static Chan* -mntattach(char *muxattach) -{ - Mnt *m; - Chan *c; - Mntrpc *r; - struct bogus{ - Chan *chan; - Chan *authchan; - char *spec; - int flags; - }bogus; - - bogus = *((struct bogus *)muxattach); - c = bogus.chan; - - m = c->mux; - - if(m == nil){ - mntversion(c, nil, 0, 0); - m = c->mux; - if(m == nil) - error(Enoversion); - } - - c = mntchan(); - if(waserror()) { - /* Close must not be called since it will - * call mnt recursively - */ - chanfree(c); - nexterror(); - } - - r = mntralloc(0, m->msize); - - if(waserror()) { - mntfree(r); - nexterror(); - } - - r->request.type = Tattach; - r->request.fid = c->fid; - if(bogus.authchan == nil) - r->request.afid = NOFID; - else - r->request.afid = bogus.authchan->fid; - r->request.uname = up->user; - r->request.aname = bogus.spec; - mountrpc(m, r); - - c->qid = r->reply.qid; - c->mchan = m->c; - incref(&m->c->ref); - c->mqid = c->qid; - - poperror(); /* r */ - mntfree(r); - - poperror(); /* c */ - - if(bogus.flags&MCACHE) - c->flag |= CCACHE; - return c; -} - -Chan* -mntchan(void) -{ - Chan *c; - - c = devattach('M', 0); - lock(&mntalloc.lk); - c->dev = mntalloc.id++; - unlock(&mntalloc.lk); - - if(c->mchan) - panic("mntchan non-zero %p", c->mchan); - return c; -} - -static Walkqid* -mntwalk(Chan *c, Chan *nc, char **name, int nname) -{ - int i, alloc; - Mnt *m; - Mntrpc *r; - Walkqid *wq; - - if(nc != nil) - print("mntwalk: nc != nil\n"); - if(nname > MAXWELEM) - error("devmnt: too many name elements"); - alloc = 0; - wq = smalloc(sizeof(Walkqid)+(nname-1)*sizeof(Qid)); - if(waserror()){ - if(alloc && wq->clone!=nil) - cclose(wq->clone); - free(wq); - return nil; - } - - alloc = 0; - m = mntchk(c); - r = mntralloc(c, m->msize); - if(nc == nil){ - nc = devclone(c); - /* - * Until the other side accepts this fid, we can't mntclose it. - * Therefore set type to 0 for now; rootclose is known to be safe. - */ - nc->type = 0; - alloc = 1; - } - wq->clone = nc; - - if(waserror()) { - mntfree(r); - nexterror(); - } - r->request.type = Twalk; - r->request.fid = c->fid; - r->request.newfid = nc->fid; - r->request.nwname = nname; - memmove(r->request.wname, name, nname*sizeof(char*)); - - mountrpc(m, r); - - if(r->reply.nwqid > nname) - error("too many QIDs returned by walk"); - if(r->reply.nwqid < nname){ - if(alloc) - cclose(nc); - wq->clone = nil; - if(r->reply.nwqid == 0){ - free(wq); - wq = nil; - goto Return; - } - } - - /* move new fid onto mnt device and update its qid */ - if(wq->clone != nil){ - if(wq->clone != c){ - wq->clone->type = c->type; - wq->clone->mchan = c->mchan; - incref(&c->mchan->ref); - } - if(r->reply.nwqid > 0) - wq->clone->qid = r->reply.wqid[r->reply.nwqid-1]; - } - wq->nqid = r->reply.nwqid; - for(i=0; i<wq->nqid; i++) - wq->qid[i] = r->reply.wqid[i]; - - Return: - poperror(); - mntfree(r); - poperror(); - return wq; -} - -static int -mntstat(Chan *c, uchar *dp, int n) -{ - Mnt *m; - Mntrpc *r; - - if(n < BIT16SZ) - error(Eshortstat); - m = mntchk(c); - r = mntralloc(c, m->msize); - if(waserror()) { - mntfree(r); - nexterror(); - } - r->request.type = Tstat; - r->request.fid = c->fid; - mountrpc(m, r); - -/* r->reply.nstat is 16 bits - if(r->reply.nstat >= 1<<16) - error("returned stat buffer count too large"); -*/ - - if(r->reply.nstat > n){ - /* - * 12/31/2002 RSC - * - * This should be nstat-2, which is the first two - * bytes of the stat buffer. But dirstat and dirfstat - * depended on getting the full nstat (they didn't - * add BIT16SZ themselves). I fixed dirstat and dirfstat - * but am leaving this unchanged for now. After a - * few months, once enough of the relevant binaries - * have been recompiled for other reasons, we can - * change this to nstat-2. Devstat gets this right - * (via convD2M). - */ - /* doesn't fit; just patch the count and return */ - PBIT16((uchar*)dp, r->reply.nstat); - n = BIT16SZ; - }else{ - n = r->reply.nstat; - memmove(dp, r->reply.stat, n); - validstat(dp, n); - mntdirfix(dp, c); - } - poperror(); - mntfree(r); - return n; -} - -static Chan* -mntopencreate(int type, Chan *c, char *name, int omode, ulong perm) -{ - Mnt *m; - Mntrpc *r; - - m = mntchk(c); - r = mntralloc(c, m->msize); - if(waserror()) { - mntfree(r); - nexterror(); - } - r->request.type = type; - r->request.fid = c->fid; - r->request.mode = omode; - if(type == Tcreate){ - r->request.perm = perm; - r->request.name = name; - } - mountrpc(m, r); - - c->qid = r->reply.qid; - c->offset = 0; - c->mode = openmode(omode); - c->iounit = r->reply.iounit; - if(c->iounit == 0 || c->iounit > m->msize-IOHDRSZ) - c->iounit = m->msize-IOHDRSZ; - c->flag |= COPEN; - poperror(); - mntfree(r); - - if(c->flag & CCACHE) - copen(c); - - return c; -} - -static Chan* -mntopen(Chan *c, int omode) -{ - return mntopencreate(Topen, c, nil, omode, 0); -} - -static void -mntcreate(Chan *c, char *name, int omode, ulong perm) -{ - mntopencreate(Tcreate, c, name, omode, perm); -} - -static void -mntclunk(Chan *c, int t) -{ - Mnt *m; - Mntrpc *r; - - m = mntchk(c); - r = mntralloc(c, m->msize); - if(waserror()){ - mntfree(r); - nexterror(); - } - - r->request.type = t; - r->request.fid = c->fid; - mountrpc(m, r); - mntfree(r); - poperror(); -} - -void -muxclose(Mnt *m) -{ - Mntrpc *q, *r; - - for(q = m->queue; q; q = r) { - r = q->list; - mntfree(q); - } - m->id = 0; - free(m->version); - m->version = nil; - mntpntfree(m); -} - -void -mntpntfree(Mnt *m) -{ - Mnt *f, **l; - Queue *q; - - lock(&mntalloc.lk); - l = &mntalloc.list; - for(f = *l; f; f = f->list) { - if(f == m) { - *l = m->list; - break; - } - l = &f->list; - } - m->list = mntalloc.mntfree; - mntalloc.mntfree = m; - q = m->q; - unlock(&mntalloc.lk); - - qfree(q); -} - -static void -mntclose(Chan *c) -{ - mntclunk(c, Tclunk); -} - -static void -mntremove(Chan *c) -{ - mntclunk(c, Tremove); -} - -static int -mntwstat(Chan *c, uchar *dp, int n) -{ - Mnt *m; - Mntrpc *r; - - m = mntchk(c); - r = mntralloc(c, m->msize); - if(waserror()) { - mntfree(r); - nexterror(); - } - r->request.type = Twstat; - r->request.fid = c->fid; - r->request.nstat = n; - r->request.stat = dp; - mountrpc(m, r); - poperror(); - mntfree(r); - return n; -} - -static long -mntread(Chan *c, void *buf, long n, vlong off) -{ - uchar *p, *e; - int nc, cache, isdir, dirlen; - - isdir = 0; - cache = c->flag & CCACHE; - if(c->qid.type & QTDIR) { - cache = 0; - isdir = 1; - } - - p = buf; - if(cache) { - nc = cread(c, buf, n, off); - if(nc > 0) { - n -= nc; - if(n == 0) - return nc; - p += nc; - off += nc; - } - n = mntrdwr(Tread, c, p, n, off); - cupdate(c, p, n, off); - return n + nc; - } - - n = mntrdwr(Tread, c, buf, n, off); - if(isdir) { - for(e = &p[n]; p+BIT16SZ < e; p += dirlen){ - dirlen = BIT16SZ+GBIT16(p); - if(p+dirlen > e) - break; - validstat(p, dirlen); - mntdirfix(p, c); - } - if(p != e) - error(Esbadstat); - } - return n; -} - -static long -mntwrite(Chan *c, void *buf, long n, vlong off) -{ - return mntrdwr(Twrite, c, buf, n, off); -} - -long -mntrdwr(int type, Chan *c, void *buf, long n, vlong off) -{ - Mnt *m; - Mntrpc *r; - char *uba; - int cache; - ulong cnt, nr, nreq; - - m = mntchk(c); - uba = buf; - cnt = 0; - cache = c->flag & CCACHE; - if(c->qid.type & QTDIR) - cache = 0; - for(;;) { - r = mntralloc(c, m->msize); - if(waserror()) { - mntfree(r); - nexterror(); - } - r->request.type = type; - r->request.fid = c->fid; - r->request.offset = off; - r->request.data = uba; - nr = n; - if(nr > m->msize-IOHDRSZ) - nr = m->msize-IOHDRSZ; - r->request.count = nr; - mountrpc(m, r); - nreq = r->request.count; - nr = r->reply.count; - if(nr > nreq) - nr = nreq; - - if(type == Tread) - r->b = bl2mem((uchar*)uba, r->b, nr); - else if(cache) - cwrite(c, (uchar*)uba, nr, off); - - poperror(); - mntfree(r); - off += nr; - uba += nr; - cnt += nr; - n -= nr; - if(nr != nreq || n == 0) - break; - } - return cnt; -} - -void -mountrpc(Mnt *m, Mntrpc *r) -{ - char *sn, *cn; - int t; - - r->reply.tag = 0; - r->reply.type = Tmax; /* can't ever be a valid message type */ - - mountio(m, r); - - t = r->reply.type; - switch(t) { - case Rerror: - error(r->reply.ename); - case Rflush: - error(Eintr); - default: - if(t == r->request.type+1) - break; - sn = "?"; - if(m->c->name != nil) - sn = m->c->name->s; - cn = "?"; - if(r->c != nil && r->c->name != nil) - cn = r->c->name->s; - print("mnt: proc %lud: mismatch from %s %s rep 0x%lux tag %d fid %d T%d R%d rp %d\n", - up->pid, sn, cn, - r, r->request.tag, r->request.fid, r->request.type, - r->reply.type, r->reply.tag); - error(Emountrpc); - } -} - -void -mountio(Mnt *m, Mntrpc *r) -{ - int n; - - while(waserror()) { - if(m->rip == up) - mntgate(m); - if(strcmp(up->errstr, Eintr) != 0){ - mntflushfree(m, r); - nexterror(); - } - r = mntflushalloc(r, m->msize); - } - - lock(&m->lk); - r->m = m; - r->list = m->queue; - m->queue = r; - unlock(&m->lk); - - /* Transmit a file system rpc */ - if(m->msize == 0) - panic("msize"); - n = convS2M(&r->request, r->rpc, m->msize); - if(n < 0) - panic("bad message type in mountio"); - if(devtab[m->c->type]->write(m->c, r->rpc, n, 0) != n) - error(Emountrpc); - r->stime = fastticks(nil); - r->reqlen = n; - - /* Gate readers onto the mount point one at a time */ - for(;;) { - lock(&m->lk); - if(m->rip == 0) - break; - unlock(&m->lk); - sleep(&r->r, rpcattn, r); - if(r->done){ - poperror(); - mntflushfree(m, r); - return; - } - } - m->rip = up; - unlock(&m->lk); - while(r->done == 0) { - if(mntrpcread(m, r) < 0) - error(Emountrpc); - mountmux(m, r); - } - mntgate(m); - poperror(); - mntflushfree(m, r); -} - -static int -doread(Mnt *m, int len) -{ - Block *b; - - while(qlen(m->q) < len){ - b = devtab[m->c->type]->bread(m->c, m->msize, 0); - if(b == nil) - return -1; - if(BLEN(b) == 0){ - freeblist(b); - return -1; - } - qaddlist(m->q, b); - } - return 0; -} - -int -mntrpcread(Mnt *m, Mntrpc *r) -{ - int i, t, len, hlen; - Block *b, **l, *nb; - - r->reply.type = 0; - r->reply.tag = 0; - - /* read at least length, type, and tag and pullup to a single block */ - if(doread(m, BIT32SZ+BIT8SZ+BIT16SZ) < 0) - return -1; - nb = pullupqueue(m->q, BIT32SZ+BIT8SZ+BIT16SZ); - - /* read in the rest of the message, avoid rediculous (for now) message sizes */ - len = GBIT32(nb->rp); - if(len > m->msize){ - qdiscard(m->q, qlen(m->q)); - return -1; - } - if(doread(m, len) < 0) - return -1; - - /* pullup the header (i.e. everything except data) */ - t = nb->rp[BIT32SZ]; - switch(t){ - case Rread: - hlen = BIT32SZ+BIT8SZ+BIT16SZ+BIT32SZ; - break; - default: - hlen = len; - break; - } - nb = pullupqueue(m->q, hlen); - - if(convM2S(nb->rp, len, &r->reply) <= 0){ - /* bad message, dump it */ - print("mntrpcread: convM2S failed\n"); - qdiscard(m->q, len); - return -1; - } - - /* hang the data off of the fcall struct */ - l = &r->b; - *l = nil; - do { - b = qremove(m->q); - if(hlen > 0){ - b->rp += hlen; - len -= hlen; - hlen = 0; - } - i = BLEN(b); - if(i <= len){ - len -= i; - *l = b; - l = &(b->next); - } else { - /* split block and put unused bit back */ - nb = allocb(i-len); - memmove(nb->wp, b->rp+len, i-len); - b->wp = b->rp+len; - nb->wp += i-len; - qputback(m->q, nb); - *l = b; - return 0; - } - }while(len > 0); - - return 0; -} - -void -mntgate(Mnt *m) -{ - Mntrpc *q; - - lock(&m->lk); - m->rip = 0; - for(q = m->queue; q; q = q->list) { - if(q->done == 0) - if(wakeup(&q->r)) - break; - } - unlock(&m->lk); -} - -void -mountmux(Mnt *m, Mntrpc *r) -{ - Mntrpc **l, *q; - - lock(&m->lk); - l = &m->queue; - for(q = *l; q; q = q->list) { - /* look for a reply to a message */ - if(q->request.tag == r->reply.tag) { - *l = q->list; - if(q != r) { - /* - * Completed someone else. - * Trade pointers to receive buffer. - */ - q->reply = r->reply; - q->b = r->b; - r->b = nil; - } - q->done = 1; - unlock(&m->lk); - if(mntstats != 0) - (*mntstats)(q->request.type, - m->c, q->stime, - q->reqlen + r->replen); - if(q != r) - wakeup(&q->r); - return; - } - l = &q->list; - } - unlock(&m->lk); - print("unexpected reply tag %ud; type %d\n", r->reply.tag, r->reply.type); -} - -/* - * Create a new flush request and chain the previous - * requests from it - */ -Mntrpc* -mntflushalloc(Mntrpc *r, ulong iounit) -{ - Mntrpc *fr; - - fr = mntralloc(0, iounit); - - fr->request.type = Tflush; - if(r->request.type == Tflush) - fr->request.oldtag = r->request.oldtag; - else - fr->request.oldtag = r->request.tag; - fr->flushed = r; - - return fr; -} - -/* - * Free a chain of flushes. Remove each unanswered - * flush and the original message from the unanswered - * request queue. Mark the original message as done - * and if it hasn't been answered set the reply to to - * Rflush. - */ -void -mntflushfree(Mnt *m, Mntrpc *r) -{ - Mntrpc *fr; - - while(r){ - fr = r->flushed; - if(!r->done){ - r->reply.type = Rflush; - mntqrm(m, r); - } - if(fr) - mntfree(r); - r = fr; - } -} - -int -alloctag(void) -{ - int i, j; - ulong v; - - for(i = 0; i < NMASK; i++){ - v = mntalloc.tagmask[i]; - if(v == ~0) - continue; - for(j = 0; j < 1<<TAGSHIFT; j++) - if((v & (1<<j)) == 0){ - mntalloc.tagmask[i] |= 1<<j; - return (i<<TAGSHIFT) + j; - } - } - panic("no friggin tags left"); - return NOTAG; -} - -void -freetag(int t) -{ - mntalloc.tagmask[t>>TAGSHIFT] &= ~(1<<(t&TAGMASK)); -} - -Mntrpc* -mntralloc(Chan *c, ulong msize) -{ - Mntrpc *new; - - lock(&mntalloc.lk); - new = mntalloc.rpcfree; - if(new == nil){ - new = malloc(sizeof(Mntrpc)); - if(new == nil) { - unlock(&mntalloc.lk); - exhausted("mount rpc header"); - } - /* - * The header is split from the data buffer as - * mountmux may swap the buffer with another header. - */ - new->rpc = mallocz(msize, 0); - if(new->rpc == nil){ - free(new); - unlock(&mntalloc.lk); - exhausted("mount rpc buffer"); - } - new->rpclen = msize; - new->request.tag = alloctag(); - } - else { - mntalloc.rpcfree = new->list; - mntalloc.nrpcfree--; - if(new->rpclen < msize){ - free(new->rpc); - new->rpc = mallocz(msize, 0); - if(new->rpc == nil){ - free(new); - mntalloc.nrpcused--; - unlock(&mntalloc.lk); - exhausted("mount rpc buffer"); - } - new->rpclen = msize; - } - } - mntalloc.nrpcused++; - unlock(&mntalloc.lk); - new->c = c; - new->done = 0; - new->flushed = nil; - new->b = nil; - return new; -} - -void -mntfree(Mntrpc *r) -{ - if(r->b != nil) - freeblist(r->b); - lock(&mntalloc.lk); - if(mntalloc.nrpcfree >= 10){ - free(r->rpc); - free(r); - freetag(r->request.tag); - } - else{ - r->list = mntalloc.rpcfree; - mntalloc.rpcfree = r; - mntalloc.nrpcfree++; - } - mntalloc.nrpcused--; - unlock(&mntalloc.lk); -} - -void -mntqrm(Mnt *m, Mntrpc *r) -{ - Mntrpc **l, *f; - - lock(&m->lk); - r->done = 1; - - l = &m->queue; - for(f = *l; f; f = f->list) { - if(f == r) { - *l = r->list; - break; - } - l = &f->list; - } - unlock(&m->lk); -} - -Mnt* -mntchk(Chan *c) -{ - Mnt *m; - - /* This routine is mostly vestiges of prior lives; now it's just sanity checking */ - - if(c->mchan == nil) - panic("mntchk 1: nil mchan c %s\n", c2name(c)); - - m = c->mchan->mux; - - if(m == nil) - print("mntchk 2: nil mux c %s c->mchan %s \n", c2name(c), c2name(c->mchan)); - - /* - * Was it closed and reused (was error(Eshutdown); now, it can't happen) - */ - if(m->id == 0 || m->id >= c->dev) - panic("mntchk 3: can't happen"); - - return m; -} - -/* - * Rewrite channel type and dev for in-flight data to - * reflect local values. These entries are known to be - * the first two in the Dir encoding after the count. - */ -void -mntdirfix(uchar *dirbuf, Chan *c) -{ - uint r; - - r = devtab[c->type]->dc; - dirbuf += BIT16SZ; /* skip count */ - PBIT16(dirbuf, r); - dirbuf += BIT16SZ; - PBIT32(dirbuf, c->dev); -} - -int -rpcattn(void *v) -{ - Mntrpc *r; - - r = v; - return r->done || r->m->rip == 0; -} - -Dev mntdevtab = { - 'M', - "mnt", - - mntreset, - devinit, - devshutdown, - mntattach, - mntwalk, - mntstat, - mntopen, - mntcreate, - mntclose, - mntread, - devbread, - mntwrite, - devbwrite, - mntremove, - mntwstat, -}; diff --git a/sys/src/cmd/unix/drawterm/kern/devmouse.c b/sys/src/cmd/unix/drawterm/kern/devmouse.c deleted file mode 100644 index 3ee0c8b6b..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devmouse.c +++ /dev/null @@ -1,237 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "draw.h" -#include "memdraw.h" -#include "screen.h" - -int mousequeue = 1; - -Mouseinfo mouse; -Cursorinfo cursor; - -static int mousechanged(void*); - -enum{ - Qdir, - Qcursor, - Qmouse -}; - -Dirtab mousedir[]={ - ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555, - "cursor", {Qcursor}, 0, 0666, - "mouse", {Qmouse}, 0, 0666, -}; - -#define NMOUSE (sizeof(mousedir)/sizeof(Dirtab)) - -static Chan* -mouseattach(char *spec) -{ - return devattach('m', spec); -} - -static Walkqid* -mousewalk(Chan *c, Chan *nc, char **name, int nname) -{ - return devwalk(c, nc, name, nname, mousedir, NMOUSE, devgen); -} - -static int -mousestat(Chan *c, uchar *db, int n) -{ - return devstat(c, db, n, mousedir, NMOUSE, devgen); -} - -static Chan* -mouseopen(Chan *c, int omode) -{ - switch((long)c->qid.path){ - case Qdir: - if(omode != OREAD) - error(Eperm); - break; - case Qmouse: - lock(&mouse.lk); - if(mouse.open){ - unlock(&mouse.lk); - error(Einuse); - } - mouse.open = 1; - unlock(&mouse.lk); - break; - } - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - return c; -} - -void -mouseclose(Chan *c) -{ - if(!(c->flag&COPEN)) - return; - - switch((long)c->qid.path) { - case Qmouse: - lock(&mouse.lk); - mouse.open = 0; - unlock(&mouse.lk); - cursorarrow(); - } -} - - -long -mouseread(Chan *c, void *va, long n, vlong offset) -{ - char buf[4*12+1]; - uchar *p; - int i, nn; - ulong msec; -/* static int map[8] = {0, 4, 2, 6, 1, 5, 3, 7 }; */ - - p = va; - switch((long)c->qid.path){ - case Qdir: - return devdirread(c, va, n, mousedir, NMOUSE, devgen); - - case Qcursor: - if(offset != 0) - return 0; - if(n < 2*4+2*2*16) - error(Eshort); - n = 2*4+2*2*16; - lock(&cursor.lk); - BPLONG(p+0, cursor.offset.x); - BPLONG(p+4, cursor.offset.y); - memmove(p+8, cursor.clr, 2*16); - memmove(p+40, cursor.set, 2*16); - unlock(&cursor.lk); - return n; - - case Qmouse: - while(mousechanged(0) == 0) - sleep(&mouse.r, mousechanged, 0); - - lock(&screen.lk); - if(screen.reshaped) { - screen.reshaped = 0; - sprint(buf, "t%11d %11d", 0, ticks()); - if(n > 1+2*12) - n = 1+2*12; - memmove(va, buf, n); - unlock(&screen.lk); - return n; - } - unlock(&screen.lk); - - lock(&mouse.lk); - i = mouse.ri; - nn = (mouse.wi + Mousequeue - i) % Mousequeue; - if(nn < 1) - panic("empty mouse queue"); - msec = ticks(); - while(nn > 1) { - if(mouse.queue[i].msec + Mousewindow > msec) - break; - i = (i+1)%Mousequeue; - nn--; - } - sprint(buf, "m%11d %11d %11d %11d", - mouse.queue[i].xy.x, - mouse.queue[i].xy.y, - mouse.queue[i].buttons, - mouse.queue[i].msec); - mouse.ri = (i+1)%Mousequeue; - unlock(&mouse.lk); - if(n > 1+4*12) - n = 1+4*12; - memmove(va, buf, n); - return n; - } - return 0; -} - -long -mousewrite(Chan *c, void *va, long n, vlong offset) -{ - char *p; - Point pt; - char buf[64]; - - USED(offset); - - p = va; - switch((long)c->qid.path){ - case Qdir: - error(Eisdir); - - case Qcursor: - if(n < 2*4+2*2*16){ - cursorarrow(); - }else{ - n = 2*4+2*2*16; - lock(&cursor.lk); - cursor.offset.x = BGLONG(p+0); - cursor.offset.y = BGLONG(p+4); - memmove(cursor.clr, p+8, 2*16); - memmove(cursor.set, p+40, 2*16); - unlock(&cursor.lk); - setcursor(); - } - return n; - - case Qmouse: - if(n > sizeof buf-1) - n = sizeof buf -1; - memmove(buf, va, n); - buf[n] = 0; - p = 0; - pt.x = strtoul(buf+1, &p, 0); - if(p == 0) - error(Eshort); - pt.y = strtoul(p, 0, 0); - if(ptinrect(pt, gscreen->r)) - mouseset(pt); - return n; - } - - error(Egreg); - return -1; -} - -int -mousechanged(void *a) -{ - USED(a); - - return mouse.ri != mouse.wi || screen.reshaped; -} - -Dev mousedevtab = { - 'm', - "mouse", - - devreset, - devinit, - devshutdown, - mouseattach, - mousewalk, - mousestat, - mouseopen, - devcreate, - mouseclose, - mouseread, - devbread, - mousewrite, - devbwrite, - devremove, - devwstat, -}; - diff --git a/sys/src/cmd/unix/drawterm/kern/devpipe.c b/sys/src/cmd/unix/drawterm/kern/devpipe.c deleted file mode 100644 index 73401f99f..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devpipe.c +++ /dev/null @@ -1,398 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "netif.h" - -typedef struct Pipe Pipe; -struct Pipe -{ - QLock lk; - Pipe *next; - int ref; - ulong path; - Queue *q[2]; - int qref[2]; -}; - -struct -{ - Lock lk; - ulong path; -} pipealloc; - -enum -{ - Qdir, - Qdata0, - Qdata1, -}; - -Dirtab pipedir[] = -{ - ".", {Qdir,0,QTDIR}, 0, DMDIR|0500, - "data", {Qdata0}, 0, 0600, - "data1", {Qdata1}, 0, 0600, -}; -#define NPIPEDIR 3 - -static void -pipeinit(void) -{ - if(conf.pipeqsize == 0){ - if(conf.nmach > 1) - conf.pipeqsize = 256*1024; - else - conf.pipeqsize = 32*1024; - } -} - -/* - * create a pipe, no streams are created until an open - */ -static Chan* -pipeattach(char *spec) -{ - Pipe *p; - Chan *c; - - c = devattach('|', spec); - p = malloc(sizeof(Pipe)); - if(p == 0) - exhausted("memory"); - p->ref = 1; - - p->q[0] = qopen(conf.pipeqsize, 0, 0, 0); - if(p->q[0] == 0){ - free(p); - exhausted("memory"); - } - p->q[1] = qopen(conf.pipeqsize, 0, 0, 0); - if(p->q[1] == 0){ - free(p->q[0]); - free(p); - exhausted("memory"); - } - - lock(&pipealloc.lk); - p->path = ++pipealloc.path; - unlock(&pipealloc.lk); - - mkqid(&c->qid, NETQID(2*p->path, Qdir), 0, QTDIR); - c->aux = p; - c->dev = 0; - return c; -} - -static int -pipegen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp) -{ - Qid q; - int len; - Pipe *p; - - USED(name); - - if(i == DEVDOTDOT){ - devdir(c, c->qid, "#|", 0, eve, DMDIR|0555, dp); - return 1; - } - i++; /* skip . */ - if(tab==0 || i>=ntab) - return -1; - - tab += i; - p = c->aux; - switch((ulong)tab->qid.path){ - case Qdata0: - len = qlen(p->q[0]); - break; - case Qdata1: - len = qlen(p->q[1]); - break; - default: - len = tab->length; - break; - } - mkqid(&q, NETQID(NETID(c->qid.path), tab->qid.path), 0, QTFILE); - devdir(c, q, tab->name, len, eve, tab->perm, dp); - return 1; -} - - -static Walkqid* -pipewalk(Chan *c, Chan *nc, char **name, int nname) -{ - Walkqid *wq; - Pipe *p; - - wq = devwalk(c, nc, name, nname, pipedir, NPIPEDIR, pipegen); - if(wq != nil && wq->clone != nil && wq->clone != c){ - p = c->aux; - qlock(&p->lk); - p->ref++; - if(c->flag & COPEN){ - print("channel open in pipewalk\n"); - switch(NETTYPE(c->qid.path)){ - case Qdata0: - p->qref[0]++; - break; - case Qdata1: - p->qref[1]++; - break; - } - } - qunlock(&p->lk); - } - return wq; -} - -static int -pipestat(Chan *c, uchar *db, int n) -{ - Pipe *p; - Dir dir; - - p = c->aux; - - switch(NETTYPE(c->qid.path)){ - case Qdir: - devdir(c, c->qid, ".", 0, eve, DMDIR|0555, &dir); - break; - case Qdata0: - devdir(c, c->qid, "data", qlen(p->q[0]), eve, 0600, &dir); - break; - case Qdata1: - devdir(c, c->qid, "data1", qlen(p->q[1]), eve, 0600, &dir); - break; - default: - panic("pipestat"); - } - n = convD2M(&dir, db, n); - if(n < BIT16SZ) - error(Eshortstat); - return n; -} - -/* - * if the stream doesn't exist, create it - */ -static Chan* -pipeopen(Chan *c, int omode) -{ - Pipe *p; - - if(c->qid.type & QTDIR){ - if(omode != OREAD) - error(Ebadarg); - c->mode = omode; - c->flag |= COPEN; - c->offset = 0; - return c; - } - - p = c->aux; - qlock(&p->lk); - switch(NETTYPE(c->qid.path)){ - case Qdata0: - p->qref[0]++; - break; - case Qdata1: - p->qref[1]++; - break; - } - qunlock(&p->lk); - - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - c->iounit = qiomaxatomic; - return c; -} - -static void -pipeclose(Chan *c) -{ - Pipe *p; - - p = c->aux; - qlock(&p->lk); - - if(c->flag & COPEN){ - /* - * closing either side hangs up the stream - */ - switch(NETTYPE(c->qid.path)){ - case Qdata0: - p->qref[0]--; - if(p->qref[0] == 0){ - qhangup(p->q[1], 0); - qclose(p->q[0]); - } - break; - case Qdata1: - p->qref[1]--; - if(p->qref[1] == 0){ - qhangup(p->q[0], 0); - qclose(p->q[1]); - } - break; - } - } - - - /* - * if both sides are closed, they are reusable - */ - if(p->qref[0] == 0 && p->qref[1] == 0){ - qreopen(p->q[0]); - qreopen(p->q[1]); - } - - /* - * free the structure on last close - */ - p->ref--; - if(p->ref == 0){ - qunlock(&p->lk); - free(p->q[0]); - free(p->q[1]); - free(p); - } else - qunlock(&p->lk); -} - -static long -piperead(Chan *c, void *va, long n, vlong offset) -{ - Pipe *p; - - USED(offset); - - p = c->aux; - - switch(NETTYPE(c->qid.path)){ - case Qdir: - return devdirread(c, va, n, pipedir, NPIPEDIR, pipegen); - case Qdata0: - return qread(p->q[0], va, n); - case Qdata1: - return qread(p->q[1], va, n); - default: - panic("piperead"); - } - return -1; /* not reached */ -} - -static Block* -pipebread(Chan *c, long n, ulong offset) -{ - Pipe *p; - - p = c->aux; - - switch(NETTYPE(c->qid.path)){ - case Qdata0: - return qbread(p->q[0], n); - case Qdata1: - return qbread(p->q[1], n); - } - - return devbread(c, n, offset); -} - -/* - * a write to a closed pipe causes a note to be sent to - * the process. - */ -static long -pipewrite(Chan *c, void *va, long n, vlong offset) -{ - Pipe *p; - - USED(offset); - if(!islo()) - print("pipewrite hi %lux\n", getcallerpc(&c)); - - if(waserror()) { - /* avoid notes when pipe is a mounted queue */ - if((c->flag & CMSG) == 0) - postnote(up, 1, "sys: write on closed pipe", NUser); - nexterror(); - } - - p = c->aux; - - switch(NETTYPE(c->qid.path)){ - case Qdata0: - n = qwrite(p->q[1], va, n); - break; - - case Qdata1: - n = qwrite(p->q[0], va, n); - break; - - default: - panic("pipewrite"); - } - - poperror(); - return n; -} - -static long -pipebwrite(Chan *c, Block *bp, ulong offset) -{ - long n; - Pipe *p; - - USED(offset); - - if(waserror()) { - /* avoid notes when pipe is a mounted queue */ - if((c->flag & CMSG) == 0) - postnote(up, 1, "sys: write on closed pipe", NUser); - nexterror(); - } - - p = c->aux; - switch(NETTYPE(c->qid.path)){ - case Qdata0: - n = qbwrite(p->q[1], bp); - break; - - case Qdata1: - n = qbwrite(p->q[0], bp); - break; - - default: - n = 0; - panic("pipebwrite"); - } - - poperror(); - return n; -} - -Dev pipedevtab = { - '|', - "pipe", - - devreset, - pipeinit, - devshutdown, - pipeattach, - pipewalk, - pipestat, - pipeopen, - devcreate, - pipeclose, - piperead, - pipebread, - pipewrite, - pipebwrite, - devremove, - devwstat, -}; diff --git a/sys/src/cmd/unix/drawterm/kern/devroot.c b/sys/src/cmd/unix/drawterm/kern/devroot.c deleted file mode 100644 index db081ff1f..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devroot.c +++ /dev/null @@ -1,299 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -enum -{ - Qdir = 0, - Qboot = 0x1000, - Qmnt = 0x2000, - Qfactotum, - - Nrootfiles = 32, - Nbootfiles = 32, - Nmntfiles = 2, -}; - -typedef struct Dirlist Dirlist; -struct Dirlist -{ - uint base; - Dirtab *dir; - uchar **data; - int ndir; - int mdir; -}; - -static Dirtab rootdir[Nrootfiles] = { - "#/", {Qdir, 0, QTDIR}, 0, DMDIR|0555, - "boot", {Qboot, 0, QTDIR}, 0, DMDIR|0555, - "mnt", {Qmnt, 0, QTDIR}, 0, DMDIR|0555, -}; -static uchar *rootdata[Nrootfiles]; -static Dirlist rootlist = -{ - 0, - rootdir, - rootdata, - 3, - Nrootfiles -}; - -static Dirtab bootdir[Nbootfiles] = { - "boot", {Qboot, 0, QTDIR}, 0, DMDIR|0555, -}; -static uchar *bootdata[Nbootfiles]; -static Dirlist bootlist = -{ - Qboot, - bootdir, - bootdata, - 1, - Nbootfiles -}; - -static uchar *mntdata[Nmntfiles]; -static Dirtab mntdir[Nmntfiles] = { - "mnt", {Qmnt, 0, QTDIR}, 0, DMDIR|0555, - "factotum", {Qfactotum, 0, QTDIR}, 0, DMDIR|0555, -}; -static Dirlist mntlist = -{ - Qmnt, - mntdir, - mntdata, - 2, - Nmntfiles -}; - -/* - * add a file to the list - */ -static void -addlist(Dirlist *l, char *name, uchar *contents, ulong len, int perm) -{ - Dirtab *d; - - if(l->ndir >= l->mdir) - panic("too many root files"); - l->data[l->ndir] = contents; - d = &l->dir[l->ndir]; - strcpy(d->name, name); - d->length = len; - d->perm = perm; - d->qid.type = 0; - d->qid.vers = 0; - d->qid.path = ++l->ndir + l->base; - if(perm & DMDIR) - d->qid.type |= QTDIR; -} - -/* - * add a root file - */ -void -addbootfile(char *name, uchar *contents, ulong len) -{ - addlist(&bootlist, name, contents, len, 0555); -} - -/* - * add a root directory - */ -static void -addrootdir(char *name) -{ - addlist(&rootlist, name, nil, 0, DMDIR|0555); -} - -static void -rootreset(void) -{ - addrootdir("bin"); - addrootdir("dev"); - addrootdir("env"); - addrootdir("fd"); - addrootdir("net"); - addrootdir("net.alt"); - addrootdir("proc"); - addrootdir("root"); - addrootdir("srv"); -} - -static Chan* -rootattach(char *spec) -{ - return devattach('/', spec); -} - -static int -rootgen(Chan *c, char *name, Dirtab *dirt, int ndirt, int s, Dir *dp) -{ - int t; - Dirtab *d; - Dirlist *l; - - USED(dirt); - USED(ndirt); - - switch((int)c->qid.path){ - case Qdir: - if(s == DEVDOTDOT){ - Qid tqiddir = {Qdir, 0, QTDIR}; - devdir(c, tqiddir, "#/", 0, eve, 0555, dp); - return 1; - } - return devgen(c, name, rootlist.dir, rootlist.ndir, s, dp); - case Qmnt: - if(s == DEVDOTDOT){ - Qid tqiddir = {Qdir, 0, QTDIR}; - devdir(c, tqiddir, "#/", 0, eve, 0555, dp); - return 1; - } - return devgen(c, name, mntlist.dir, mntlist.ndir, s, dp); - case Qboot: - if(s == DEVDOTDOT){ - Qid tqiddir = {Qdir, 0, QTDIR}; - devdir(c, tqiddir, "#/", 0, eve, 0555, dp); - return 1; - } - return devgen(c, name, bootlist.dir, bootlist.ndir, s, dp); - default: - if(s == DEVDOTDOT){ - Qid tqiddir = {Qdir, 0, QTDIR}; - tqiddir.path = c->qid.path&0xF000; - devdir(c, tqiddir, "#/", 0, eve, 0555, dp); - return 1; - } - if(s != 0) - return -1; - switch((int)c->qid.path & 0xF000){ - case Qdir: - t = c->qid.path-1; - l = &rootlist; - break; - case Qboot: - t = c->qid.path - Qboot - 1; - l = &bootlist; - break; - case Qmnt: - t = c->qid.path - Qmnt - 1; - l = &mntlist; - break; - default: - return -1; - } - if(t >= l->ndir) - return -1; -if(t < 0){ -print("rootgen %llud %d %d\n", c->qid.path, s, t); -panic("whoops"); -} - d = &l->dir[t]; - devdir(c, d->qid, d->name, d->length, eve, d->perm, dp); - return 1; - } - return -1; -} - -static Walkqid* -rootwalk(Chan *c, Chan *nc, char **name, int nname) -{ - return devwalk(c, nc, name, nname, nil, 0, rootgen); -} - -static int -rootstat(Chan *c, uchar *dp, int n) -{ - return devstat(c, dp, n, nil, 0, rootgen); -} - -static Chan* -rootopen(Chan *c, int omode) -{ - return devopen(c, omode, nil, 0, devgen); -} - -/* - * sysremove() knows this is a nop - */ -static void -rootclose(Chan *c) -{ - USED(c); -} - -static long -rootread(Chan *c, void *buf, long n, vlong off) -{ - ulong t; - Dirtab *d; - Dirlist *l; - uchar *data; - ulong offset = off; - - t = c->qid.path; - switch(t){ - case Qdir: - case Qboot: - case Qmnt: - return devdirread(c, buf, n, nil, 0, rootgen); - } - - if(t&Qboot) - l = &bootlist; - else if(t&Qmnt) - l = &mntlist; - else - l = &bootlist; - t &= 0xFFF; - t--; - - if(t >= l->ndir) - error(Egreg); - - d = &l->dir[t]; - data = l->data[t]; - if(offset >= d->length) - return 0; - if(offset+n > d->length) - n = d->length - offset; - memmove(buf, data+offset, n); - return n; -} - -static long -rootwrite(Chan *c, void *v, long n, vlong o) -{ - USED(c); - USED(v); - USED(n); - USED(o); - - error(Egreg); - return 0; -} - -Dev rootdevtab = { - '/', - "root", - - rootreset, - devinit, - devshutdown, - rootattach, - rootwalk, - rootstat, - rootopen, - devcreate, - rootclose, - rootread, - devbread, - rootwrite, - devbwrite, - devremove, - devwstat, -}; - diff --git a/sys/src/cmd/unix/drawterm/kern/devssl.c b/sys/src/cmd/unix/drawterm/kern/devssl.c deleted file mode 100644 index 3ad021f9f..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devssl.c +++ /dev/null @@ -1,1517 +0,0 @@ -/* - * devssl - secure sockets layer - */ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "libsec.h" - -#define NOSPOOKS 1 - -typedef struct OneWay OneWay; -struct OneWay -{ - QLock q; - QLock ctlq; - - void *state; /* encryption state */ - int slen; /* hash data length */ - uchar *secret; /* secret */ - ulong mid; /* message id */ -}; - -enum -{ - /* connection states */ - Sincomplete= 0, - Sclear= 1, - Sencrypting= 2, - Sdigesting= 4, - Sdigenc= Sencrypting|Sdigesting, - - /* encryption algorithms */ - Noencryption= 0, - DESCBC= 1, - DESECB= 2, - RC4= 3 -}; - -typedef struct Dstate Dstate; -struct Dstate -{ - Chan *c; /* io channel */ - uchar state; /* state of connection */ - int ref; /* serialized by dslock for atomic destroy */ - - uchar encryptalg; /* encryption algorithm */ - ushort blocklen; /* blocking length */ - - ushort diglen; /* length of digest */ - DigestState *(*hf)(uchar*, ulong, uchar*, DigestState*); /* hash func */ - - /* for SSL format */ - int max; /* maximum unpadded data per msg */ - int maxpad; /* maximum padded data per msg */ - - /* input side */ - OneWay in; - Block *processed; - Block *unprocessed; - - /* output side */ - OneWay out; - - /* protections */ - char *user; - int perm; -}; - -enum -{ - Maxdmsg= 1<<16, - Maxdstate= 128, /* must be a power of 2 */ -}; - -Lock dslock; -int dshiwat; -char *dsname[Maxdstate]; -Dstate *dstate[Maxdstate]; -char *encalgs; -char *hashalgs; - -enum{ - Qtopdir = 1, /* top level directory */ - Qprotodir, - Qclonus, - Qconvdir, /* directory for a conversation */ - Qdata, - Qctl, - Qsecretin, - Qsecretout, - Qencalgs, - Qhashalgs, -}; - -#define TYPE(x) ((x).path & 0xf) -#define CONV(x) (((x).path >> 5)&(Maxdstate-1)) -#define QID(c, y) (((c)<<5) | (y)) - -static void ensure(Dstate*, Block**, int); -static void consume(Block**, uchar*, int); -static void setsecret(OneWay*, uchar*, int); -static Block* encryptb(Dstate*, Block*, int); -static Block* decryptb(Dstate*, Block*); -static Block* digestb(Dstate*, Block*, int); -static void checkdigestb(Dstate*, Block*); -static Chan* buftochan(char*); -static void sslhangup(Dstate*); -static Dstate* dsclone(Chan *c); -static void dsnew(Chan *c, Dstate **); -static long sslput(Dstate *s, Block * volatile b); - -char *sslnames[] = { - /* unused */ 0, - /* topdir */ 0, - /* protodir */ 0, - "clone", - /* convdir */ 0, - "data", - "ctl", - "secretin", - "secretout", - "encalgs", - "hashalgs", -}; - -static int -sslgen(Chan *c, char *n, Dirtab *d, int nd, int s, Dir *dp) -{ - Qid q; - Dstate *ds; - char name[16], *p, *nm; - int ft; - - USED(n); - USED(nd); - USED(d); - - q.type = QTFILE; - q.vers = 0; - - ft = TYPE(c->qid); - switch(ft) { - case Qtopdir: - if(s == DEVDOTDOT){ - q.path = QID(0, Qtopdir); - q.type = QTDIR; - devdir(c, q, "#D", 0, eve, 0555, dp); - return 1; - } - if(s > 0) - return -1; - q.path = QID(0, Qprotodir); - q.type = QTDIR; - devdir(c, q, "ssl", 0, eve, 0555, dp); - return 1; - case Qprotodir: - if(s == DEVDOTDOT){ - q.path = QID(0, Qtopdir); - q.type = QTDIR; - devdir(c, q, ".", 0, eve, 0555, dp); - return 1; - } - if(s < dshiwat) { - q.path = QID(s, Qconvdir); - q.type = QTDIR; - ds = dstate[s]; - if(ds != 0) - nm = ds->user; - else - nm = eve; - if(dsname[s] == nil){ - sprint(name, "%d", s); - kstrdup(&dsname[s], name); - } - devdir(c, q, dsname[s], 0, nm, 0555, dp); - return 1; - } - if(s > dshiwat) - return -1; - q.path = QID(0, Qclonus); - devdir(c, q, "clone", 0, eve, 0555, dp); - return 1; - case Qconvdir: - if(s == DEVDOTDOT){ - q.path = QID(0, Qprotodir); - q.type = QTDIR; - devdir(c, q, "ssl", 0, eve, 0555, dp); - return 1; - } - ds = dstate[CONV(c->qid)]; - if(ds != 0) - nm = ds->user; - else - nm = eve; - switch(s) { - default: - return -1; - case 0: - q.path = QID(CONV(c->qid), Qctl); - p = "ctl"; - break; - case 1: - q.path = QID(CONV(c->qid), Qdata); - p = "data"; - break; - case 2: - q.path = QID(CONV(c->qid), Qsecretin); - p = "secretin"; - break; - case 3: - q.path = QID(CONV(c->qid), Qsecretout); - p = "secretout"; - break; - case 4: - q.path = QID(CONV(c->qid), Qencalgs); - p = "encalgs"; - break; - case 5: - q.path = QID(CONV(c->qid), Qhashalgs); - p = "hashalgs"; - break; - } - devdir(c, q, p, 0, nm, 0660, dp); - return 1; - case Qclonus: - devdir(c, c->qid, sslnames[TYPE(c->qid)], 0, eve, 0555, dp); - return 1; - default: - ds = dstate[CONV(c->qid)]; - if(ds != 0) - nm = ds->user; - else - nm = eve; - devdir(c, c->qid, sslnames[TYPE(c->qid)], 0, nm, 0660, dp); - return 1; - } - return -1; -} - -static Chan* -sslattach(char *spec) -{ - Chan *c; - - c = devattach('D', spec); - c->qid.path = QID(0, Qtopdir); - c->qid.vers = 0; - c->qid.type = QTDIR; - return c; -} - -static Walkqid* -sslwalk(Chan *c, Chan *nc, char **name, int nname) -{ - return devwalk(c, nc, name, nname, nil, 0, sslgen); -} - -static int -sslstat(Chan *c, uchar *db, int n) -{ - return devstat(c, db, n, nil, 0, sslgen); -} - -static Chan* -sslopen(Chan *c, int omode) -{ - Dstate *s, **pp; - int perm; - int ft; - - perm = 0; - omode &= 3; - switch(omode) { - case OREAD: - perm = 4; - break; - case OWRITE: - perm = 2; - break; - case ORDWR: - perm = 6; - break; - } - - ft = TYPE(c->qid); - switch(ft) { - default: - panic("sslopen"); - case Qtopdir: - case Qprotodir: - case Qconvdir: - if(omode != OREAD) - error(Eperm); - break; - case Qclonus: - s = dsclone(c); - if(s == 0) - error(Enodev); - break; - case Qctl: - case Qdata: - case Qsecretin: - case Qsecretout: - if(waserror()) { - unlock(&dslock); - nexterror(); - } - lock(&dslock); - pp = &dstate[CONV(c->qid)]; - s = *pp; - if(s == 0) - dsnew(c, pp); - else { - if((perm & (s->perm>>6)) != perm - && (strcmp(up->user, s->user) != 0 - || (perm & s->perm) != perm)) - error(Eperm); - - s->ref++; - } - unlock(&dslock); - poperror(); - break; - case Qencalgs: - case Qhashalgs: - if(omode != OREAD) - error(Eperm); - break; - } - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - return c; -} - -static int -sslwstat(Chan *c, uchar *db, int n) -{ - Dir *dir; - Dstate *s; - int m; - - s = dstate[CONV(c->qid)]; - if(s == 0) - error(Ebadusefd); - if(strcmp(s->user, up->user) != 0) - error(Eperm); - - dir = smalloc(sizeof(Dir)+n); - m = convM2D(db, n, &dir[0], (char*)&dir[1]); - if(m == 0){ - free(dir); - error(Eshortstat); - } - - if(!emptystr(dir->uid)) - kstrdup(&s->user, dir->uid); - if(dir->mode != ~0) - s->perm = dir->mode; - - free(dir); - return m; -} - -static void -sslclose(Chan *c) -{ - Dstate *s; - int ft; - - ft = TYPE(c->qid); - switch(ft) { - case Qctl: - case Qdata: - case Qsecretin: - case Qsecretout: - if((c->flag & COPEN) == 0) - break; - - s = dstate[CONV(c->qid)]; - if(s == 0) - break; - - lock(&dslock); - if(--s->ref > 0) { - unlock(&dslock); - break; - } - dstate[CONV(c->qid)] = 0; - unlock(&dslock); - - if(s->user != nil) - free(s->user); - sslhangup(s); - if(s->c) - cclose(s->c); - if(s->in.secret) - free(s->in.secret); - if(s->out.secret) - free(s->out.secret); - if(s->in.state) - free(s->in.state); - if(s->out.state) - free(s->out.state); - free(s); - - } -} - -/* - * make sure we have at least 'n' bytes in list 'l' - */ -static void -ensure(Dstate *s, Block **l, int n) -{ - int sofar, i; - Block *b, *bl; - - sofar = 0; - for(b = *l; b; b = b->next){ - sofar += BLEN(b); - if(sofar >= n) - return; - l = &b->next; - } - - while(sofar < n){ - bl = devtab[s->c->type]->bread(s->c, Maxdmsg, 0); - if(bl == 0) - nexterror(); - *l = bl; - i = 0; - for(b = bl; b; b = b->next){ - i += BLEN(b); - l = &b->next; - } - if(i == 0) - error(Ehungup); - sofar += i; - } -} - -/* - * copy 'n' bytes from 'l' into 'p' and free - * the bytes in 'l' - */ -static void -consume(Block **l, uchar *p, int n) -{ - Block *b; - int i; - - for(; *l && n > 0; n -= i){ - b = *l; - i = BLEN(b); - if(i > n) - i = n; - memmove(p, b->rp, i); - b->rp += i; - p += i; - if(BLEN(b) < 0) - panic("consume"); - if(BLEN(b)) - break; - *l = b->next; - freeb(b); - } -} - -/* - * give back n bytes -static void -regurgitate(Dstate *s, uchar *p, int n) -{ - Block *b; - - if(n <= 0) - return; - b = s->unprocessed; - if(s->unprocessed == nil || b->rp - b->base < n) { - b = allocb(n); - memmove(b->wp, p, n); - b->wp += n; - b->next = s->unprocessed; - s->unprocessed = b; - } else { - b->rp -= n; - memmove(b->rp, p, n); - } -} - */ - -/* - * remove at most n bytes from the queue, if discard is set - * dump the remainder - */ -static Block* -qtake(Block **l, int n, int discard) -{ - Block *nb, *b, *first; - int i; - - first = *l; - for(b = first; b; b = b->next){ - i = BLEN(b); - if(i == n){ - if(discard){ - freeblist(b->next); - *l = 0; - } else - *l = b->next; - b->next = 0; - return first; - } else if(i > n){ - i -= n; - if(discard){ - freeblist(b->next); - b->wp -= i; - *l = 0; - } else { - nb = allocb(i); - memmove(nb->wp, b->rp+n, i); - nb->wp += i; - b->wp -= i; - nb->next = b->next; - *l = nb; - } - b->next = 0; - if(BLEN(b) < 0) - panic("qtake"); - return first; - } else - n -= i; - if(BLEN(b) < 0) - panic("qtake"); - } - *l = 0; - return first; -} - -/* - * We can't let Eintr's lose data since the program - * doing the read may be able to handle it. The only - * places Eintr is possible is during the read's in consume. - * Therefore, we make sure we can always put back the bytes - * consumed before the last ensure. - */ -static Block* -sslbread(Chan *c, long n, ulong o) -{ - Dstate * volatile s; - Block *b; - uchar consumed[3], *p; - int toconsume; - int len, pad; - - USED(o); - s = dstate[CONV(c->qid)]; - if(s == 0) - panic("sslbread"); - if(s->state == Sincomplete) - error(Ebadusefd); - - qlock(&s->in.q); - if(waserror()){ - qunlock(&s->in.q); - nexterror(); - } - - if(s->processed == 0){ - /* - * Read in the whole message. Until we've got it all, - * it stays on s->unprocessed, so that if we get Eintr, - * we'll pick up where we left off. - */ - ensure(s, &s->unprocessed, 3); - s->unprocessed = pullupblock(s->unprocessed, 2); - p = s->unprocessed->rp; - if(p[0] & 0x80){ - len = ((p[0] & 0x7f)<<8) | p[1]; - ensure(s, &s->unprocessed, len); - pad = 0; - toconsume = 2; - } else { - s->unprocessed = pullupblock(s->unprocessed, 3); - len = ((p[0] & 0x3f)<<8) | p[1]; - pad = p[2]; - if(pad > len){ - print("pad %d buf len %d\n", pad, len); - error("bad pad in ssl message"); - } - toconsume = 3; - } - ensure(s, &s->unprocessed, toconsume+len); - - /* skip header */ - consume(&s->unprocessed, consumed, toconsume); - - /* grab the next message and decode/decrypt it */ - b = qtake(&s->unprocessed, len, 0); - - if(blocklen(b) != len) - print("devssl: sslbread got wrong count %d != %d", blocklen(b), len); - - if(waserror()){ - qunlock(&s->in.ctlq); - if(b != nil) - freeb(b); - nexterror(); - } - qlock(&s->in.ctlq); - switch(s->state){ - case Sencrypting: - if(b == nil) - error("ssl message too short (encrypting)"); - b = decryptb(s, b); - break; - case Sdigesting: - b = pullupblock(b, s->diglen); - if(b == nil) - error("ssl message too short (digesting)"); - checkdigestb(s, b); - pullblock(&b, s->diglen); - len -= s->diglen; - break; - case Sdigenc: - b = decryptb(s, b); - b = pullupblock(b, s->diglen); - if(b == nil) - error("ssl message too short (dig+enc)"); - checkdigestb(s, b); - pullblock(&b, s->diglen); - len -= s->diglen; - break; - } - - /* remove pad */ - if(pad) - s->processed = qtake(&b, len - pad, 1); - else - s->processed = b; - b = nil; - s->in.mid++; - qunlock(&s->in.ctlq); - poperror(); - } - - /* return at most what was asked for */ - b = qtake(&s->processed, n, 0); - - qunlock(&s->in.q); - poperror(); - - return b; -} - -static long -sslread(Chan *c, void *a, long n, vlong off) -{ - Block * volatile b; - Block *nb; - uchar *va; - int i; - char buf[128]; - ulong offset = off; - int ft; - - if(c->qid.type & QTDIR) - return devdirread(c, a, n, 0, 0, sslgen); - - ft = TYPE(c->qid); - switch(ft) { - default: - error(Ebadusefd); - case Qctl: - ft = CONV(c->qid); - sprint(buf, "%d", ft); - return readstr(offset, a, n, buf); - case Qdata: - b = sslbread(c, n, offset); - break; - case Qencalgs: - return readstr(offset, a, n, encalgs); - break; - case Qhashalgs: - return readstr(offset, a, n, hashalgs); - break; - } - - if(waserror()){ - freeblist(b); - nexterror(); - } - - n = 0; - va = a; - for(nb = b; nb; nb = nb->next){ - i = BLEN(nb); - memmove(va+n, nb->rp, i); - n += i; - } - - freeblist(b); - poperror(); - - return n; -} - -/* - * this algorithm doesn't have to be great since we're just - * trying to obscure the block fill - */ -static void -randfill(uchar *buf, int len) -{ - while(len-- > 0) - *buf++ = fastrand(); -} - -static long -sslbwrite(Chan *c, Block *b, ulong o) -{ - Dstate * volatile s; - long rv; - - USED(o); - s = dstate[CONV(c->qid)]; - if(s == nil) - panic("sslbwrite"); - - if(s->state == Sincomplete){ - freeb(b); - error(Ebadusefd); - } - - /* lock so split writes won't interleave */ - if(waserror()){ - qunlock(&s->out.q); - nexterror(); - } - qlock(&s->out.q); - - rv = sslput(s, b); - - poperror(); - qunlock(&s->out.q); - - return rv; -} - -/* - * use SSL record format, add in count, digest and/or encrypt. - * the write is interruptable. if it is interrupted, we'll - * get out of sync with the far side. not much we can do about - * it since we don't know if any bytes have been written. - */ -static long -sslput(Dstate *s, Block * volatile b) -{ - Block *nb; - int h, n, m, pad, rv; - uchar *p; - int offset; - - if(waserror()){ -iprint("error: %s\n", up->errstr); - if(b != nil) - free(b); - nexterror(); - } - - rv = 0; - while(b != nil){ - m = n = BLEN(b); - h = s->diglen + 2; - - /* trim to maximum block size */ - pad = 0; - if(m > s->max){ - m = s->max; - } else if(s->blocklen != 1){ - pad = (m + s->diglen)%s->blocklen; - if(pad){ - if(m > s->maxpad){ - pad = 0; - m = s->maxpad; - } else { - pad = s->blocklen - pad; - h++; - } - } - } - - rv += m; - if(m != n){ - nb = allocb(m + h + pad); - memmove(nb->wp + h, b->rp, m); - nb->wp += m + h; - b->rp += m; - } else { - /* add header space */ - nb = padblock(b, h); - b = 0; - } - m += s->diglen; - - /* SSL style count */ - if(pad){ - nb = padblock(nb, -pad); - randfill(nb->wp, pad); - nb->wp += pad; - m += pad; - - p = nb->rp; - p[0] = (m>>8); - p[1] = m; - p[2] = pad; - offset = 3; - } else { - p = nb->rp; - p[0] = (m>>8) | 0x80; - p[1] = m; - offset = 2; - } - - switch(s->state){ - case Sencrypting: - nb = encryptb(s, nb, offset); - break; - case Sdigesting: - nb = digestb(s, nb, offset); - break; - case Sdigenc: - nb = digestb(s, nb, offset); - nb = encryptb(s, nb, offset); - break; - } - - s->out.mid++; - - m = BLEN(nb); - devtab[s->c->type]->bwrite(s->c, nb, s->c->offset); - s->c->offset += m; - } - - poperror(); - return rv; -} - -static void -setsecret(OneWay *w, uchar *secret, int n) -{ - if(w->secret) - free(w->secret); - - w->secret = smalloc(n); - memmove(w->secret, secret, n); - w->slen = n; -} - -static void -initDESkey(OneWay *w) -{ - if(w->state){ - free(w->state); - w->state = 0; - } - - w->state = smalloc(sizeof(DESstate)); - if(w->slen >= 16) - setupDESstate(w->state, w->secret, w->secret+8); - else if(w->slen >= 8) - setupDESstate(w->state, w->secret, 0); - else - error("secret too short"); -} - -/* - * 40 bit DES is the same as 56 bit DES. However, - * 16 bits of the key are masked to zero. - */ -static void -initDESkey_40(OneWay *w) -{ - uchar key[8]; - - if(w->state){ - free(w->state); - w->state = 0; - } - - if(w->slen >= 8){ - memmove(key, w->secret, 8); - key[0] &= 0x0f; - key[2] &= 0x0f; - key[4] &= 0x0f; - key[6] &= 0x0f; - } - - w->state = malloc(sizeof(DESstate)); - if(w->slen >= 16) - setupDESstate(w->state, key, w->secret+8); - else if(w->slen >= 8) - setupDESstate(w->state, key, 0); - else - error("secret too short"); -} - -static void -initRC4key(OneWay *w) -{ - if(w->state){ - free(w->state); - w->state = 0; - } - - w->state = smalloc(sizeof(RC4state)); - setupRC4state(w->state, w->secret, w->slen); -} - -/* - * 40 bit RC4 is the same as n-bit RC4. However, - * we ignore all but the first 40 bits of the key. - */ -static void -initRC4key_40(OneWay *w) -{ - if(w->state){ - free(w->state); - w->state = 0; - } - - if(w->slen > 5) - w->slen = 5; - - w->state = malloc(sizeof(RC4state)); - setupRC4state(w->state, w->secret, w->slen); -} - -/* - * 128 bit RC4 is the same as n-bit RC4. However, - * we ignore all but the first 128 bits of the key. - */ -static void -initRC4key_128(OneWay *w) -{ - if(w->state){ - free(w->state); - w->state = 0; - } - - if(w->slen > 16) - w->slen = 16; - - w->state = malloc(sizeof(RC4state)); - setupRC4state(w->state, w->secret, w->slen); -} - - -typedef struct Hashalg Hashalg; -struct Hashalg -{ - char *name; - int diglen; - DigestState *(*hf)(uchar*, ulong, uchar*, DigestState*); -}; - -Hashalg hashtab[] = -{ - { "md4", MD4dlen, md4, }, - { "md5", MD5dlen, md5, }, - { "sha1", SHA1dlen, sha1, }, - { "sha", SHA1dlen, sha1, }, - { 0 } -}; - -static int -parsehashalg(char *p, Dstate *s) -{ - Hashalg *ha; - - for(ha = hashtab; ha->name; ha++){ - if(strcmp(p, ha->name) == 0){ - s->hf = ha->hf; - s->diglen = ha->diglen; - s->state &= ~Sclear; - s->state |= Sdigesting; - return 0; - } - } - return -1; -} - -typedef struct Encalg Encalg; -struct Encalg -{ - char *name; - int blocklen; - int alg; - void (*keyinit)(OneWay*); -}; - -#ifdef NOSPOOKS -Encalg encrypttab[] = -{ - { "descbc", 8, DESCBC, initDESkey, }, /* DEPRECATED -- use des_56_cbc */ - { "desecb", 8, DESECB, initDESkey, }, /* DEPRECATED -- use des_56_ecb */ - { "des_56_cbc", 8, DESCBC, initDESkey, }, - { "des_56_ecb", 8, DESECB, initDESkey, }, - { "des_40_cbc", 8, DESCBC, initDESkey_40, }, - { "des_40_ecb", 8, DESECB, initDESkey_40, }, - { "rc4", 1, RC4, initRC4key_40, }, /* DEPRECATED -- use rc4_X */ - { "rc4_256", 1, RC4, initRC4key, }, - { "rc4_128", 1, RC4, initRC4key_128, }, - { "rc4_40", 1, RC4, initRC4key_40, }, - { 0 } -}; -#else -Encalg encrypttab[] = -{ - { "des_40_cbc", 8, DESCBC, initDESkey_40, }, - { "des_40_ecb", 8, DESECB, initDESkey_40, }, - { "rc4", 1, RC4, initRC4key_40, }, /* DEPRECATED -- use rc4_X */ - { "rc4_40", 1, RC4, initRC4key_40, }, - { 0 } -}; -#endif /* NOSPOOKS */ - -static int -parseencryptalg(char *p, Dstate *s) -{ - Encalg *ea; - - for(ea = encrypttab; ea->name; ea++){ - if(strcmp(p, ea->name) == 0){ - s->encryptalg = ea->alg; - s->blocklen = ea->blocklen; - (*ea->keyinit)(&s->in); - (*ea->keyinit)(&s->out); - s->state &= ~Sclear; - s->state |= Sencrypting; - return 0; - } - } - return -1; -} - -static long -sslwrite(Chan *c, void *a, long n, vlong o) -{ - Dstate * volatile s; - Block * volatile b; - int m, t; - char *p, *np, *e, buf[128]; - uchar *x; - - USED(o); - s = dstate[CONV(c->qid)]; - if(s == 0) - panic("sslwrite"); - - t = TYPE(c->qid); - if(t == Qdata){ - if(s->state == Sincomplete) - error(Ebadusefd); - - /* lock should a write gets split over multiple records */ - if(waserror()){ - qunlock(&s->out.q); - nexterror(); - } - qlock(&s->out.q); - p = a; -if(0) iprint("write %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", - n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); - e = p + n; - do { - m = e - p; - if(m > s->max) - m = s->max; - - b = allocb(m); - if(waserror()){ - freeb(b); - nexterror(); - } - memmove(b->wp, p, m); - poperror(); - b->wp += m; - - sslput(s, b); - - p += m; - } while(p < e); - p = a; -if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", - n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); - poperror(); - qunlock(&s->out.q); - return n; - } - - /* mutex with operations using what we're about to change */ - if(waserror()){ - qunlock(&s->in.ctlq); - qunlock(&s->out.q); - nexterror(); - } - qlock(&s->in.ctlq); - qlock(&s->out.q); - - switch(t){ - default: - panic("sslwrite"); - case Qsecretin: - setsecret(&s->in, a, n); - goto out; - case Qsecretout: - setsecret(&s->out, a, n); - goto out; - case Qctl: - break; - } - - if(n >= sizeof(buf)) - error("arg too long"); - strncpy(buf, a, n); - buf[n] = 0; - p = strchr(buf, '\n'); - if(p) - *p = 0; - p = strchr(buf, ' '); - if(p) - *p++ = 0; - - if(strcmp(buf, "fd") == 0){ - s->c = buftochan(p); - - /* default is clear (msg delimiters only) */ - s->state = Sclear; - s->blocklen = 1; - s->diglen = 0; - s->maxpad = s->max = (1<<15) - s->diglen - 1; - s->in.mid = 0; - s->out.mid = 0; - } else if(strcmp(buf, "alg") == 0 && p != 0){ - s->blocklen = 1; - s->diglen = 0; - - if(s->c == 0) - error("must set fd before algorithm"); - - s->state = Sclear; - s->maxpad = s->max = (1<<15) - s->diglen - 1; - if(strcmp(p, "clear") == 0){ - goto out; - } - - if(s->in.secret && s->out.secret == 0) - setsecret(&s->out, s->in.secret, s->in.slen); - if(s->out.secret && s->in.secret == 0) - setsecret(&s->in, s->out.secret, s->out.slen); - if(s->in.secret == 0 || s->out.secret == 0) - error("algorithm but no secret"); - - s->hf = 0; - s->encryptalg = Noencryption; - s->blocklen = 1; - - for(;;){ - np = strchr(p, ' '); - if(np) - *np++ = 0; - - if(parsehashalg(p, s) < 0) - if(parseencryptalg(p, s) < 0) - error("bad algorithm"); - - if(np == 0) - break; - p = np; - } - - if(s->hf == 0 && s->encryptalg == Noencryption) - error("bad algorithm"); - - if(s->blocklen != 1){ - s->max = (1<<15) - s->diglen - 1; - s->max -= s->max % s->blocklen; - s->maxpad = (1<<14) - s->diglen - 1; - s->maxpad -= s->maxpad % s->blocklen; - } else - s->maxpad = s->max = (1<<15) - s->diglen - 1; - } else if(strcmp(buf, "secretin") == 0 && p != 0) { - m = (strlen(p)*3)/2; - x = smalloc(m); - t = dec64(x, m, p, strlen(p)); - setsecret(&s->in, x, t); - free(x); - } else if(strcmp(buf, "secretout") == 0 && p != 0) { - m = (strlen(p)*3)/2 + 1; - x = smalloc(m); - t = dec64(x, m, p, strlen(p)); - setsecret(&s->out, x, t); - free(x); - } else - error(Ebadarg); - -out: - qunlock(&s->in.ctlq); - qunlock(&s->out.q); - poperror(); - return n; -} - -static void -sslinit(void) -{ - struct Encalg *e; - struct Hashalg *h; - int n; - char *cp; - - n = 1; - for(e = encrypttab; e->name != nil; e++) - n += strlen(e->name) + 1; - cp = encalgs = smalloc(n); - for(e = encrypttab;;){ - strcpy(cp, e->name); - cp += strlen(e->name); - e++; - if(e->name == nil) - break; - *cp++ = ' '; - } - *cp = 0; - - n = 1; - for(h = hashtab; h->name != nil; h++) - n += strlen(h->name) + 1; - cp = hashalgs = smalloc(n); - for(h = hashtab;;){ - strcpy(cp, h->name); - cp += strlen(h->name); - h++; - if(h->name == nil) - break; - *cp++ = ' '; - } - *cp = 0; -} - -Dev ssldevtab = { - 'D', - "ssl", - - devreset, - sslinit, - devshutdown, - sslattach, - sslwalk, - sslstat, - sslopen, - devcreate, - sslclose, - sslread, - sslbread, - sslwrite, - sslbwrite, - devremove, - sslwstat, -}; - -static Block* -encryptb(Dstate *s, Block *b, int offset) -{ - uchar *p, *ep, *p2, *ip, *eip; - DESstate *ds; - - switch(s->encryptalg){ - case DESECB: - ds = s->out.state; - ep = b->rp + BLEN(b); - for(p = b->rp + offset; p < ep; p += 8) - block_cipher(ds->expanded, p, 0); - break; - case DESCBC: - ds = s->out.state; - ep = b->rp + BLEN(b); - for(p = b->rp + offset; p < ep; p += 8){ - p2 = p; - ip = ds->ivec; - for(eip = ip+8; ip < eip; ) - *p2++ ^= *ip++; - block_cipher(ds->expanded, p, 0); - memmove(ds->ivec, p, 8); - } - break; - case RC4: - rc4(s->out.state, b->rp + offset, BLEN(b) - offset); - break; - } - return b; -} - -static Block* -decryptb(Dstate *s, Block *bin) -{ - Block *b, **l; - uchar *p, *ep, *tp, *ip, *eip; - DESstate *ds; - uchar tmp[8]; - int i; - - l = &bin; - for(b = bin; b; b = b->next){ - /* make sure we have a multiple of s->blocklen */ - if(s->blocklen > 1){ - i = BLEN(b); - if(i % s->blocklen){ - *l = b = pullupblock(b, i + s->blocklen - (i%s->blocklen)); - if(b == 0) - error("ssl encrypted message too short"); - } - } - l = &b->next; - - /* decrypt */ - switch(s->encryptalg){ - case DESECB: - ds = s->in.state; - ep = b->rp + BLEN(b); - for(p = b->rp; p < ep; p += 8) - block_cipher(ds->expanded, p, 1); - break; - case DESCBC: - ds = s->in.state; - ep = b->rp + BLEN(b); - for(p = b->rp; p < ep;){ - memmove(tmp, p, 8); - block_cipher(ds->expanded, p, 1); - tp = tmp; - ip = ds->ivec; - for(eip = ip+8; ip < eip; ){ - *p++ ^= *ip; - *ip++ = *tp++; - } - } - break; - case RC4: - rc4(s->in.state, b->rp, BLEN(b)); - break; - } - } - return bin; -} - -static Block* -digestb(Dstate *s, Block *b, int offset) -{ - uchar *p; - DigestState ss; - uchar msgid[4]; - ulong n, h; - OneWay *w; - - w = &s->out; - - memset(&ss, 0, sizeof(ss)); - h = s->diglen + offset; - n = BLEN(b) - h; - - /* hash secret + message */ - (*s->hf)(w->secret, w->slen, 0, &ss); - (*s->hf)(b->rp + h, n, 0, &ss); - - /* hash message id */ - p = msgid; - n = w->mid; - *p++ = n>>24; - *p++ = n>>16; - *p++ = n>>8; - *p = n; - (*s->hf)(msgid, 4, b->rp + offset, &ss); - - return b; -} - -static void -checkdigestb(Dstate *s, Block *bin) -{ - uchar *p; - DigestState ss; - uchar msgid[4]; - int n, h; - OneWay *w; - uchar digest[128]; - Block *b; - - w = &s->in; - - memset(&ss, 0, sizeof(ss)); - - /* hash secret */ - (*s->hf)(w->secret, w->slen, 0, &ss); - - /* hash message */ - h = s->diglen; - for(b = bin; b; b = b->next){ - n = BLEN(b) - h; - if(n < 0) - panic("checkdigestb"); - (*s->hf)(b->rp + h, n, 0, &ss); - h = 0; - } - - /* hash message id */ - p = msgid; - n = w->mid; - *p++ = n>>24; - *p++ = n>>16; - *p++ = n>>8; - *p = n; - (*s->hf)(msgid, 4, digest, &ss); - - if(memcmp(digest, bin->rp, s->diglen) != 0) - error("bad digest"); -} - -/* get channel associated with an fd */ -static Chan* -buftochan(char *p) -{ - Chan *c; - int fd; - - if(p == 0) - error(Ebadarg); - fd = strtoul(p, 0, 0); - if(fd < 0) - error(Ebadarg); - c = fdtochan(fd, -1, 0, 1); /* error check and inc ref */ - if(devtab[c->type] == &ssldevtab){ - cclose(c); - error("cannot ssl encrypt devssl files"); - } - return c; -} - -/* hand up a digest connection */ -static void -sslhangup(Dstate *s) -{ - Block *b; - - qlock(&s->in.q); - for(b = s->processed; b; b = s->processed){ - s->processed = b->next; - freeb(b); - } - if(s->unprocessed){ - freeb(s->unprocessed); - s->unprocessed = 0; - } - s->state = Sincomplete; - qunlock(&s->in.q); -} - -static Dstate* -dsclone(Chan *ch) -{ - int i; - Dstate *ret; - - if(waserror()) { - unlock(&dslock); - nexterror(); - } - lock(&dslock); - ret = nil; - for(i=0; i<Maxdstate; i++){ - if(dstate[i] == nil){ - dsnew(ch, &dstate[i]); - ret = dstate[i]; - break; - } - } - unlock(&dslock); - poperror(); - return ret; -} - -static void -dsnew(Chan *ch, Dstate **pp) -{ - Dstate *s; - int t; - - *pp = s = malloc(sizeof(*s)); - if(!s) - error(Enomem); - if(pp - dstate >= dshiwat) - dshiwat++; - memset(s, 0, sizeof(*s)); - s->state = Sincomplete; - s->ref = 1; - kstrdup(&s->user, up->user); - s->perm = 0660; - t = TYPE(ch->qid); - if(t == Qclonus) - t = Qctl; - ch->qid.path = QID(pp - dstate, t); - ch->qid.vers = 0; -} diff --git a/sys/src/cmd/unix/drawterm/kern/devtab.c b/sys/src/cmd/unix/drawterm/kern/devtab.c deleted file mode 100644 index e16a188fd..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devtab.c +++ /dev/null @@ -1,35 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -extern Dev consdevtab; -extern Dev rootdevtab; -extern Dev pipedevtab; -extern Dev ssldevtab; -extern Dev tlsdevtab; -extern Dev mousedevtab; -extern Dev drawdevtab; -extern Dev ipdevtab; -extern Dev fsdevtab; -extern Dev mntdevtab; -extern Dev lfddevtab; -extern Dev audiodevtab; - -Dev *devtab[] = { - &rootdevtab, - &consdevtab, - &pipedevtab, - &ssldevtab, - &tlsdevtab, - &mousedevtab, - &drawdevtab, - &ipdevtab, - &fsdevtab, - &mntdevtab, - &lfddevtab, - &audiodevtab, - 0 -}; - diff --git a/sys/src/cmd/unix/drawterm/kern/devtls.c b/sys/src/cmd/unix/drawterm/kern/devtls.c deleted file mode 100644 index 6f439a241..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devtls.c +++ /dev/null @@ -1,2185 +0,0 @@ -/* - * devtls - record layer for transport layer security 1.0 and secure sockets layer 3.0 - */ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "libsec.h" - -typedef struct OneWay OneWay; -typedef struct Secret Secret; -typedef struct TlsRec TlsRec; -typedef struct TlsErrs TlsErrs; - -enum { - Statlen= 1024, /* max. length of status or stats message */ - /* buffer limits */ - MaxRecLen = 1<<14, /* max payload length of a record layer message */ - MaxCipherRecLen = MaxRecLen + 2048, - RecHdrLen = 5, - MaxMacLen = SHA1dlen, - - /* protocol versions we can accept */ - TLSVersion = 0x0301, - SSL3Version = 0x0300, - ProtocolVersion = 0x0301, /* maximum version we speak */ - MinProtoVersion = 0x0300, /* limits on version we accept */ - MaxProtoVersion = 0x03ff, - - /* connection states */ - SHandshake = 1 << 0, /* doing handshake */ - SOpen = 1 << 1, /* application data can be sent */ - SRClose = 1 << 2, /* remote side has closed down */ - SLClose = 1 << 3, /* sent a close notify alert */ - SAlert = 1 << 5, /* sending or sent a fatal alert */ - SError = 1 << 6, /* some sort of error has occured */ - SClosed = 1 << 7, /* it is all over */ - - /* record types */ - RChangeCipherSpec = 20, - RAlert, - RHandshake, - RApplication, - - SSL2ClientHello = 1, - HSSL2ClientHello = 9, /* local convention; see tlshand.c */ - - /* alerts */ - ECloseNotify = 0, - EUnexpectedMessage = 10, - EBadRecordMac = 20, - EDecryptionFailed = 21, - ERecordOverflow = 22, - EDecompressionFailure = 30, - EHandshakeFailure = 40, - ENoCertificate = 41, - EBadCertificate = 42, - EUnsupportedCertificate = 43, - ECertificateRevoked = 44, - ECertificateExpired = 45, - ECertificateUnknown = 46, - EIllegalParameter = 47, - EUnknownCa = 48, - EAccessDenied = 49, - EDecodeError = 50, - EDecryptError = 51, - EExportRestriction = 60, - EProtocolVersion = 70, - EInsufficientSecurity = 71, - EInternalError = 80, - EUserCanceled = 90, - ENoRenegotiation = 100, - - EMAX = 256 -}; - -struct Secret -{ - char *encalg; /* name of encryption alg */ - char *hashalg; /* name of hash alg */ - int (*enc)(Secret*, uchar*, int); - int (*dec)(Secret*, uchar*, int); - int (*unpad)(uchar*, int, int); - DigestState *(*mac)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); - int block; /* encryption block len, 0 if none */ - int maclen; - void *enckey; - uchar mackey[MaxMacLen]; -}; - -struct OneWay -{ - QLock io; /* locks io access */ - QLock seclock; /* locks secret paramaters */ - ulong seq; - Secret *sec; /* cipher in use */ - Secret *new; /* cipher waiting for enable */ -}; - -struct TlsRec -{ - Chan *c; /* io channel */ - int ref; /* serialized by tdlock for atomic destroy */ - int version; /* version of the protocol we are speaking */ - char verset; /* version has been set */ - char opened; /* opened command every issued? */ - char err[ERRMAX]; /* error message to return to handshake requests */ - vlong handin; /* bytes communicated by the record layer */ - vlong handout; - vlong datain; - vlong dataout; - - Lock statelk; - int state; - int debug; - - /* record layer mac functions for different protocol versions */ - void (*packMac)(Secret*, uchar*, uchar*, uchar*, uchar*, int, uchar*); - - /* input side -- protected by in.io */ - OneWay in; - Block *processed; /* next bunch of application data */ - Block *unprocessed; /* data read from c but not parsed into records */ - - /* handshake queue */ - Lock hqlock; /* protects hqref, alloc & free of handq, hprocessed */ - int hqref; - Queue *handq; /* queue of handshake messages */ - Block *hprocessed; /* remainder of last block read from handq */ - QLock hqread; /* protects reads for hprocessed, handq */ - - /* output side */ - OneWay out; - - /* protections */ - char *user; - int perm; -}; - -struct TlsErrs{ - int err; - int sslerr; - int tlserr; - int fatal; - char *msg; -}; - -static TlsErrs tlserrs[] = { - {ECloseNotify, ECloseNotify, ECloseNotify, 0, "close notify"}, - {EUnexpectedMessage, EUnexpectedMessage, EUnexpectedMessage, 1, "unexpected message"}, - {EBadRecordMac, EBadRecordMac, EBadRecordMac, 1, "bad record mac"}, - {EDecryptionFailed, EIllegalParameter, EDecryptionFailed, 1, "decryption failed"}, - {ERecordOverflow, EIllegalParameter, ERecordOverflow, 1, "record too long"}, - {EDecompressionFailure, EDecompressionFailure, EDecompressionFailure, 1, "decompression failed"}, - {EHandshakeFailure, EHandshakeFailure, EHandshakeFailure, 1, "could not negotiate acceptable security parameters"}, - {ENoCertificate, ENoCertificate, ECertificateUnknown, 1, "no appropriate certificate available"}, - {EBadCertificate, EBadCertificate, EBadCertificate, 1, "corrupted or invalid certificate"}, - {EUnsupportedCertificate, EUnsupportedCertificate, EUnsupportedCertificate, 1, "unsupported certificate type"}, - {ECertificateRevoked, ECertificateRevoked, ECertificateRevoked, 1, "revoked certificate"}, - {ECertificateExpired, ECertificateExpired, ECertificateExpired, 1, "expired certificate"}, - {ECertificateUnknown, ECertificateUnknown, ECertificateUnknown, 1, "unacceptable certificate"}, - {EIllegalParameter, EIllegalParameter, EIllegalParameter, 1, "illegal parameter"}, - {EUnknownCa, EHandshakeFailure, EUnknownCa, 1, "unknown certificate authority"}, - {EAccessDenied, EHandshakeFailure, EAccessDenied, 1, "access denied"}, - {EDecodeError, EIllegalParameter, EDecodeError, 1, "error decoding message"}, - {EDecryptError, EIllegalParameter, EDecryptError, 1, "error decrypting message"}, - {EExportRestriction, EHandshakeFailure, EExportRestriction, 1, "export restriction violated"}, - {EProtocolVersion, EIllegalParameter, EProtocolVersion, 1, "protocol version not supported"}, - {EInsufficientSecurity, EHandshakeFailure, EInsufficientSecurity, 1, "stronger security routines required"}, - {EInternalError, EHandshakeFailure, EInternalError, 1, "internal error"}, - {EUserCanceled, ECloseNotify, EUserCanceled, 0, "handshake canceled by user"}, - {ENoRenegotiation, EUnexpectedMessage, ENoRenegotiation, 0, "no renegotiation"}, -}; - -enum -{ - /* max. open tls connections */ - MaxTlsDevs = 1024 -}; - -static Lock tdlock; -static int tdhiwat; -static int maxtlsdevs = 128; -static TlsRec **tlsdevs; -static char **trnames; -static char *encalgs; -static char *hashalgs; - -enum{ - Qtopdir = 1, /* top level directory */ - Qprotodir, - Qclonus, - Qencalgs, - Qhashalgs, - Qconvdir, /* directory for a conversation */ - Qdata, - Qctl, - Qhand, - Qstatus, - Qstats, -}; - -#define TYPE(x) ((x).path & 0xf) -#define CONV(x) (((x).path >> 5)&(MaxTlsDevs-1)) -#define QID(c, y) (((c)<<5) | (y)) - -static void checkstate(TlsRec *, int, int); -static void ensure(TlsRec*, Block**, int); -static void consume(Block**, uchar*, int); -static Chan* buftochan(char*); -static void tlshangup(TlsRec*); -static void tlsError(TlsRec*, char *); -static void alertHand(TlsRec*, char *); -static TlsRec *newtls(Chan *c); -static TlsRec *mktlsrec(void); -static DigestState*sslmac_md5(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s); -static DigestState*sslmac_sha1(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s); -static DigestState*nomac(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s); -static void sslPackMac(Secret *sec, uchar *mackey, uchar *seq, uchar *header, uchar *body, int len, uchar *mac); -static void tlsPackMac(Secret *sec, uchar *mackey, uchar *seq, uchar *header, uchar *body, int len, uchar *mac); -static void put64(uchar *p, vlong x); -static void put32(uchar *p, u32int); -static void put24(uchar *p, int); -static void put16(uchar *p, int); -/* static u32int get32(uchar *p); */ -static int get16(uchar *p); -static void tlsSetState(TlsRec *tr, int new, int old); -static void rcvAlert(TlsRec *tr, int err); -static void sendAlert(TlsRec *tr, int err); -static void rcvError(TlsRec *tr, int err, char *msg, ...); -static int rc4enc(Secret *sec, uchar *buf, int n); -static int des3enc(Secret *sec, uchar *buf, int n); -static int des3dec(Secret *sec, uchar *buf, int n); -static int noenc(Secret *sec, uchar *buf, int n); -static int sslunpad(uchar *buf, int n, int block); -static int tlsunpad(uchar *buf, int n, int block); -static void freeSec(Secret *sec); -static char *tlsstate(int s); -static void pdump(int, void*, char*); - -static char *tlsnames[] = { - /* unused */ 0, - /* topdir */ 0, - /* protodir */ 0, - "clone", - "encalgs", - "hashalgs", - /* convdir */ 0, - "data", - "ctl", - "hand", - "status", - "stats", -}; - -static int convdir[] = { Qctl, Qdata, Qhand, Qstatus, Qstats }; - -static int -tlsgen(Chan *c, char*unused1, Dirtab *unused2, int unused3, int s, Dir *dp) -{ - Qid q; - TlsRec *tr; - char *name, *nm; - int perm, t; - - q.vers = 0; - q.type = QTFILE; - - t = TYPE(c->qid); - switch(t) { - case Qtopdir: - if(s == DEVDOTDOT){ - q.path = QID(0, Qtopdir); - q.type = QTDIR; - devdir(c, q, "#a", 0, eve, 0555, dp); - return 1; - } - if(s > 0) - return -1; - q.path = QID(0, Qprotodir); - q.type = QTDIR; - devdir(c, q, "tls", 0, eve, 0555, dp); - return 1; - case Qprotodir: - if(s == DEVDOTDOT){ - q.path = QID(0, Qtopdir); - q.type = QTDIR; - devdir(c, q, ".", 0, eve, 0555, dp); - return 1; - } - if(s < 3){ - switch(s) { - default: - return -1; - case 0: - q.path = QID(0, Qclonus); - break; - case 1: - q.path = QID(0, Qencalgs); - break; - case 2: - q.path = QID(0, Qhashalgs); - break; - } - perm = 0444; - if(TYPE(q) == Qclonus) - perm = 0555; - devdir(c, q, tlsnames[TYPE(q)], 0, eve, perm, dp); - return 1; - } - s -= 3; - if(s >= tdhiwat) - return -1; - q.path = QID(s, Qconvdir); - q.type = QTDIR; - lock(&tdlock); - tr = tlsdevs[s]; - if(tr != nil) - nm = tr->user; - else - nm = eve; - if((name = trnames[s]) == nil){ - name = trnames[s] = smalloc(16); - sprint(name, "%d", s); - } - devdir(c, q, name, 0, nm, 0555, dp); - unlock(&tdlock); - return 1; - case Qconvdir: - if(s == DEVDOTDOT){ - q.path = QID(0, Qprotodir); - q.type = QTDIR; - devdir(c, q, "tls", 0, eve, 0555, dp); - return 1; - } - if(s < 0 || s >= nelem(convdir)) - return -1; - lock(&tdlock); - tr = tlsdevs[CONV(c->qid)]; - if(tr != nil){ - nm = tr->user; - perm = tr->perm; - }else{ - perm = 0; - nm = eve; - } - t = convdir[s]; - if(t == Qstatus || t == Qstats) - perm &= 0444; - q.path = QID(CONV(c->qid), t); - devdir(c, q, tlsnames[t], 0, nm, perm, dp); - unlock(&tdlock); - return 1; - case Qclonus: - case Qencalgs: - case Qhashalgs: - perm = 0444; - if(t == Qclonus) - perm = 0555; - devdir(c, c->qid, tlsnames[t], 0, eve, perm, dp); - return 1; - default: - lock(&tdlock); - tr = tlsdevs[CONV(c->qid)]; - if(tr != nil){ - nm = tr->user; - perm = tr->perm; - }else{ - perm = 0; - nm = eve; - } - if(t == Qstatus || t == Qstats) - perm &= 0444; - devdir(c, c->qid, tlsnames[t], 0, nm, perm, dp); - unlock(&tdlock); - return 1; - } - return -1; -} - -static Chan* -tlsattach(char *spec) -{ - Chan *c; - - c = devattach('a', spec); - c->qid.path = QID(0, Qtopdir); - c->qid.type = QTDIR; - c->qid.vers = 0; - return c; -} - -static Walkqid* -tlswalk(Chan *c, Chan *nc, char **name, int nname) -{ - return devwalk(c, nc, name, nname, nil, 0, tlsgen); -} - -static int -tlsstat(Chan *c, uchar *db, int n) -{ - return devstat(c, db, n, nil, 0, tlsgen); -} - -static Chan* -tlsopen(Chan *c, int omode) -{ - TlsRec *tr, **pp; - int t, perm; - - perm = 0; - omode &= 3; - switch(omode) { - case OREAD: - perm = 4; - break; - case OWRITE: - perm = 2; - break; - case ORDWR: - perm = 6; - break; - } - - t = TYPE(c->qid); - switch(t) { - default: - panic("tlsopen"); - case Qtopdir: - case Qprotodir: - case Qconvdir: - if(omode != OREAD) - error(Eperm); - break; - case Qclonus: - tr = newtls(c); - if(tr == nil) - error(Enodev); - break; - case Qctl: - case Qdata: - case Qhand: - case Qstatus: - case Qstats: - if((t == Qstatus || t == Qstats) && omode != OREAD) - error(Eperm); - if(waserror()) { - unlock(&tdlock); - nexterror(); - } - lock(&tdlock); - pp = &tlsdevs[CONV(c->qid)]; - tr = *pp; - if(tr == nil) - error("must open connection using clone"); - if((perm & (tr->perm>>6)) != perm - && (strcmp(up->user, tr->user) != 0 - || (perm & tr->perm) != perm)) - error(Eperm); - if(t == Qhand){ - if(waserror()){ - unlock(&tr->hqlock); - nexterror(); - } - lock(&tr->hqlock); - if(tr->handq != nil) - error(Einuse); - tr->handq = qopen(2 * MaxCipherRecLen, 0, 0, nil); - if(tr->handq == nil) - error("cannot allocate handshake queue"); - tr->hqref = 1; - unlock(&tr->hqlock); - poperror(); - } - tr->ref++; - unlock(&tdlock); - poperror(); - break; - case Qencalgs: - case Qhashalgs: - if(omode != OREAD) - error(Eperm); - break; - } - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - c->iounit = qiomaxatomic; - return c; -} - -static int -tlswstat(Chan *c, uchar *dp, int n) -{ - Dir *d; - TlsRec *tr; - int rv; - - d = nil; - if(waserror()){ - free(d); - unlock(&tdlock); - nexterror(); - } - - lock(&tdlock); - tr = tlsdevs[CONV(c->qid)]; - if(tr == nil) - error(Ebadusefd); - if(strcmp(tr->user, up->user) != 0) - error(Eperm); - - d = smalloc(n + sizeof *d); - rv = convM2D(dp, n, &d[0], (char*) &d[1]); - if(rv == 0) - error(Eshortstat); - if(!emptystr(d->uid)) - kstrdup(&tr->user, d->uid); - if(d->mode != ~0UL) - tr->perm = d->mode; - - free(d); - poperror(); - unlock(&tdlock); - - return rv; -} - -static void -dechandq(TlsRec *tr) -{ - lock(&tr->hqlock); - if(--tr->hqref == 0){ - if(tr->handq != nil){ - qfree(tr->handq); - tr->handq = nil; - } - if(tr->hprocessed != nil){ - freeb(tr->hprocessed); - tr->hprocessed = nil; - } - } - unlock(&tr->hqlock); -} - -static void -tlsclose(Chan *c) -{ - TlsRec *tr; - int t; - - t = TYPE(c->qid); - switch(t) { - case Qctl: - case Qdata: - case Qhand: - case Qstatus: - case Qstats: - if((c->flag & COPEN) == 0) - break; - - tr = tlsdevs[CONV(c->qid)]; - if(tr == nil) - break; - - if(t == Qhand) - dechandq(tr); - - lock(&tdlock); - if(--tr->ref > 0) { - unlock(&tdlock); - return; - } - tlsdevs[CONV(c->qid)] = nil; - unlock(&tdlock); - - if(tr->c != nil && !waserror()){ - checkstate(tr, 0, SOpen|SHandshake|SRClose); - sendAlert(tr, ECloseNotify); - poperror(); - } - tlshangup(tr); - if(tr->c != nil) - cclose(tr->c); - freeSec(tr->in.sec); - freeSec(tr->in.new); - freeSec(tr->out.sec); - freeSec(tr->out.new); - free(tr->user); - free(tr); - break; - } -} - -/* - * make sure we have at least 'n' bytes in list 'l' - */ -static void -ensure(TlsRec *s, Block **l, int n) -{ - int sofar, i; - Block *b, *bl; - - sofar = 0; - for(b = *l; b; b = b->next){ - sofar += BLEN(b); - if(sofar >= n) - return; - l = &b->next; - } - - while(sofar < n){ - bl = devtab[s->c->type]->bread(s->c, MaxCipherRecLen + RecHdrLen, 0); - if(bl == 0) - error(Ehungup); - *l = bl; - i = 0; - for(b = bl; b; b = b->next){ - i += BLEN(b); - l = &b->next; - } - if(i == 0) - error(Ehungup); - sofar += i; - } -if(s->debug) pprint("ensure read %d\n", sofar); -} - -/* - * copy 'n' bytes from 'l' into 'p' and free - * the bytes in 'l' - */ -static void -consume(Block **l, uchar *p, int n) -{ - Block *b; - int i; - - for(; *l && n > 0; n -= i){ - b = *l; - i = BLEN(b); - if(i > n) - i = n; - memmove(p, b->rp, i); - b->rp += i; - p += i; - if(BLEN(b) < 0) - panic("consume"); - if(BLEN(b)) - break; - *l = b->next; - freeb(b); - } -} - -/* - * give back n bytes - */ -static void -regurgitate(TlsRec *s, uchar *p, int n) -{ - Block *b; - - if(n <= 0) - return; - b = s->unprocessed; - if(s->unprocessed == nil || b->rp - b->base < n) { - b = allocb(n); - memmove(b->wp, p, n); - b->wp += n; - b->next = s->unprocessed; - s->unprocessed = b; - } else { - b->rp -= n; - memmove(b->rp, p, n); - } -} - -/* - * remove at most n bytes from the queue - */ -static Block* -qgrab(Block **l, int n) -{ - Block *bb, *b; - int i; - - b = *l; - if(BLEN(b) == n){ - *l = b->next; - b->next = nil; - return b; - } - - i = 0; - for(bb = b; bb != nil && i < n; bb = bb->next) - i += BLEN(bb); - if(i > n) - i = n; - - bb = allocb(i); - consume(l, bb->wp, i); - bb->wp += i; - return bb; -} - -static void -tlsclosed(TlsRec *tr, int new) -{ - lock(&tr->statelk); - if(tr->state == SOpen || tr->state == SHandshake) - tr->state = new; - else if((new | tr->state) == (SRClose|SLClose)) - tr->state = SClosed; - unlock(&tr->statelk); - alertHand(tr, "close notify"); -} - -/* - * read and process one tls record layer message - * must be called with tr->in.io held - * We can't let Eintrs lose data, since doing so will get - * us out of sync with the sender and break the reliablity - * of the channel. Eintr only happens during the reads in - * consume. Therefore we put back any bytes consumed before - * the last call to ensure. - */ -static void -tlsrecread(TlsRec *tr) -{ - OneWay *volatile in; - Block *volatile b; - uchar *p, seq[8], header[RecHdrLen], hmac[MD5dlen]; - int volatile nconsumed; - int len, type, ver, unpad_len; - - nconsumed = 0; - if(waserror()){ - if(strcmp(up->errstr, Eintr) == 0 && !waserror()){ - regurgitate(tr, header, nconsumed); - poperror(); - }else - tlsError(tr, "channel error"); - nexterror(); - } - ensure(tr, &tr->unprocessed, RecHdrLen); - consume(&tr->unprocessed, header, RecHdrLen); -if(tr->debug)pprint("consumed %d header\n", RecHdrLen); - nconsumed = RecHdrLen; - - if((tr->handin == 0) && (header[0] & 0x80)){ - /* Cope with an SSL3 ClientHello expressed in SSL2 record format. - This is sent by some clients that we must interoperate - with, such as Java's JSSE and Microsoft's Internet Explorer. */ - len = (get16(header) & ~0x8000) - 3; - type = header[2]; - ver = get16(header + 3); - if(type != SSL2ClientHello || len < 22) - rcvError(tr, EProtocolVersion, "invalid initial SSL2-like message"); - }else{ /* normal SSL3 record format */ - type = header[0]; - ver = get16(header+1); - len = get16(header+3); - } - if(ver != tr->version && (tr->verset || ver < MinProtoVersion || ver > MaxProtoVersion)) - rcvError(tr, EProtocolVersion, "devtls expected ver=%x%s, saw (len=%d) type=%x ver=%x '%.12s'", - tr->version, tr->verset?"/set":"", len, type, ver, (char*)header); - if(len > MaxCipherRecLen || len < 0) - rcvError(tr, ERecordOverflow, "record message too long %d", len); - ensure(tr, &tr->unprocessed, len); - nconsumed = 0; - poperror(); - - /* - * If an Eintr happens after this, we'll get out of sync. - * Make sure nothing we call can sleep. - * Errors are ok, as they kill the connection. - * Luckily, allocb won't sleep, it'll just error out. - */ - b = nil; - if(waserror()){ - if(b != nil) - freeb(b); - tlsError(tr, "channel error"); - nexterror(); - } - b = qgrab(&tr->unprocessed, len); -if(tr->debug) pprint("consumed unprocessed %d\n", len); - - in = &tr->in; - if(waserror()){ - qunlock(&in->seclock); - nexterror(); - } - qlock(&in->seclock); - p = b->rp; - if(in->sec != nil) { - /* to avoid Canvel-Hiltgen-Vaudenay-Vuagnoux attack, all errors here - should look alike, including timing of the response. */ - unpad_len = (*in->sec->dec)(in->sec, p, len); - if(unpad_len >= in->sec->maclen) - len = unpad_len - in->sec->maclen; -if(tr->debug) pprint("decrypted %d\n", unpad_len); -if(tr->debug) pdump(unpad_len, p, "decrypted:"); - - /* update length */ - put16(header+3, len); - put64(seq, in->seq); - in->seq++; - (*tr->packMac)(in->sec, in->sec->mackey, seq, header, p, len, hmac); - if(unpad_len < in->sec->maclen) - rcvError(tr, EBadRecordMac, "short record mac"); - if(memcmp(hmac, p+len, in->sec->maclen) != 0) - rcvError(tr, EBadRecordMac, "record mac mismatch"); - b->wp = b->rp + len; - } - qunlock(&in->seclock); - poperror(); - if(len < 0) - rcvError(tr, EDecodeError, "runt record message"); - - switch(type) { - default: - rcvError(tr, EIllegalParameter, "invalid record message 0x%x", type); - break; - case RChangeCipherSpec: - if(len != 1 || p[0] != 1) - rcvError(tr, EDecodeError, "invalid change cipher spec"); - qlock(&in->seclock); - if(in->new == nil){ - qunlock(&in->seclock); - rcvError(tr, EUnexpectedMessage, "unexpected change cipher spec"); - } - freeSec(in->sec); - in->sec = in->new; - in->new = nil; - in->seq = 0; - qunlock(&in->seclock); - break; - case RAlert: - if(len != 2) - rcvError(tr, EDecodeError, "invalid alert"); - if(p[0] == 2) - rcvAlert(tr, p[1]); - if(p[0] != 1) - rcvError(tr, EIllegalParameter, "invalid alert fatal code"); - - /* - * propate non-fatal alerts to handshaker - */ - if(p[1] == ECloseNotify) { - tlsclosed(tr, SRClose); - if(tr->opened) - error("tls hungup"); - error("close notify"); - } - if(p[1] == ENoRenegotiation) - alertHand(tr, "no renegotiation"); - else if(p[1] == EUserCanceled) - alertHand(tr, "handshake canceled by user"); - else - rcvError(tr, EIllegalParameter, "invalid alert code"); - break; - case RHandshake: - /* - * don't worry about dropping the block - * qbwrite always queues even if flow controlled and interrupted. - * - * if there isn't any handshaker, ignore the request, - * but notify the other side we are doing so. - */ - lock(&tr->hqlock); - if(tr->handq != nil){ - tr->hqref++; - unlock(&tr->hqlock); - if(waserror()){ - dechandq(tr); - nexterror(); - } - b = padblock(b, 1); - *b->rp = RHandshake; - qbwrite(tr->handq, b); - b = nil; - poperror(); - dechandq(tr); - }else{ - unlock(&tr->hqlock); - if(tr->verset && tr->version != SSL3Version && !waserror()){ - sendAlert(tr, ENoRenegotiation); - poperror(); - } - } - break; - case SSL2ClientHello: - lock(&tr->hqlock); - if(tr->handq != nil){ - tr->hqref++; - unlock(&tr->hqlock); - if(waserror()){ - dechandq(tr); - nexterror(); - } - /* Pass the SSL2 format data, so that the handshake code can compute - the correct checksums. HSSL2ClientHello = HandshakeType 9 is - unused in RFC2246. */ - b = padblock(b, 8); - b->rp[0] = RHandshake; - b->rp[1] = HSSL2ClientHello; - put24(&b->rp[2], len+3); - b->rp[5] = SSL2ClientHello; - put16(&b->rp[6], ver); - qbwrite(tr->handq, b); - b = nil; - poperror(); - dechandq(tr); - }else{ - unlock(&tr->hqlock); - if(tr->verset && tr->version != SSL3Version && !waserror()){ - sendAlert(tr, ENoRenegotiation); - poperror(); - } - } - break; - case RApplication: - if(!tr->opened) - rcvError(tr, EUnexpectedMessage, "application message received before handshake completed"); - if(BLEN(b) > 0){ - tr->processed = b; - b = nil; - } - break; - } - if(b != nil) - freeb(b); - poperror(); -} - -/* - * got a fatal alert message - */ -static void -rcvAlert(TlsRec *tr, int err) -{ - char *s; - int i; - - s = "unknown error"; - for(i=0; i < nelem(tlserrs); i++){ - if(tlserrs[i].err == err){ - s = tlserrs[i].msg; - break; - } - } -if(tr->debug) pprint("rcvAlert: %s\n", s); - - tlsError(tr, s); - if(!tr->opened) - error(s); - error("tls error"); -} - -/* - * found an error while decoding the input stream - */ -static void -rcvError(TlsRec *tr, int err, char *fmt, ...) -{ - char msg[ERRMAX]; - va_list arg; - - va_start(arg, fmt); - vseprint(msg, msg+sizeof(msg), fmt, arg); - va_end(arg); -if(tr->debug) pprint("rcvError: %s\n", msg); - - sendAlert(tr, err); - - if(!tr->opened) - error(msg); - error("tls error"); -} - -/* - * make sure the next hand operation returns with a 'msg' error - */ -static void -alertHand(TlsRec *tr, char *msg) -{ - Block *b; - int n; - - lock(&tr->hqlock); - if(tr->handq == nil){ - unlock(&tr->hqlock); - return; - } - tr->hqref++; - unlock(&tr->hqlock); - - n = strlen(msg); - if(waserror()){ - dechandq(tr); - nexterror(); - } - b = allocb(n + 2); - *b->wp++ = RAlert; - memmove(b->wp, msg, n + 1); - b->wp += n + 1; - - qbwrite(tr->handq, b); - - poperror(); - dechandq(tr); -} - -static void -checkstate(TlsRec *tr, int ishand, int ok) -{ - int state; - - lock(&tr->statelk); - state = tr->state; - unlock(&tr->statelk); - if(state & ok) - return; - switch(state){ - case SHandshake: - case SOpen: - break; - case SError: - case SAlert: - if(ishand) - error(tr->err); - error("tls error"); - case SRClose: - case SLClose: - case SClosed: - error("tls hungup"); - } - error("tls improperly configured"); -} - -static Block* -tlsbread(Chan *c, long n, ulong offset) -{ - int ty; - Block *b; - TlsRec *volatile tr; - - ty = TYPE(c->qid); - switch(ty) { - default: - return devbread(c, n, offset); - case Qhand: - case Qdata: - break; - } - - tr = tlsdevs[CONV(c->qid)]; - if(tr == nil) - panic("tlsbread"); - - if(waserror()){ - qunlock(&tr->in.io); - nexterror(); - } - qlock(&tr->in.io); - if(ty == Qdata){ - checkstate(tr, 0, SOpen); - while(tr->processed == nil) - tlsrecread(tr); - - /* return at most what was asked for */ - b = qgrab(&tr->processed, n); -if(tr->debug) pprint("consumed processed %d\n", BLEN(b)); -if(tr->debug) pdump(BLEN(b), b->rp, "consumed:"); - qunlock(&tr->in.io); - poperror(); - tr->datain += BLEN(b); - }else{ - checkstate(tr, 1, SOpen|SHandshake|SLClose); - - /* - * it's ok to look at state without the lock - * since it only protects reading records, - * and we have that tr->in.io held. - */ - while(!tr->opened && tr->hprocessed == nil && !qcanread(tr->handq)) - tlsrecread(tr); - - qunlock(&tr->in.io); - poperror(); - - if(waserror()){ - qunlock(&tr->hqread); - nexterror(); - } - qlock(&tr->hqread); - if(tr->hprocessed == nil){ - b = qbread(tr->handq, MaxRecLen + 1); - if(*b->rp++ == RAlert){ - kstrcpy(up->errstr, (char*)b->rp, ERRMAX); - freeb(b); - nexterror(); - } - tr->hprocessed = b; - } - b = qgrab(&tr->hprocessed, n); - poperror(); - qunlock(&tr->hqread); - tr->handin += BLEN(b); - } - - return b; -} - -static long -tlsread(Chan *c, void *a, long n, vlong off) -{ - Block *volatile b; - Block *nb; - uchar *va; - int i, ty; - char *buf, *s, *e; - ulong offset = off; - TlsRec * tr; - - if(c->qid.type & QTDIR) - return devdirread(c, a, n, 0, 0, tlsgen); - - tr = tlsdevs[CONV(c->qid)]; - ty = TYPE(c->qid); - switch(ty) { - default: - error(Ebadusefd); - case Qstatus: - buf = smalloc(Statlen); - qlock(&tr->in.seclock); - qlock(&tr->out.seclock); - s = buf; - e = buf + Statlen; - s = seprint(s, e, "State: %s\n", tlsstate(tr->state)); - s = seprint(s, e, "Version: 0x%x\n", tr->version); - if(tr->in.sec != nil) - s = seprint(s, e, "EncIn: %s\nHashIn: %s\n", tr->in.sec->encalg, tr->in.sec->hashalg); - if(tr->in.new != nil) - s = seprint(s, e, "NewEncIn: %s\nNewHashIn: %s\n", tr->in.new->encalg, tr->in.new->hashalg); - if(tr->out.sec != nil) - s = seprint(s, e, "EncOut: %s\nHashOut: %s\n", tr->out.sec->encalg, tr->out.sec->hashalg); - if(tr->out.new != nil) - seprint(s, e, "NewEncOut: %s\nNewHashOut: %s\n", tr->out.new->encalg, tr->out.new->hashalg); - qunlock(&tr->in.seclock); - qunlock(&tr->out.seclock); - n = readstr(offset, a, n, buf); - free(buf); - return n; - case Qstats: - buf = smalloc(Statlen); - s = buf; - e = buf + Statlen; - s = seprint(s, e, "DataIn: %lld\n", tr->datain); - s = seprint(s, e, "DataOut: %lld\n", tr->dataout); - s = seprint(s, e, "HandIn: %lld\n", tr->handin); - seprint(s, e, "HandOut: %lld\n", tr->handout); - n = readstr(offset, a, n, buf); - free(buf); - return n; - case Qctl: - buf = smalloc(Statlen); - snprint(buf, Statlen, "%llud", CONV(c->qid)); - n = readstr(offset, a, n, buf); - free(buf); - return n; - case Qdata: - case Qhand: - b = tlsbread(c, n, offset); - break; - case Qencalgs: - return readstr(offset, a, n, encalgs); - case Qhashalgs: - return readstr(offset, a, n, hashalgs); - } - - if(waserror()){ - freeblist(b); - nexterror(); - } - - n = 0; - va = a; - for(nb = b; nb; nb = nb->next){ - i = BLEN(nb); - memmove(va+n, nb->rp, i); - n += i; - } - - freeblist(b); - poperror(); - - return n; -} - -/* - * write a block in tls records - */ -static void -tlsrecwrite(TlsRec *tr, int type, Block *b) -{ - Block *volatile bb; - Block *nb; - uchar *p, seq[8]; - OneWay *volatile out; - int n, maclen, pad, ok; - - out = &tr->out; - bb = b; - if(waserror()){ - qunlock(&out->io); - if(bb != nil) - freeb(bb); - nexterror(); - } - qlock(&out->io); -if(tr->debug)pprint("send %d\n", BLEN(b)); -if(tr->debug)pdump(BLEN(b), b->rp, "sent:"); - - - ok = SHandshake|SOpen|SRClose; - if(type == RAlert) - ok |= SAlert; - while(bb != nil){ - checkstate(tr, type != RApplication, ok); - - /* - * get at most one maximal record's input, - * with padding on the front for header and - * back for mac and maximal block padding. - */ - if(waserror()){ - qunlock(&out->seclock); - nexterror(); - } - qlock(&out->seclock); - maclen = 0; - pad = 0; - if(out->sec != nil){ - maclen = out->sec->maclen; - pad = maclen + out->sec->block; - } - n = BLEN(bb); - if(n > MaxRecLen){ - n = MaxRecLen; - nb = allocb(n + pad + RecHdrLen); - memmove(nb->wp + RecHdrLen, bb->rp, n); - bb->rp += n; - }else{ - /* - * carefully reuse bb so it will get freed if we're out of memory - */ - bb = padblock(bb, RecHdrLen); - if(pad) - nb = padblock(bb, -pad); - else - nb = bb; - bb = nil; - } - - p = nb->rp; - p[0] = type; - put16(p+1, tr->version); - put16(p+3, n); - - if(out->sec != nil){ - put64(seq, out->seq); - out->seq++; - (*tr->packMac)(out->sec, out->sec->mackey, seq, p, p + RecHdrLen, n, p + RecHdrLen + n); - n += maclen; - - /* encrypt */ - n = (*out->sec->enc)(out->sec, p + RecHdrLen, n); - nb->wp = p + RecHdrLen + n; - - /* update length */ - put16(p+3, n); - } - if(type == RChangeCipherSpec){ - if(out->new == nil) - error("change cipher without a new cipher"); - freeSec(out->sec); - out->sec = out->new; - out->new = nil; - out->seq = 0; - } - qunlock(&out->seclock); - poperror(); - - /* - * if bwrite error's, we assume the block is queued. - * if not, we're out of sync with the receiver and will not recover. - */ - if(waserror()){ - if(strcmp(up->errstr, "interrupted") != 0) - tlsError(tr, "channel error"); - nexterror(); - } - devtab[tr->c->type]->bwrite(tr->c, nb, 0); - poperror(); - } - qunlock(&out->io); - poperror(); -} - -static long -tlsbwrite(Chan *c, Block *b, ulong offset) -{ - int ty; - ulong n; - TlsRec *tr; - - n = BLEN(b); - - tr = tlsdevs[CONV(c->qid)]; - if(tr == nil) - panic("tlsbread"); - - ty = TYPE(c->qid); - switch(ty) { - default: - return devbwrite(c, b, offset); - case Qhand: - tlsrecwrite(tr, RHandshake, b); - tr->handout += n; - break; - case Qdata: - checkstate(tr, 0, SOpen); - tlsrecwrite(tr, RApplication, b); - tr->dataout += n; - break; - } - - return n; -} - -typedef struct Hashalg Hashalg; -struct Hashalg -{ - char *name; - int maclen; - void (*initkey)(Hashalg *, int, Secret *, uchar*); -}; - -static void -initmd5key(Hashalg *ha, int version, Secret *s, uchar *p) -{ - s->maclen = ha->maclen; - if(version == SSL3Version) - s->mac = sslmac_md5; - else - s->mac = hmac_md5; - memmove(s->mackey, p, ha->maclen); -} - -static void -initclearmac(Hashalg *unused1, int unused2, Secret *s, uchar *unused3) -{ - s->maclen = 0; - s->mac = nomac; -} - -static void -initsha1key(Hashalg *ha, int version, Secret *s, uchar *p) -{ - s->maclen = ha->maclen; - if(version == SSL3Version) - s->mac = sslmac_sha1; - else - s->mac = hmac_sha1; - memmove(s->mackey, p, ha->maclen); -} - -static Hashalg hashtab[] = -{ - { "clear", 0, initclearmac, }, - { "md5", MD5dlen, initmd5key, }, - { "sha1", SHA1dlen, initsha1key, }, - { 0 } -}; - -static Hashalg* -parsehashalg(char *p) -{ - Hashalg *ha; - - for(ha = hashtab; ha->name; ha++) - if(strcmp(p, ha->name) == 0) - return ha; - error("unsupported hash algorithm"); - return nil; -} - -typedef struct Encalg Encalg; -struct Encalg -{ - char *name; - int keylen; - int ivlen; - void (*initkey)(Encalg *ea, Secret *, uchar*, uchar*); -}; - -static void -initRC4key(Encalg *ea, Secret *s, uchar *p, uchar *unused1) -{ - s->enckey = smalloc(sizeof(RC4state)); - s->enc = rc4enc; - s->dec = rc4enc; - s->block = 0; - setupRC4state(s->enckey, p, ea->keylen); -} - -static void -initDES3key(Encalg *unused1, Secret *s, uchar *p, uchar *iv) -{ - s->enckey = smalloc(sizeof(DES3state)); - s->enc = des3enc; - s->dec = des3dec; - s->block = 8; - setupDES3state(s->enckey, (uchar(*)[8])p, iv); -} - -static void -initclearenc(Encalg *unused1, Secret *s, uchar *unused2, uchar *unused3) -{ - s->enc = noenc; - s->dec = noenc; - s->block = 0; -} - -static Encalg encrypttab[] = -{ - { "clear", 0, 0, initclearenc }, - { "rc4_128", 128/8, 0, initRC4key }, - { "3des_ede_cbc", 3 * 8, 8, initDES3key }, - { 0 } -}; - -static Encalg* -parseencalg(char *p) -{ - Encalg *ea; - - for(ea = encrypttab; ea->name; ea++) - if(strcmp(p, ea->name) == 0) - return ea; - error("unsupported encryption algorithm"); - return nil; -} - -static long -tlswrite(Chan *c, void *a, long n, vlong off) -{ - Encalg *ea; - Hashalg *ha; - TlsRec *volatile tr; - Secret *volatile tos, *volatile toc; - Block *volatile b; - Cmdbuf *volatile cb; - int m, ty; - char *p, *e; - uchar *volatile x; - ulong offset = off; - - tr = tlsdevs[CONV(c->qid)]; - if(tr == nil) - panic("tlswrite"); - - ty = TYPE(c->qid); - switch(ty){ - case Qdata: - case Qhand: - p = a; - e = p + n; - do{ - m = e - p; - if(m > MaxRecLen) - m = MaxRecLen; - - b = allocb(m); - if(waserror()){ - freeb(b); - nexterror(); - } - memmove(b->wp, p, m); - poperror(); - b->wp += m; - - tlsbwrite(c, b, offset); - - p += m; - }while(p < e); - return n; - case Qctl: - break; - default: - error(Ebadusefd); - return -1; - } - - cb = parsecmd(a, n); - if(waserror()){ - free(cb); - nexterror(); - } - if(cb->nf < 1) - error("short control request"); - - /* mutex with operations using what we're about to change */ - if(waserror()){ - qunlock(&tr->in.seclock); - qunlock(&tr->out.seclock); - nexterror(); - } - qlock(&tr->in.seclock); - qlock(&tr->out.seclock); - - if(strcmp(cb->f[0], "fd") == 0){ - if(cb->nf != 3) - error("usage: fd open-fd version"); - if(tr->c != nil) - error(Einuse); - m = strtol(cb->f[2], nil, 0); - if(m < MinProtoVersion || m > MaxProtoVersion) - error("unsupported version"); - tr->c = buftochan(cb->f[1]); - tr->version = m; - tlsSetState(tr, SHandshake, SClosed); - }else if(strcmp(cb->f[0], "version") == 0){ - if(cb->nf != 2) - error("usage: version vers"); - if(tr->c == nil) - error("must set fd before version"); - if(tr->verset) - error("version already set"); - m = strtol(cb->f[1], nil, 0); - if(m == SSL3Version) - tr->packMac = sslPackMac; - else if(m == TLSVersion) - tr->packMac = tlsPackMac; - else - error("unsupported version"); - tr->verset = 1; - tr->version = m; - }else if(strcmp(cb->f[0], "secret") == 0){ - if(cb->nf != 5) - error("usage: secret hashalg encalg isclient secretdata"); - if(tr->c == nil || !tr->verset) - error("must set fd and version before secrets"); - - if(tr->in.new != nil){ - freeSec(tr->in.new); - tr->in.new = nil; - } - if(tr->out.new != nil){ - freeSec(tr->out.new); - tr->out.new = nil; - } - - ha = parsehashalg(cb->f[1]); - ea = parseencalg(cb->f[2]); - - p = cb->f[4]; - m = (strlen(p)*3)/2; - x = smalloc(m); - tos = nil; - toc = nil; - if(waserror()){ - freeSec(tos); - freeSec(toc); - free(x); - nexterror(); - } - m = dec64(x, m, p, strlen(p)); - if(m < 2 * ha->maclen + 2 * ea->keylen + 2 * ea->ivlen) - error("not enough secret data provided"); - - tos = smalloc(sizeof(Secret)); - toc = smalloc(sizeof(Secret)); - if(!ha->initkey || !ea->initkey) - error("misimplemented secret algorithm"); - (*ha->initkey)(ha, tr->version, tos, &x[0]); - (*ha->initkey)(ha, tr->version, toc, &x[ha->maclen]); - (*ea->initkey)(ea, tos, &x[2 * ha->maclen], &x[2 * ha->maclen + 2 * ea->keylen]); - (*ea->initkey)(ea, toc, &x[2 * ha->maclen + ea->keylen], &x[2 * ha->maclen + 2 * ea->keylen + ea->ivlen]); - - if(!tos->mac || !tos->enc || !tos->dec - || !toc->mac || !toc->enc || !toc->dec) - error("missing algorithm implementations"); - if(strtol(cb->f[3], nil, 0) == 0){ - tr->in.new = tos; - tr->out.new = toc; - }else{ - tr->in.new = toc; - tr->out.new = tos; - } - if(tr->version == SSL3Version){ - toc->unpad = sslunpad; - tos->unpad = sslunpad; - }else{ - toc->unpad = tlsunpad; - tos->unpad = tlsunpad; - } - toc->encalg = ea->name; - toc->hashalg = ha->name; - tos->encalg = ea->name; - tos->hashalg = ha->name; - - free(x); - poperror(); - }else if(strcmp(cb->f[0], "changecipher") == 0){ - if(cb->nf != 1) - error("usage: changecipher"); - if(tr->out.new == nil) - error("cannot change cipher spec without setting secret"); - - qunlock(&tr->in.seclock); - qunlock(&tr->out.seclock); - poperror(); - free(cb); - poperror(); - - /* - * the real work is done as the message is written - * so the stream is encrypted in sync. - */ - b = allocb(1); - *b->wp++ = 1; - tlsrecwrite(tr, RChangeCipherSpec, b); - return n; - }else if(strcmp(cb->f[0], "opened") == 0){ - if(cb->nf != 1) - error("usage: opened"); - if(tr->in.sec == nil || tr->out.sec == nil) - error("cipher must be configured before enabling data messages"); - lock(&tr->statelk); - if(tr->state != SHandshake && tr->state != SOpen){ - unlock(&tr->statelk); - error("cannot enable data messages"); - } - tr->state = SOpen; - unlock(&tr->statelk); - tr->opened = 1; - }else if(strcmp(cb->f[0], "alert") == 0){ - if(cb->nf != 2) - error("usage: alert n"); - if(tr->c == nil) - error("must set fd before sending alerts"); - m = strtol(cb->f[1], nil, 0); - - qunlock(&tr->in.seclock); - qunlock(&tr->out.seclock); - poperror(); - free(cb); - poperror(); - - sendAlert(tr, m); - - if(m == ECloseNotify) - tlsclosed(tr, SLClose); - - return n; - } else if(strcmp(cb->f[0], "debug") == 0){ - if(cb->nf == 2){ - if(strcmp(cb->f[1], "on") == 0) - tr->debug = 1; - else - tr->debug = 0; - } else - tr->debug = 1; - } else - error(Ebadarg); - - qunlock(&tr->in.seclock); - qunlock(&tr->out.seclock); - poperror(); - free(cb); - poperror(); - - return n; -} - -static void -tlsinit(void) -{ - struct Encalg *e; - struct Hashalg *h; - int n; - char *cp; - static int already; - - if(!already){ - fmtinstall('H', encodefmt); - already = 1; - } - - tlsdevs = smalloc(sizeof(TlsRec*) * maxtlsdevs); - trnames = smalloc((sizeof *trnames) * maxtlsdevs); - - n = 1; - for(e = encrypttab; e->name != nil; e++) - n += strlen(e->name) + 1; - cp = encalgs = smalloc(n); - for(e = encrypttab;;){ - strcpy(cp, e->name); - cp += strlen(e->name); - e++; - if(e->name == nil) - break; - *cp++ = ' '; - } - *cp = 0; - - n = 1; - for(h = hashtab; h->name != nil; h++) - n += strlen(h->name) + 1; - cp = hashalgs = smalloc(n); - for(h = hashtab;;){ - strcpy(cp, h->name); - cp += strlen(h->name); - h++; - if(h->name == nil) - break; - *cp++ = ' '; - } - *cp = 0; -} - -Dev tlsdevtab = { - 'a', - "tls", - - devreset, - tlsinit, - devshutdown, - tlsattach, - tlswalk, - tlsstat, - tlsopen, - devcreate, - tlsclose, - tlsread, - tlsbread, - tlswrite, - tlsbwrite, - devremove, - tlswstat, -}; - -/* get channel associated with an fd */ -static Chan* -buftochan(char *p) -{ - Chan *c; - int fd; - - if(p == 0) - error(Ebadarg); - fd = strtoul(p, 0, 0); - if(fd < 0) - error(Ebadarg); - c = fdtochan(fd, -1, 0, 1); /* error check and inc ref */ - return c; -} - -static void -sendAlert(TlsRec *tr, int err) -{ - Block *b; - int i, fatal; - char *msg; - -if(tr->debug)pprint("sendAlert %d\n", err); - fatal = 1; - msg = "tls unknown alert"; - for(i=0; i < nelem(tlserrs); i++) { - if(tlserrs[i].err == err) { - msg = tlserrs[i].msg; - if(tr->version == SSL3Version) - err = tlserrs[i].sslerr; - else - err = tlserrs[i].tlserr; - fatal = tlserrs[i].fatal; - break; - } - } - - if(!waserror()){ - b = allocb(2); - *b->wp++ = fatal + 1; - *b->wp++ = err; - if(fatal) - tlsSetState(tr, SAlert, SOpen|SHandshake|SRClose); - tlsrecwrite(tr, RAlert, b); - poperror(); - } - if(fatal) - tlsError(tr, msg); -} - -static void -tlsError(TlsRec *tr, char *msg) -{ - int s; - -if(tr->debug)pprint("tleError %s\n", msg); - lock(&tr->statelk); - s = tr->state; - tr->state = SError; - if(s != SError){ - strncpy(tr->err, msg, ERRMAX - 1); - tr->err[ERRMAX - 1] = '\0'; - } - unlock(&tr->statelk); - if(s != SError) - alertHand(tr, msg); -} - -static void -tlsSetState(TlsRec *tr, int new, int old) -{ - lock(&tr->statelk); - if(tr->state & old) - tr->state = new; - unlock(&tr->statelk); -} - -/* hand up a digest connection */ -static void -tlshangup(TlsRec *tr) -{ - Block *b; - - qlock(&tr->in.io); - for(b = tr->processed; b; b = tr->processed){ - tr->processed = b->next; - freeb(b); - } - if(tr->unprocessed != nil){ - freeb(tr->unprocessed); - tr->unprocessed = nil; - } - qunlock(&tr->in.io); - - tlsSetState(tr, SClosed, ~0); -} - -static TlsRec* -newtls(Chan *ch) -{ - TlsRec **pp, **ep, **np; - char **nmp; - int t, newmax; - - if(waserror()) { - unlock(&tdlock); - nexterror(); - } - lock(&tdlock); - ep = &tlsdevs[maxtlsdevs]; - for(pp = tlsdevs; pp < ep; pp++) - if(*pp == nil) - break; - if(pp >= ep) { - if(maxtlsdevs >= MaxTlsDevs) { - unlock(&tdlock); - poperror(); - return nil; - } - newmax = 2 * maxtlsdevs; - if(newmax > MaxTlsDevs) - newmax = MaxTlsDevs; - np = smalloc(sizeof(TlsRec*) * newmax); - memmove(np, tlsdevs, sizeof(TlsRec*) * maxtlsdevs); - tlsdevs = np; - pp = &tlsdevs[maxtlsdevs]; - memset(pp, 0, sizeof(TlsRec*)*(newmax - maxtlsdevs)); - - nmp = smalloc(sizeof *nmp * newmax); - memmove(nmp, trnames, sizeof *nmp * maxtlsdevs); - trnames = nmp; - - maxtlsdevs = newmax; - } - *pp = mktlsrec(); - if(pp - tlsdevs >= tdhiwat) - tdhiwat++; - t = TYPE(ch->qid); - if(t == Qclonus) - t = Qctl; - ch->qid.path = QID(pp - tlsdevs, t); - ch->qid.vers = 0; - unlock(&tdlock); - poperror(); - return *pp; -} - -static TlsRec * -mktlsrec(void) -{ - TlsRec *tr; - - tr = mallocz(sizeof(*tr), 1); - if(tr == nil) - error(Enomem); - tr->state = SClosed; - tr->ref = 1; - kstrdup(&tr->user, up->user); - tr->perm = 0660; - return tr; -} - -static char* -tlsstate(int s) -{ - switch(s){ - case SHandshake: - return "Handshaking"; - case SOpen: - return "Established"; - case SRClose: - return "RemoteClosed"; - case SLClose: - return "LocalClosed"; - case SAlert: - return "Alerting"; - case SError: - return "Errored"; - case SClosed: - return "Closed"; - } - return "Unknown"; -} - -static void -freeSec(Secret *s) -{ - if(s != nil){ - free(s->enckey); - free(s); - } -} - -static int -noenc(Secret *unused1, uchar *unused2, int n) -{ - return n; -} - -static int -rc4enc(Secret *sec, uchar *buf, int n) -{ - rc4(sec->enckey, buf, n); - return n; -} - -static int -tlsunpad(uchar *buf, int n, int block) -{ - int pad, nn; - - pad = buf[n - 1]; - nn = n - 1 - pad; - if(nn <= 0 || n % block) - return -1; - while(--n > nn) - if(pad != buf[n - 1]) - return -1; - return nn; -} - -static int -sslunpad(uchar *buf, int n, int block) -{ - int pad, nn; - - pad = buf[n - 1]; - nn = n - 1 - pad; - if(nn <= 0 || n % block) - return -1; - return nn; -} - -static int -blockpad(uchar *buf, int n, int block) -{ - int pad, nn; - - nn = n + block; - nn -= nn % block; - pad = nn - (n + 1); - while(n < nn) - buf[n++] = pad; - return nn; -} - -static int -des3enc(Secret *sec, uchar *buf, int n) -{ - n = blockpad(buf, n, 8); - des3CBCencrypt(buf, n, sec->enckey); - return n; -} - -static int -des3dec(Secret *sec, uchar *buf, int n) -{ - des3CBCdecrypt(buf, n, sec->enckey); - return (*sec->unpad)(buf, n, 8); -} -static DigestState* -nomac(uchar *unused1, ulong unused2, uchar *unused3, ulong unused4, - uchar *unused5, DigestState *unused6) -{ - return nil; -} - -/* - * sslmac: mac calculations for ssl 3.0 only; tls 1.0 uses the standard hmac. - */ -static DigestState* -sslmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s, - DigestState*(*x)(uchar*, ulong, uchar*, DigestState*), int xlen, int padlen) -{ - int i; - uchar pad[48], innerdigest[20]; - - if(xlen > sizeof(innerdigest) - || padlen > sizeof(pad)) - return nil; - - if(klen>64) - return nil; - - /* first time through */ - if(s == nil){ - for(i=0; i<padlen; i++) - pad[i] = 0x36; - s = (*x)(key, klen, nil, nil); - s = (*x)(pad, padlen, nil, s); - if(s == nil) - return nil; - } - - s = (*x)(p, len, nil, s); - if(digest == nil) - return s; - - /* last time through */ - for(i=0; i<padlen; i++) - pad[i] = 0x5c; - (*x)(nil, 0, innerdigest, s); - s = (*x)(key, klen, nil, nil); - s = (*x)(pad, padlen, nil, s); - (*x)(innerdigest, xlen, digest, s); - return nil; -} - -static DigestState* -sslmac_sha1(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s) -{ - return sslmac_x(p, len, key, klen, digest, s, sha1, SHA1dlen, 40); -} - -static DigestState* -sslmac_md5(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s) -{ - return sslmac_x(p, len, key, klen, digest, s, md5, MD5dlen, 48); -} - -static void -sslPackMac(Secret *sec, uchar *mackey, uchar *seq, uchar *header, uchar *body, int len, uchar *mac) -{ - DigestState *s; - uchar buf[11]; - - memmove(buf, seq, 8); - buf[8] = header[0]; - buf[9] = header[3]; - buf[10] = header[4]; - - s = (*sec->mac)(buf, 11, mackey, sec->maclen, 0, 0); - (*sec->mac)(body, len, mackey, sec->maclen, mac, s); -} - -static void -tlsPackMac(Secret *sec, uchar *mackey, uchar *seq, uchar *header, uchar *body, int len, uchar *mac) -{ - DigestState *s; - uchar buf[13]; - - memmove(buf, seq, 8); - memmove(&buf[8], header, 5); - - s = (*sec->mac)(buf, 13, mackey, sec->maclen, 0, 0); - (*sec->mac)(body, len, mackey, sec->maclen, mac, s); -} - -static void -put32(uchar *p, u32int x) -{ - p[0] = x>>24; - p[1] = x>>16; - p[2] = x>>8; - p[3] = x; -} - -static void -put64(uchar *p, vlong x) -{ - put32(p, (u32int)(x >> 32)); - put32(p+4, (u32int)x); -} - -static void -put24(uchar *p, int x) -{ - p[0] = x>>16; - p[1] = x>>8; - p[2] = x; -} - -static void -put16(uchar *p, int x) -{ - p[0] = x>>8; - p[1] = x; -} - -/* -static u32int -get32(uchar *p) -{ - return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]; -} -*/ - -static int -get16(uchar *p) -{ - return (p[0]<<8)|p[1]; -} - -static char *charmap = "0123456789abcdef"; - -static void -pdump(int len, void *a, char *tag) -{ - uchar *p; - int i; - char buf[65+32]; - char *q; - - p = a; - strcpy(buf, tag); - while(len > 0){ - q = buf + strlen(tag); - for(i = 0; len > 0 && i < 32; i++){ - if(*p >= ' ' && *p < 0x7f){ - *q++ = ' '; - *q++ = *p; - } else { - *q++ = charmap[*p>>4]; - *q++ = charmap[*p & 0xf]; - } - len--; - p++; - } - *q = 0; - - if(len > 0) - pprint("%s...\n", buf); - else - pprint("%s\n", buf); - } -} diff --git a/sys/src/cmd/unix/drawterm/kern/error.c b/sys/src/cmd/unix/drawterm/kern/error.c deleted file mode 100644 index 465de475a..000000000 --- a/sys/src/cmd/unix/drawterm/kern/error.c +++ /dev/null @@ -1,50 +0,0 @@ -char Enoerror[] = "no error"; -char Emount[] = "inconsistent mount"; -char Eunmount[] = "not mounted"; -char Eunion[] = "not in union"; -char Emountrpc[] = "mount rpc error"; -char Eshutdown[] = "device shut down"; -char Enocreate[] = "mounted directory forbids creation"; -char Enonexist[] = "file does not exist"; -char Eexist[] = "file already exists"; -char Ebadsharp[] = "unknown device in # filename"; -char Enotdir[] = "not a directory"; -char Eisdir[] = "file is a directory"; -char Ebadchar[] = "bad character in file name"; -char Efilename[] = "file name syntax"; -char Eperm[] = "permission denied"; -char Ebadusefd[] = "inappropriate use of fd"; -char Ebadarg[] = "bad arg in system call"; -char Einuse[] = "device or object already in use"; -char Eio[] = "i/o error"; -char Etoobig[] = "read or write too large"; -char Etoosmall[] = "read or write too small"; -char Enoport[] = "network port not available"; -char Ehungup[] = "i/o on hungup channel"; -char Ebadctl[] = "bad process or channel control request"; -char Enodev[] = "no free devices"; -char Eprocdied[] = "process exited"; -char Enochild[] = "no living children"; -char Eioload[] = "i/o error in demand load"; -char Enovmem[] = "virtual memory allocation failed"; -char Ebadfd[] = "fd out of range or not open"; -char Enofd[] = "no free file descriptors"; -char Eisstream[] = "seek on a stream"; -char Ebadexec[] = "exec header invalid"; -char Etimedout[] = "connection timed out"; -char Econrefused[] = "connection refused"; -char Econinuse[] = "connection in use"; -char Eintr[] = "interrupted"; -char Enomem[] = "kernel allocate failed"; -char Enoswap[] = "swap space full"; -char Esoverlap[] = "segments overlap"; -char Emouseset[] = "mouse type already set"; -char Eshort[] = "i/o count too small"; -char Egreg[] = "ken has left the building"; -char Ebadspec[] = "bad attach specifier"; -char Enoreg[] = "process has no saved registers"; -char Enoattach[] = "mount/attach disallowed"; -char Eshortstat[] = "stat buffer too small"; -char Ebadstat[] = "malformed stat buffer"; -char Enegoff[] = "negative i/o offset"; -char Ecmdargs[] = "wrong #args in control message"; diff --git a/sys/src/cmd/unix/drawterm/kern/error.h b/sys/src/cmd/unix/drawterm/kern/error.h deleted file mode 100644 index 6bb87622e..000000000 --- a/sys/src/cmd/unix/drawterm/kern/error.h +++ /dev/null @@ -1,50 +0,0 @@ -extern char Enoerror[]; /* no error */ -extern char Emount[]; /* inconsistent mount */ -extern char Eunmount[]; /* not mounted */ -extern char Eunion[]; /* not in union */ -extern char Emountrpc[]; /* mount rpc error */ -extern char Eshutdown[]; /* device shut down */ -extern char Enocreate[]; /* mounted directory forbids creation */ -extern char Enonexist[]; /* file does not exist */ -extern char Eexist[]; /* file already exists */ -extern char Ebadsharp[]; /* unknown device in # filename */ -extern char Enotdir[]; /* not a directory */ -extern char Eisdir[]; /* file is a directory */ -extern char Ebadchar[]; /* bad character in file name */ -extern char Efilename[]; /* file name syntax */ -extern char Eperm[]; /* permission denied */ -extern char Ebadusefd[]; /* inappropriate use of fd */ -extern char Ebadarg[]; /* bad arg in system call */ -extern char Einuse[]; /* device or object already in use */ -extern char Eio[]; /* i/o error */ -extern char Etoobig[]; /* read or write too large */ -extern char Etoosmall[]; /* read or write too small */ -extern char Enoport[]; /* network port not available */ -extern char Ehungup[]; /* i/o on hungup channel */ -extern char Ebadctl[]; /* bad process or channel control request */ -extern char Enodev[]; /* no free devices */ -extern char Eprocdied[]; /* process exited */ -extern char Enochild[]; /* no living children */ -extern char Eioload[]; /* i/o error in demand load */ -extern char Enovmem[]; /* virtual memory allocation failed */ -extern char Ebadfd[]; /* fd out of range or not open */ -extern char Enofd[]; /* no free file descriptors */ -extern char Eisstream[]; /* seek on a stream */ -extern char Ebadexec[]; /* exec header invalid */ -extern char Etimedout[]; /* connection timed out */ -extern char Econrefused[]; /* connection refused */ -extern char Econinuse[]; /* connection in use */ -extern char Eintr[]; /* interrupted */ -extern char Enomem[]; /* kernel allocate failed */ -extern char Enoswap[]; /* swap space full */ -extern char Esoverlap[]; /* segments overlap */ -extern char Emouseset[]; /* mouse type already set */ -extern char Eshort[]; /* i/o count too small */ -extern char Egreg[]; /* ken has left the building */ -extern char Ebadspec[]; /* bad attach specifier */ -extern char Enoreg[]; /* process has no saved registers */ -extern char Enoattach[]; /* mount/attach disallowed */ -extern char Eshortstat[]; /* stat buffer too small */ -extern char Ebadstat[]; /* malformed stat buffer */ -extern char Enegoff[]; /* negative i/o offset */ -extern char Ecmdargs[]; /* wrong #args in control message */ diff --git a/sys/src/cmd/unix/drawterm/kern/exportfs.c b/sys/src/cmd/unix/drawterm/kern/exportfs.c deleted file mode 100644 index 46cb90d0c..000000000 --- a/sys/src/cmd/unix/drawterm/kern/exportfs.c +++ /dev/null @@ -1,821 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -typedef struct Fid Fid; -typedef struct Export Export; -typedef struct Exq Exq; - -#define nil ((void*)0) - -enum -{ - Nfidhash = 1, - MAXRPC = MAXMSG+MAXFDATA, - MAXDIRREAD = (MAXFDATA/DIRLEN)*DIRLEN -}; - -struct Export -{ - Ref r; - Exq* work; - Lock fidlock; - Fid* fid[Nfidhash]; - Chan* root; - Chan* io; - Pgrp* pgrp; - int npart; - char part[MAXRPC]; -}; - -struct Fid -{ - Fid* next; - Fid** last; - Chan* chan; - long offset; - int fid; - int ref; /* fcalls using the fid; locked by Export.Lock */ - int attached; /* fid attached or cloned but not clunked */ -}; - -struct Exq -{ - Lock lk; - int nointr; - int noresponse; /* don't respond to this one */ - Exq* next; - int shut; /* has been noted for shutdown */ - Export* export; - void* slave; - Fcall rpc; - char buf[MAXRPC]; -}; - -struct -{ - Lock l; - Qlock qwait; - Rendez rwait; - Exq *head; /* work waiting for a slave */ - Exq *tail; -}exq; - -static void exshutdown(Export*); -static void exflush(Export*, int, int); -static void exslave(void*); -static void exfree(Export*); -static void exportproc(Export*); - -static char* Exauth(Export*, Fcall*); -static char* Exattach(Export*, Fcall*); -static char* Exclunk(Export*, Fcall*); -static char* Excreate(Export*, Fcall*); -static char* Exopen(Export*, Fcall*); -static char* Exread(Export*, Fcall*); -static char* Exremove(Export*, Fcall*); -static char* Exstat(Export*, Fcall*); -static char* Exwalk(Export*, Fcall*); -static char* Exwrite(Export*, Fcall*); -static char* Exwstat(Export*, Fcall*); -static char* Exversion(Export*, Fcall*); - -static char *(*fcalls[Tmax])(Export*, Fcall*); - -static char Enofid[] = "no such fid"; -static char Eseekdir[] = "can't seek on a directory"; -static char Ereaddir[] = "unaligned read of a directory"; -static int exdebug = 0; - -int -sysexport(int fd) -{ - Chan *c; - Export *fs; - - if(waserror()) - return -1; - - c = fdtochan(fd, ORDWR, 1, 1); - poperror(); - c->flag |= CMSG; - - fs = mallocz(sizeof(Export)); - fs->r.ref = 1; - fs->pgrp = up->pgrp; - refinc(&fs->pgrp->r); - refinc(&up->slash->r); - fs->root = up->slash; - refinc(&fs->root->r); - fs->root = domount(fs->root); - fs->io = c; - - exportproc(fs); - - return 0; -} - -static void -exportinit(void) -{ - lock(&exq.l); - if(fcalls[Tversion] != nil) { - unlock(&exq.l); - return; - } - - fmtinstall('F', fcallfmt); - fmtinstall('D', dirfmt); - fmtinstall('M', dirmodefmt); - fcalls[Tversion] = Exversion; - fcalls[Tauth] = Exauth; - fcalls[Tattach] = Exattach; - fcalls[Twalk] = Exwalk; - fcalls[Topen] = Exopen; - fcalls[Tcreate] = Excreate; - fcalls[Tread] = Exread; - fcalls[Twrite] = Exwrite; - fcalls[Tclunk] = Exclunk; - fcalls[Tremove] = Exremove; - fcalls[Tstat] = Exstat; - fcalls[Twstat] = Exwstat; - unlock(&exq.l); -} - -void -exportproc(Export *fs) -{ - Exq *q; - char *buf; - int n, cn, len; - - exportinit(); - - for(;;){ - q = mallocz(sizeof(Exq)); - if(q == 0) - panic("no memory"); - - q->rpc.data = q->buf + MAXMSG; - - buf = q->buf; - len = MAXRPC; - if(fs->npart) { - memmove(buf, fs->part, fs->npart); - buf += fs->npart; - len -= fs->npart; - goto chk; - } - for(;;) { - if(waserror()) - goto bad; - - n = (*devtab[fs->io->type].read)(fs->io, buf, len, 0); - poperror(); - - if(n <= 0) - goto bad; - - buf += n; - len -= n; - chk: - n = buf - q->buf; - - /* convM2S returns size of correctly decoded message */ - cn = convM2S(q->buf, &q->rpc, n); - if(cn < 0){ - iprint("bad message type in devmnt\n"); - goto bad; - } - if(cn > 0) { - n -= cn; - if(n < 0){ - iprint("negative size in devmnt"); - goto bad; - } - fs->npart = n; - if(n != 0) - memmove(fs->part, q->buf+cn, n); - break; - } - } - if(exdebug) - iprint("export %d <- %F\n", getpid(), &q->rpc); - - if(q->rpc.type == Tflush){ - exflush(fs, q->rpc.tag, q->rpc.oldtag); - free(q); - continue; - } - - q->export = fs; - refinc(&fs->r); - - lock(&exq.l); - if(exq.head == nil) - exq.head = q; - else - exq.tail->next = q; - q->next = nil; - exq.tail = q; - unlock(&exq.l); - if(exq.qwait.first == nil) { - n = thread("exportfs", exslave, nil); -/* iprint("launch export (pid=%ux)\n", n); */ - } - rendwakeup(&exq.rwait); - } -bad: - free(q); - exshutdown(fs); - exfree(fs); -} - -void -exflush(Export *fs, int flushtag, int tag) -{ - Exq *q, **last; - int n; - Fcall fc; - char buf[MAXMSG]; - - /* hasn't been started? */ - lock(&exq.l); - last = &exq.head; - for(q = exq.head; q != nil; q = q->next){ - if(q->export == fs && q->rpc.tag == tag){ - *last = q->next; - unlock(&exq.l); - exfree(fs); - free(q); - goto Respond; - } - last = &q->next; - } - unlock(&exq.l); - - /* in progress? */ - lock(&fs->r.l); - for(q = fs->work; q != nil; q = q->next){ - if(q->rpc.tag == tag && !q->noresponse){ - lock(&q->lk); - q->noresponse = 1; - if(!q->nointr) - intr(q->slave); - unlock(&q->lk); - unlock(&fs->r.l); - goto Respond; - return; - } - } - unlock(&fs->r.l); - -if(exdebug) iprint("exflush: did not find rpc: %d\n", tag); - -Respond: - fc.type = Rflush; - fc.tag = flushtag; - n = convS2M(&fc, buf); -if(exdebug) iprint("exflush -> %F\n", &fc); - if(!waserror()){ - (*devtab[fs->io->type].write)(fs->io, buf, n, 0); - poperror(); - } -} - -void -exshutdown(Export *fs) -{ - Exq *q, **last; - - lock(&exq.l); - last = &exq.head; - for(q = exq.head; q != nil; q = *last){ - if(q->export == fs){ - *last = q->next; - exfree(fs); - free(q); - continue; - } - last = &q->next; - } - unlock(&exq.l); - - lock(&fs->r.l); - q = fs->work; - while(q != nil){ - if(q->shut){ - q = q->next; - continue; - } - q->shut = 1; - unlock(&fs->r.l); - /* postnote(q->slave, 1, "interrupted", NUser); */ - iprint("postnote 2!\n"); - lock(&fs->r.l); - q = fs->work; - } - unlock(&fs->r.l); -} - -void -exfree(Export *fs) -{ - Fid *f, *n; - int i; - - if(refdec(&fs->r) != 0) - return; - closepgrp(fs->pgrp); - cclose(fs->root); - cclose(fs->io); - for(i = 0; i < Nfidhash; i++){ - for(f = fs->fid[i]; f != nil; f = n){ - if(f->chan != nil) - cclose(f->chan); - n = f->next; - free(f); - } - } - free(fs); -} - -int -exwork(void *a) -{ - return exq.head != nil; -} - -void -exslave(void *a) -{ - Export *fs; - Exq *q, *t, **last; - char *err; - int n; -/* - closepgrp(up->pgrp); - up->pgrp = nil; -*/ - for(;;){ - qlock(&exq.qwait); - rendsleep(&exq.rwait, exwork, nil); - - lock(&exq.l); - q = exq.head; - if(q == nil) { - unlock(&exq.l); - qunlock(&exq.qwait); - continue; - } - exq.head = q->next; - q->slave = curthread(); - unlock(&exq.l); - - qunlock(&exq.qwait); - - q->noresponse = 0; - q->nointr = 0; - fs = q->export; - lock(&fs->r.l); - q->next = fs->work; - fs->work = q; - unlock(&fs->r.l); - - up->pgrp = q->export->pgrp; - - if(exdebug > 1) - iprint("exslave dispatch %d %F\n", getpid(), &q->rpc); - - if(waserror()){ - iprint("exslave err %r\n"); - err = up->errstr; - goto Err; - } - if(q->rpc.type >= Tmax || !fcalls[q->rpc.type]) - err = "bad fcall type"; - else - err = (*fcalls[q->rpc.type])(fs, &q->rpc); - - poperror(); - Err:; - q->rpc.type++; - if(err){ - q->rpc.type = Rerror; - strncpy(q->rpc.ename, err, ERRLEN); - } - n = convS2M(&q->rpc, q->buf); - - if(exdebug) - iprint("exslve %d -> %F\n", getpid(), &q->rpc); - - lock(&q->lk); - if(q->noresponse == 0){ - q->nointr = 1; - clearintr(); - if(!waserror()){ - (*devtab[fs->io->type].write)(fs->io, q->buf, n, 0); - poperror(); - } - } - unlock(&q->lk); - - /* - * exflush might set noresponse at this point, but - * setting noresponse means don't send a response now; - * it's okay that we sent a response already. - */ - if(exdebug > 1) - iprint("exslave %d written %d\n", getpid(), q->rpc.tag); - - lock(&fs->r.l); - last = &fs->work; - for(t = fs->work; t != nil; t = t->next){ - if(t == q){ - *last = q->next; - break; - } - last = &t->next; - } - unlock(&fs->r.l); - - exfree(q->export); - free(q); - } - iprint("exslave shut down"); - threadexit(); -} - -Fid* -Exmkfid(Export *fs, int fid) -{ - ulong h; - Fid *f, *nf; - - nf = mallocz(sizeof(Fid)); - if(nf == nil) - return nil; - lock(&fs->fidlock); - h = fid % Nfidhash; - for(f = fs->fid[h]; f != nil; f = f->next){ - if(f->fid == fid){ - unlock(&fs->fidlock); - free(nf); - return nil; - } - } - - nf->next = fs->fid[h]; - if(nf->next != nil) - nf->next->last = &nf->next; - nf->last = &fs->fid[h]; - fs->fid[h] = nf; - - nf->fid = fid; - nf->ref = 1; - nf->attached = 1; - nf->offset = 0; - nf->chan = nil; - unlock(&fs->fidlock); - return nf; -} - -Fid* -Exgetfid(Export *fs, int fid) -{ - Fid *f; - ulong h; - - lock(&fs->fidlock); - h = fid % Nfidhash; - for(f = fs->fid[h]; f; f = f->next) { - if(f->fid == fid){ - if(f->attached == 0) - break; - f->ref++; - unlock(&fs->fidlock); - return f; - } - } - unlock(&fs->fidlock); - return nil; -} - -void -Exputfid(Export *fs, Fid *f) -{ - lock(&fs->fidlock); - f->ref--; - if(f->ref == 0 && f->attached == 0){ - if(f->chan != nil) - cclose(f->chan); - f->chan = nil; - *f->last = f->next; - if(f->next != nil) - f->next->last = f->last; - unlock(&fs->fidlock); - free(f); - return; - } - unlock(&fs->fidlock); -} - -char* -Exsession(Export *e, Fcall *rpc) -{ - memset(rpc->authid, 0, sizeof(rpc->authid)); - memset(rpc->authdom, 0, sizeof(rpc->authdom)); - memset(rpc->chal, 0, sizeof(rpc->chal)); - return nil; -} - -char* -Exauth(Export *e, Fcall *f) -{ - return "authentication not required"; -} - -char* -Exattach(Export *fs, Fcall *rpc) -{ - Fid *f; - - f = Exmkfid(fs, rpc->fid); - if(f == nil) - return Einuse; - if(waserror()){ - f->attached = 0; - Exputfid(fs, f); - return up->errstr; - } - f->chan = clone(fs->root, nil); - poperror(); - rpc->qid = f->chan->qid; - Exputfid(fs, f); - return nil; -} - -char* -Exclone(Export *fs, Fcall *rpc) -{ - Fid *f, *nf; - - if(rpc->fid == rpc->newfid) - return Einuse; - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - nf = Exmkfid(fs, rpc->newfid); - if(nf == nil){ - Exputfid(fs, f); - return Einuse; - } - if(waserror()){ - Exputfid(fs, f); - Exputfid(fs, nf); - return up->errstr; - } - nf->chan = clone(f->chan, nil); - poperror(); - Exputfid(fs, f); - Exputfid(fs, nf); - return nil; -} - -char* -Exclunk(Export *fs, Fcall *rpc) -{ - Fid *f; - - f = Exgetfid(fs, rpc->fid); - if(f != nil){ - f->attached = 0; - Exputfid(fs, f); - } - return nil; -} - -char* -Exwalk(Export *fs, Fcall *rpc) -{ - Fid *f; - Chan *c; - - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - if(waserror()){ - Exputfid(fs, f); - return up->errstr; - } - c = walk(f->chan, rpc->name, 1); - if(c == nil) - error(Enonexist); - poperror(); - - f->chan = c; - rpc->qid = c->qid; - Exputfid(fs, f); - return nil; -} - -char* -Exopen(Export *fs, Fcall *rpc) -{ - Fid *f; - Chan *c; - - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - if(waserror()){ - Exputfid(fs, f); - return up->errstr; - } - c = f->chan; - c = (*devtab[c->type].open)(c, rpc->mode); - poperror(); - - f->chan = c; - f->offset = 0; - rpc->qid = f->chan->qid; - Exputfid(fs, f); - return nil; -} - -char* -Excreate(Export *fs, Fcall *rpc) -{ - Fid *f; - Chan *c; - - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - if(waserror()){ - Exputfid(fs, f); - return up->errstr; - } - c = f->chan; - if(c->mnt && !(c->flag&CCREATE)) - c = createdir(c); - (*devtab[c->type].create)(c, rpc->name, rpc->mode, rpc->perm); - poperror(); - - f->chan = c; - rpc->qid = f->chan->qid; - Exputfid(fs, f); - return nil; -} - -char* -Exread(Export *fs, Fcall *rpc) -{ - Fid *f; - Chan *c; - long off; - int dir, n, seek; - - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - - c = f->chan; - dir = c->qid.path & CHDIR; - if(dir){ - rpc->count -= rpc->count%DIRLEN; - if(rpc->offset%DIRLEN || rpc->count==0){ - Exputfid(fs, f); - return Ereaddir; - } - if(f->offset > rpc->offset){ - Exputfid(fs, f); - return Eseekdir; - } - } - - if(waserror()) { - Exputfid(fs, f); - return up->errstr; - } - - for(;;){ - n = rpc->count; - seek = 0; - off = rpc->offset; - if(dir && f->offset != off){ - off = f->offset; - n = rpc->offset - off; - if(n > MAXDIRREAD) - n = MAXDIRREAD; - seek = 1; - } - if(dir && c->mnt != nil) - n = unionread(c, rpc->data, n); - else{ - c->offset = off; - n = (*devtab[c->type].read)(c, rpc->data, n, off); - } - if(n == 0 || !seek) - break; - f->offset = off + n; - c->offset += n; - } - rpc->count = n; - poperror(); - Exputfid(fs, f); - return nil; -} - -char* -Exwrite(Export *fs, Fcall *rpc) -{ - Fid *f; - Chan *c; - - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - if(waserror()){ - Exputfid(fs, f); - return up->errstr; - } - c = f->chan; - if(c->qid.path & CHDIR) - error(Eisdir); - rpc->count = (*devtab[c->type].write)(c, rpc->data, rpc->count, rpc->offset); - poperror(); - Exputfid(fs, f); - return nil; -} - -char* -Exstat(Export *fs, Fcall *rpc) -{ - Fid *f; - Chan *c; - - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - if(waserror()){ - Exputfid(fs, f); - return up->errstr; - } - c = f->chan; - (*devtab[c->type].stat)(c, rpc->stat); - poperror(); - Exputfid(fs, f); - return nil; -} - -char* -Exwstat(Export *fs, Fcall *rpc) -{ - Fid *f; - Chan *c; - - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - if(waserror()){ - Exputfid(fs, f); - return up->errstr; - } - c = f->chan; - (*devtab[c->type].wstat)(c, rpc->stat); - poperror(); - Exputfid(fs, f); - return nil; -} - -char* -Exremove(Export *fs, Fcall *rpc) -{ - Fid *f; - Chan *c; - - f = Exgetfid(fs, rpc->fid); - if(f == nil) - return Enofid; - if(waserror()){ - Exputfid(fs, f); - return up->errstr; - } - c = f->chan; - (*devtab[c->type].remove)(c); - poperror(); - - /* - * chan is already clunked by remove. - * however, we need to recover the chan, - * and follow sysremove's lead in making to point to root. - */ - c->type = 0; - - f->attached = 0; - Exputfid(fs, f); - return nil; -} diff --git a/sys/src/cmd/unix/drawterm/kern/fns.h b/sys/src/cmd/unix/drawterm/kern/fns.h deleted file mode 100644 index 97a935941..000000000 --- a/sys/src/cmd/unix/drawterm/kern/fns.h +++ /dev/null @@ -1,392 +0,0 @@ -#define ROUND(s, sz) (((s)+((sz)-1))&~((sz)-1)) - -void accounttime(void); -void addclock0link(void (*)(void), int); -int addphysseg(Physseg*); -void addbootfile(char*, uchar*, ulong); -Block* adjustblock(Block*, int); -void alarmkproc(void*); -Block* allocb(int); -int anyhigher(void); -int anyready(void); -Page* auxpage(void); -Block* bl2mem(uchar*, Block*, int); -int blocklen(Block*); -void callwithureg(void(*)(Ureg*)); -char* c2name(Chan*); -int cangetc(void*); -int canlock(Lock*); -int canpage(Proc*); -int canputc(void*); -int canqlock(QLock*); -int canrlock(RWlock*); -void chandevinit(void); -void chandevreset(void); -void chandevshutdown(void); -void chanfree(Chan*); -void chanrec(Mnt*); -void checkalarms(void); -void checkb(Block*, char*); -void cinit(void); -Chan* cclone(Chan*); -void cclose(Chan*); -char* clipread(void); -int clipwrite(char*); -void closeegrp(Egrp*); -void closefgrp(Fgrp*); -void closemount(Mount*); -void closepgrp(Pgrp*); -void closergrp(Rgrp*); -long clrfpintr(void); -void cmderror(Cmdbuf*, char*); -int cmount(Chan**, Chan*, int, char*); -void cnameclose(Cname*); -void confinit(void); -void confinit1(int); -int consactive(void); -extern void (*consdebug)(void); -void copen(Chan*); -Block* concatblock(Block*); -Block* copyblock(Block*, int); -void copypage(Page*, Page*); -int cread(Chan*, uchar*, int, vlong); -void cunmount(Chan*, Chan*); -void cupdate(Chan*, uchar*, int, vlong); -void cwrite(Chan*, uchar*, int, vlong); -ulong dbgpc(Proc*); -int decref(Ref*); -int decrypt(void*, void*, int); -void delay(int); -Chan* devattach(int, char*); -Block* devbread(Chan*, long, ulong); -long devbwrite(Chan*, Block*, ulong); -Chan* devclone(Chan*); -int devconfig(int, char *, DevConf *); -void devcreate(Chan*, char*, int, ulong); -void devdir(Chan*, Qid, char*, vlong, char*, long, Dir*); -long devdirread(Chan*, char*, long, Dirtab*, int, Devgen*); -Devgen devgen; -void devinit(void); -int devno(int, int); -Chan* devopen(Chan*, int, Dirtab*, int, Devgen*); -void devpermcheck(char*, ulong, int); -void devpower(int); -void devremove(Chan*); -void devreset(void); -void devshutdown(void); -int devstat(Chan*, uchar*, int, Dirtab*, int, Devgen*); -Walkqid* devwalk(Chan*, Chan*, char**, int, Dirtab*, int, Devgen*); -int devwstat(Chan*, uchar*, int); -void drawactive(int); -void drawcmap(void); -int drawcanqlock(void); -void drawqlock(void); -void drawqunlock(void); -void dumpaproc(Proc*); -void dumpqueues(void); -void dumpregs(Ureg*); -void dumpstack(void); -Fgrp* dupfgrp(Fgrp*); -void duppage(Page*); -void dupswap(Page*); -int emptystr(char*); -int encrypt(void*, void*, int); -void envcpy(Egrp*, Egrp*); -int eqchan(Chan*, Chan*, int); -int eqqid(Qid, Qid); -void error(char*); -long execregs(ulong, ulong, ulong); -void exhausted(char*); -void exit(int); -uvlong fastticks(uvlong*); -int fault(ulong, int); -void fdclose(int, int); -Chan* fdtochan(int, int, int, int); -int fixfault(Segment*, ulong, int, int); -void flushmmu(void); -void forkchild(Proc*, Ureg*); -void forkret(void); -void free(void*); -void freeb(Block*); -void freeblist(Block*); -int freebroken(void); -void freepte(Segment*, Pte*); -void freesegs(int); -void freesession(Session*); -ulong getmalloctag(void*); -ulong getrealloctag(void*); -void gotolabel(Label*); -char* getconfenv(void); -int haswaitq(void*); -long hostdomainwrite(char*, int); -long hostownerwrite(char*, int); -void hzsched(void); -void iallocinit(void); -Block* iallocb(int); -void iallocsummary(void); -long ibrk(ulong, int); -void ilock(Lock*); -void iunlock(Lock*); -int incref(Ref*); -void initseg(void); -int iprint(char*, ...); -void isdir(Chan*); -int iseve(void); -#define islo() (0) -Segment* isoverlap(Proc*, ulong, int); -int ispages(void*); -int isphysseg(char*); -void ixsummary(void); -void kbdclock(void); -int kbdcr2nl(Queue*, int); -int kbdputc(Queue*, int); -void kbdrepeat(int); -long keyread(char*, int, long); -void kickpager(void); -void killbig(void); -int kproc(char*, void(*)(void*), void*); -void kprocchild(Proc*, void (*)(void*), void*); -extern void (*kproftimer)(ulong); -void ksetenv(char*, char*, int); -void kstrcpy(char*, char*, int); -void kstrdup(char**, char*); -long latin1(Rune*, int); -void lock(Lock*); -void lockinit(void); -void logopen(Log*); -void logclose(Log*); -char* logctl(Log*, int, char**, Logflag*); -void logn(Log*, int, void*, int); -long logread(Log*, void*, ulong, long); -void log(Log*, int, char*, ...); -Cmdtab* lookupcmd(Cmdbuf*, Cmdtab*, int); -void machinit(void); -void* mallocz(ulong, int); -#define malloc kmalloc -void* malloc(ulong); -void mallocsummary(void); -Block* mem2bl(uchar*, int); -void mfreeseg(Segment*, ulong, int); -void microdelay(int); -void mkqid(Qid*, vlong, ulong, int); -void mmurelease(Proc*); -void mmuswitch(Proc*); -Chan* mntauth(Chan*, char*); -void mntdump(void); -long mntversion(Chan*, char*, int, int); -void mountfree(Mount*); -ulong ms2tk(ulong); -ulong msize(void*); -ulong ms2tk(ulong); -uvlong ms2fastticks(ulong); -void muxclose(Mnt*); -Chan* namec(char*, int, int, ulong); -Chan* newchan(void); -int newfd(Chan*); -Mhead* newmhead(Chan*); -Mount* newmount(Mhead*, Chan*, int, char*); -Page* newpage(int, Segment **, ulong); -Pgrp* newpgrp(void); -Rgrp* newrgrp(void); -Proc* newproc(void); -char* nextelem(char*, char*); -void nexterror(void); -Cname* newcname(char*); -int notify(Ureg*); -int nrand(int); -int okaddr(ulong, ulong, int); -int openmode(ulong); -void oserrstr(void); -void oserror(void); -Block* packblock(Block*); -Block* padblock(Block*, int); -void pagechainhead(Page*); -void pageinit(void); -void pagersummary(void); -void panic(char*, ...); -Cmdbuf* parsecmd(char *a, int n); -ulong perfticks(void); -void pexit(char*, int); -int preempted(void); -void printinit(void); -int procindex(ulong); -void pgrpcpy(Pgrp*, Pgrp*); -void pgrpnote(ulong, char*, long, int); -Pgrp* pgrptab(int); -void pio(Segment *, ulong, ulong, Page **); -#define poperror() up->nerrlab-- -void portclock(Ureg*); -int postnote(Proc*, int, char*, int); -int pprint(char*, ...); -void prflush(void); -ulong procalarm(ulong); -int proccounter(char *name); -void procctl(Proc*); -void procdump(void); -int procfdprint(Chan*, int, int, char*, int); -void procinit0(void); -void procflushseg(Segment*); -void procpriority(Proc*, int, int); -Proc* proctab(int); -void procwired(Proc*, int); -Pte* ptealloc(void); -Pte* ptecpy(Pte*); -int pullblock(Block**, int); -Block* pullupblock(Block*, int); -Block* pullupqueue(Queue*, int); -void putmhead(Mhead*); -void putmmu(ulong, ulong, Page*); -void putpage(Page*); -void putseg(Segment*); -void putstr(char*); -void putstrn(char*, int); -void putswap(Page*); -ulong pwait(Waitmsg*); -Label* pwaserror(void); -void qaddlist(Queue*, Block*); -Block* qbread(Queue*, int); -long qbwrite(Queue*, Block*); -Queue* qbypass(void (*)(void*, Block*), void*); -int qcanread(Queue*); -void qclose(Queue*); -int qconsume(Queue*, void*, int); -Block* qcopy(Queue*, int, ulong); -int qdiscard(Queue*, int); -void qflush(Queue*); -void qfree(Queue*); -int qfull(Queue*); -Block* qget(Queue*); -void qhangup(Queue*, char*); -int qisclosed(Queue*); -void qinit(void); -int qiwrite(Queue*, void*, int); -int qlen(Queue*); -void qlock(QLock*); -Queue* qopen(int, int, void (*)(void*), void*); -int qpass(Queue*, Block*); -int qpassnolim(Queue*, Block*); -int qproduce(Queue*, void*, int); -void qputback(Queue*, Block*); -long qread(Queue*, void*, int); -Block* qremove(Queue*); -void qreopen(Queue*); -void qsetlimit(Queue*, int); -void qunlock(QLock*); -int qwindow(Queue*); -int qwrite(Queue*, void*, int); -void qnoblock(Queue*, int); -int rand(void); -void randominit(void); -ulong randomread(void*, ulong); -void rdb(void); -int readnum(ulong, char*, ulong, ulong, int); -int readstr(ulong, char*, ulong, char*); -void ready(Proc*); -void rebootcmd(int, char**); -void reboot(void*, void*, ulong); -void relocateseg(Segment*, ulong); -void renameuser(char*, char*); -void resched(char*); -void resrcwait(char*); -int return0(void*); -void rlock(RWlock*); -long rtctime(void); -void runlock(RWlock*); -Proc* runproc(void); -void savefpregs(FPsave*); -extern void (*saveintrts)(void); -void sched(void); -void scheddump(void); -void schedinit(void); -extern void (*screenputs)(char*, int); -long seconds(void); -ulong segattach(Proc*, ulong, char *, ulong, ulong); -void segclock(ulong); -void segpage(Segment*, Page*); -void setkernur(Ureg*, Proc*); -int setlabel(Label*); -void setmalloctag(void*, uintptr); -void setrealloctag(void*, ulong); -void setregisters(Ureg*, char*, char*, int); -void setswapchan(Chan*); -long showfilewrite(char*, int); -char* skipslash(char*); -void sleep(Rendez*, int(*)(void*), void*); -void* smalloc(ulong); -int splhi(void); -int spllo(void); -void splx(int); -void splxpc(int); -char* srvname(Chan*); -int swapcount(ulong); -int swapfull(void); -void swapinit(void); -void timeradd(Timer*); -void timerdel(Timer*); -void timersinit(void); -void timerintr(Ureg*, uvlong); -void timerset(uvlong); -ulong tk2ms(ulong); -#define TK2MS(x) ((x)*(1000/HZ)) -vlong todget(vlong*); -void todfix(void); -void todsetfreq(vlong); -void todinit(void); -void todset(vlong, vlong, int); -Block* trimblock(Block*, int, int); -void tsleep(Rendez*, int (*)(void*), void*, int); -int uartctl(Uart*, char*); -int uartgetc(void); -void uartkick(void*); -void uartmouse(Uart*, int (*)(Queue*, int), int); -void uartputc(int); -void uartputs(char*, int); -void uartrecv(Uart*, char); -Uart* uartsetup(Uart*); -int uartstageoutput(Uart*); -void unbreak(Proc*); -void uncachepage(Page*); -long unionread(Chan*, void*, long); -void unlock(Lock*); -Proc** uploc(void); -void userinit(void); -ulong userpc(void); -long userwrite(char*, int); -#define validaddr(a, b, c) -void validname(char*, int); -void validstat(uchar*, int); -void vcacheinval(Page*, ulong); -void* vmemchr(void*, int, int); -Proc* wakeup(Rendez*); -int walk(Chan**, char**, int, int, int*); -#define waserror() (setjmp(pwaserror()->buf)) -void wlock(RWlock*); -void wunlock(RWlock*); -void* xalloc(ulong); -void* xallocz(ulong, int); -void xfree(void*); -void xhole(ulong, ulong); -void xinit(void); -int xmerge(void*, void*); -void* xspanalloc(ulong, int, ulong); -void xsummary(void); -void yield(void); -Segment* data2txt(Segment*); -Segment* dupseg(Segment**, int, int); -Segment* newseg(int, ulong, ulong); -Segment* seg(Proc*, ulong, int); -void hnputv(void*, vlong); -void hnputl(void*, ulong); -void hnputs(void*, ushort); -vlong nhgetv(void*); -ulong nhgetl(void*); -ushort nhgets(void*); -ulong ticks(void); -void osproc(Proc*); -void osnewproc(Proc*); -void procsleep(void); -void procwakeup(Proc*); -void osinit(void); -void screeninit(void); -extern void terminit(void); - diff --git a/sys/src/cmd/unix/drawterm/kern/netif.h b/sys/src/cmd/unix/drawterm/kern/netif.h deleted file mode 100644 index 06c42aec8..000000000 --- a/sys/src/cmd/unix/drawterm/kern/netif.h +++ /dev/null @@ -1,133 +0,0 @@ -typedef struct Etherpkt Etherpkt; -typedef struct Netaddr Netaddr; -typedef struct Netfile Netfile; -typedef struct Netif Netif; - -enum -{ - Nmaxaddr= 64, - Nmhash= 31, - - Ncloneqid= 1, - Naddrqid, - N2ndqid, - N3rdqid, - Ndataqid, - Nctlqid, - Nstatqid, - Ntypeqid, - Nifstatqid, -}; - -/* - * Macros to manage Qid's used for multiplexed devices - */ -#define NETTYPE(x) (((ulong)x)&0x1f) -#define NETID(x) ((((ulong)x))>>5) -#define NETQID(i,t) ((((ulong)i)<<5)|(t)) - -/* - * one per multiplexed connection - */ -struct Netfile -{ - QLock lk; - - int inuse; - ulong mode; - char owner[KNAMELEN]; - - int type; /* multiplexor type */ - int prom; /* promiscuous mode */ - int scan; /* base station scanning interval */ - int bridge; /* bridge mode */ - int headersonly; /* headers only - no data */ - uchar maddr[8]; /* bitmask of multicast addresses requested */ - int nmaddr; /* number of multicast addresses */ - - Queue *in; /* input buffer */ -}; - -/* - * a network address - */ -struct Netaddr -{ - Netaddr *next; /* allocation chain */ - Netaddr *hnext; - uchar addr[Nmaxaddr]; - int ref; -}; - -/* - * a network interface - */ -struct Netif -{ - QLock lk; - - /* multiplexing */ - char name[KNAMELEN]; /* for top level directory */ - int nfile; /* max number of Netfiles */ - Netfile **f; - - /* about net */ - int limit; /* flow control */ - int alen; /* address length */ - int mbps; /* megabits per sec */ - uchar addr[Nmaxaddr]; - uchar bcast[Nmaxaddr]; - Netaddr *maddr; /* known multicast addresses */ - int nmaddr; /* number of known multicast addresses */ - Netaddr *mhash[Nmhash]; /* hash table of multicast addresses */ - int prom; /* number of promiscuous opens */ - int scan; /* number of base station scanners */ - int all; /* number of -1 multiplexors */ - - /* statistics */ - int misses; - int inpackets; - int outpackets; - int crcs; /* input crc errors */ - int oerrs; /* output errors */ - int frames; /* framing errors */ - int overflows; /* packet overflows */ - int buffs; /* buffering errors */ - int soverflows; /* software overflow */ - - /* routines for touching the hardware */ - void *arg; - void (*promiscuous)(void*, int); - void (*multicast)(void*, uchar*, int); - void (*scanbs)(void*, uint); /* scan for base stations */ -}; - -void netifinit(Netif*, char*, int, ulong); -Walkqid* netifwalk(Netif*, Chan*, Chan*, char **, int); -Chan* netifopen(Netif*, Chan*, int); -void netifclose(Netif*, Chan*); -long netifread(Netif*, Chan*, void*, long, ulong); -Block* netifbread(Netif*, Chan*, long, ulong); -long netifwrite(Netif*, Chan*, void*, long); -int netifwstat(Netif*, Chan*, uchar*, int); -int netifstat(Netif*, Chan*, uchar*, int); -int activemulti(Netif*, uchar*, int); - -/* - * Ethernet specific - */ -enum -{ - Eaddrlen= 6, - ETHERMINTU = 60, /* minimum transmit size */ - ETHERMAXTU = 1514, /* maximum transmit size */ - ETHERHDRSIZE = 14, /* size of an ethernet header */ -}; - -struct Etherpkt -{ - uchar d[Eaddrlen]; - uchar s[Eaddrlen]; - uchar type[2]; - uchar data[1500]; -}; diff --git a/sys/src/cmd/unix/drawterm/kern/parse.c b/sys/src/cmd/unix/drawterm/kern/parse.c deleted file mode 100644 index 8c991f8dc..000000000 --- a/sys/src/cmd/unix/drawterm/kern/parse.c +++ /dev/null @@ -1,113 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -/* - * Generous estimate of number of fields, including terminal nil pointer - */ -static int -ncmdfield(char *p, int n) -{ - int white, nwhite; - char *ep; - int nf; - - if(p == nil) - return 1; - - nf = 0; - ep = p+n; - white = 1; /* first text will start field */ - while(p < ep){ - nwhite = (strchr(" \t\r\n", *p++ & 0xFF) != 0); /* UTF is irrelevant */ - if(white && !nwhite) /* beginning of field */ - nf++; - white = nwhite; - } - return nf+1; /* +1 for nil */ -} - -/* - * parse a command written to a device - */ -Cmdbuf* -parsecmd(char *p, int n) -{ - Cmdbuf *volatile cb; - int nf; - char *sp; - - nf = ncmdfield(p, n); - - /* allocate Cmdbuf plus string pointers plus copy of string including \0 */ - sp = smalloc(sizeof(*cb) + nf * sizeof(char*) + n + 1); - cb = (Cmdbuf*)sp; - cb->f = (char**)(&cb[1]); - cb->buf = (char*)(&cb->f[nf]); - - if(up!=nil && waserror()){ - free(cb); - nexterror(); - } - memmove(cb->buf, p, n); - if(up != nil) - poperror(); - - /* dump new line and null terminate */ - if(n > 0 && cb->buf[n-1] == '\n') - n--; - cb->buf[n] = '\0'; - - cb->nf = tokenize(cb->buf, cb->f, nf-1); - cb->f[cb->nf] = nil; - - return cb; -} - -/* - * Reconstruct original message, for error diagnostic - */ -void -cmderror(Cmdbuf *cb, char *s) -{ - int i; - char *p, *e; - - p = up->genbuf; - e = p+ERRMAX-10; - p = seprint(p, e, "%s \"", s); - for(i=0; i<cb->nf; i++){ - if(i > 0) - p = seprint(p, e, " "); - p = seprint(p, e, "%q", cb->f[i]); - } - strcpy(p, "\""); - error(up->genbuf); -} - -/* - * Look up entry in table - */ -Cmdtab* -lookupcmd(Cmdbuf *cb, Cmdtab *ctab, int nctab) -{ - int i; - Cmdtab *ct; - - if(cb->nf == 0) - error("empty control message"); - - for(ct = ctab, i=0; i<nctab; i++, ct++){ - if(strcmp(ct->cmd, "*") !=0) /* wildcard always matches */ - if(strcmp(ct->cmd, cb->f[0]) != 0) - continue; - if(ct->narg != 0 && ct->narg != cb->nf) - cmderror(cb, Ecmdargs); - return ct; - } - - cmderror(cb, "unknown control message"); - return nil; -} diff --git a/sys/src/cmd/unix/drawterm/kern/pgrp.c b/sys/src/cmd/unix/drawterm/kern/pgrp.c deleted file mode 100644 index 30b1f3e7b..000000000 --- a/sys/src/cmd/unix/drawterm/kern/pgrp.c +++ /dev/null @@ -1,272 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -static Ref pgrpid; -static Ref mountid; - -#ifdef NOTDEF -void -pgrpnote(ulong noteid, char *a, long n, int flag) -{ - Proc *p, *ep; - char buf[ERRMAX]; - - if(n >= ERRMAX-1) - error(Etoobig); - - memmove(buf, a, n); - buf[n] = 0; - p = proctab(0); - ep = p+conf.nproc; - for(; p < ep; p++) { - if(p->state == Dead) - continue; - if(up != p && p->noteid == noteid && p->kp == 0) { - qlock(&p->debug); - if(p->pid == 0 || p->noteid != noteid){ - qunlock(&p->debug); - continue; - } - if(!waserror()) { - postnote(p, 0, buf, flag); - poperror(); - } - qunlock(&p->debug); - } - } -} -#endif - -Pgrp* -newpgrp(void) -{ - Pgrp *p; - - p = smalloc(sizeof(Pgrp)); - p->ref.ref = 1; - p->pgrpid = incref(&pgrpid); - return p; -} - -Rgrp* -newrgrp(void) -{ - Rgrp *r; - - r = smalloc(sizeof(Rgrp)); - r->ref.ref = 1; - return r; -} - -void -closergrp(Rgrp *r) -{ - if(decref(&r->ref) == 0) - free(r); -} - -void -closepgrp(Pgrp *p) -{ - Mhead **h, **e, *f, *next; - - if(decref(&p->ref) != 0) - return; - - qlock(&p->debug); - wlock(&p->ns); - p->pgrpid = -1; - - e = &p->mnthash[MNTHASH]; - for(h = p->mnthash; h < e; h++) { - for(f = *h; f; f = next) { - wlock(&f->lock); - cclose(f->from); - mountfree(f->mount); - f->mount = nil; - next = f->hash; - wunlock(&f->lock); - putmhead(f); - } - } - wunlock(&p->ns); - qunlock(&p->debug); - free(p); -} - -void -pgrpinsert(Mount **order, Mount *m) -{ - Mount *f; - - m->order = 0; - if(*order == 0) { - *order = m; - return; - } - for(f = *order; f; f = f->order) { - if(m->mountid < f->mountid) { - m->order = f; - *order = m; - return; - } - order = &f->order; - } - *order = m; -} - -/* - * pgrpcpy MUST preserve the mountid allocation order of the parent group - */ -void -pgrpcpy(Pgrp *to, Pgrp *from) -{ - int i; - Mount *n, *m, **link, *order; - Mhead *f, **tom, **l, *mh; - - wlock(&from->ns); - order = 0; - tom = to->mnthash; - for(i = 0; i < MNTHASH; i++) { - l = tom++; - for(f = from->mnthash[i]; f; f = f->hash) { - rlock(&f->lock); - mh = newmhead(f->from); - *l = mh; - l = &mh->hash; - link = &mh->mount; - for(m = f->mount; m; m = m->next) { - n = newmount(mh, m->to, m->mflag, m->spec); - m->copy = n; - pgrpinsert(&order, m); - *link = n; - link = &n->next; - } - runlock(&f->lock); - } - } - /* - * Allocate mount ids in the same sequence as the parent group - */ - lock(&mountid.lk); - for(m = order; m; m = m->order) - m->copy->mountid = mountid.ref++; - unlock(&mountid.lk); - wunlock(&from->ns); -} - -Fgrp* -dupfgrp(Fgrp *f) -{ - Fgrp *new; - Chan *c; - int i; - - new = smalloc(sizeof(Fgrp)); - if(f == nil){ - new->fd = smalloc(DELTAFD*sizeof(Chan*)); - new->nfd = DELTAFD; - new->ref.ref = 1; - return new; - } - - lock(&f->ref.lk); - /* Make new fd list shorter if possible, preserving quantization */ - new->nfd = f->maxfd+1; - i = new->nfd%DELTAFD; - if(i != 0) - new->nfd += DELTAFD - i; - new->fd = malloc(new->nfd*sizeof(Chan*)); - if(new->fd == 0){ - unlock(&f->ref.lk); - error("no memory for fgrp"); - } - new->ref.ref = 1; - - new->maxfd = f->maxfd; - for(i = 0; i <= f->maxfd; i++) { - if((c = f->fd[i])){ - incref(&c->ref); - new->fd[i] = c; - } - } - unlock(&f->ref.lk); - - return new; -} - -void -closefgrp(Fgrp *f) -{ - int i; - Chan *c; - - if(f == 0) - return; - - if(decref(&f->ref) != 0) - return; - - for(i = 0; i <= f->maxfd; i++) - if((c = f->fd[i])) - cclose(c); - - free(f->fd); - free(f); -} - -Mount* -newmount(Mhead *mh, Chan *to, int flag, char *spec) -{ - Mount *m; - - m = smalloc(sizeof(Mount)); - m->to = to; - m->head = mh; - incref(&to->ref); - m->mountid = incref(&mountid); - m->mflag = flag; - if(spec != 0) - kstrdup(&m->spec, spec); - - return m; -} - -void -mountfree(Mount *m) -{ - Mount *f; - - while(m) { - f = m->next; - cclose(m->to); - m->mountid = 0; - free(m->spec); - free(m); - m = f; - } -} - -#ifdef NOTDEF -void -resrcwait(char *reason) -{ - char *p; - - if(up == 0) - panic("resrcwait"); - - p = up->psstate; - if(reason) { - up->psstate = reason; - print("%s\n", reason); - } - - tsleep(&up->sleep, return0, 0, 300); - up->psstate = p; -} -#endif diff --git a/sys/src/cmd/unix/drawterm/kern/posix.c b/sys/src/cmd/unix/drawterm/kern/posix.c deleted file mode 100644 index 069d6531f..000000000 --- a/sys/src/cmd/unix/drawterm/kern/posix.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Posix generic OS implementation for drawterm. - */ - -#include "u.h" - -#ifndef _XOPEN_SOURCE /* for Apple and OpenBSD; not sure if needed */ -#define _XOPEN_SOURCE 500 -#endif - -#include <pthread.h> -#include <time.h> -#include <sys/time.h> -#include <sys/select.h> -#include <signal.h> -#include <pwd.h> -#include <errno.h> - -#include "lib.h" -#include "dat.h" -#include "fns.h" - -typedef struct Oproc Oproc; -struct Oproc -{ - int nsleep; - int nwakeup; - pthread_mutex_t mutex; - pthread_cond_t cond; -}; - -static pthread_key_t prdakey; - -Proc* -_getproc(void) -{ - void *v; - - if((v = pthread_getspecific(prdakey)) == nil) - panic("cannot getspecific"); - return v; -} - -void -_setproc(Proc *p) -{ - if(pthread_setspecific(prdakey, p) != 0) - panic("cannot setspecific"); -} - -void -osinit(void) -{ - if(pthread_key_create(&prdakey, 0)) - panic("cannot pthread_key_create"); -} - -#undef pipe -void -osnewproc(Proc *p) -{ - Oproc *op; - pthread_mutexattr_t attr; - - op = (Oproc*)p->oproc; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); - pthread_mutex_init(&op->mutex, &attr); - pthread_mutexattr_destroy(&attr); - pthread_cond_init(&op->cond, 0); -} - -void -osmsleep(int ms) -{ - struct timeval tv; - - tv.tv_sec = ms / 1000; - tv.tv_usec = (ms % 1000) * 1000; /* micro */ - if(select(0, NULL, NULL, NULL, &tv) < 0) - panic("select"); -} - -void -osyield(void) -{ - sched_yield(); -} - -void -oserrstr(void) -{ - char *p; - - if((p = strerror(errno)) != nil) - strecpy(up->errstr, up->errstr+ERRMAX, p); - else - snprint(up->errstr, ERRMAX, "unix error %d", errno); -} - -void -oserror(void) -{ - oserrstr(); - nexterror(); -} - -static void* tramp(void*); - -void -osproc(Proc *p) -{ - pthread_t pid; - - if(pthread_create(&pid, nil, tramp, p)){ - oserrstr(); - panic("osproc: %r"); - } - sched_yield(); -} - -static void* -tramp(void *vp) -{ - Proc *p; - - p = vp; - if(pthread_setspecific(prdakey, p)) - panic("cannot setspecific"); - (*p->fn)(p->arg); - /* BUG: leaks Proc */ - pthread_setspecific(prdakey, 0); - pthread_exit(0); - return 0; -} - -void -procsleep(void) -{ - Proc *p; - Oproc *op; - - p = up; - op = (Oproc*)p->oproc; - pthread_mutex_lock(&op->mutex); - op->nsleep++; - while(op->nsleep > op->nwakeup) - pthread_cond_wait(&op->cond, &op->mutex); - pthread_mutex_unlock(&op->mutex); -} - -void -procwakeup(Proc *p) -{ - Oproc *op; - - op = (Oproc*)p->oproc; - pthread_mutex_lock(&op->mutex); - op->nwakeup++; - if(op->nwakeup == op->nsleep) - pthread_cond_signal(&op->cond); - pthread_mutex_unlock(&op->mutex); -} - -int randfd; -#undef open -void -randominit(void) -{ -#ifdef USE_RANDOM - srandom(getpid()+fastticks(nil)+ticks()); -#else - if((randfd = open("/dev/urandom", OREAD)) < 0) - if((randfd = open("/dev/random", OREAD)) < 0) - panic("open /dev/random: %r"); -#endif -} - -#undef read -ulong -randomread(void *v, ulong n) -{ -#ifdef USE_RANDOM - int i; - - for(i=0; i<n; i++) - ((uchar*)v)[i] = random(); - return n; -#else - int m; - - if((m = read(randfd, v, n)) != n) - panic("short read from /dev/random: %d but %d", n, m); - return m; -#endif -} - -#undef time -long -seconds(void) -{ - return time(0); -} - -ulong -ticks(void) -{ - static long sec0 = 0, usec0; - struct timeval t; - - if(gettimeofday(&t, nil) < 0) - return 0; - if(sec0 == 0){ - sec0 = t.tv_sec; - usec0 = t.tv_usec; - } - return (t.tv_sec-sec0)*1000+(t.tv_usec-usec0+500)/1000; -} - -long -showfilewrite(char *a, int n) -{ - error("not implemented"); - return -1; -} diff --git a/sys/src/cmd/unix/drawterm/kern/procinit.c b/sys/src/cmd/unix/drawterm/kern/procinit.c deleted file mode 100644 index b2299d963..000000000 --- a/sys/src/cmd/unix/drawterm/kern/procinit.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -Rgrp *thergrp; - -void -procinit0(void) -{ - Proc *p; - - p = newproc(); - p->fgrp = dupfgrp(nil); - p->rgrp = newrgrp(); - p->pgrp = newpgrp(); - _setproc(p); - - up->slash = namec("#/", Atodir, 0, 0); - cnameclose(up->slash->name); - up->slash->name = newcname("/"); - up->dot = cclone(up->slash); -} - -Ref pidref; - -Proc* -newproc(void) -{ - Proc *p; - - p = mallocz(sizeof(Proc), 1); - p->pid = incref(&pidref); - strcpy(p->user, eve); - p->syserrstr = p->errbuf0; - p->errstr = p->errbuf1; - strcpy(p->text, "drawterm"); - osnewproc(p); - return p; -} - -int -kproc(char *name, void (*fn)(void*), void *arg) -{ - Proc *p; - - p = newproc(); - p->fn = fn; - p->arg = arg; - p->slash = cclone(up->slash); - p->dot = cclone(up->dot); - p->rgrp = up->rgrp; - if(p->rgrp) - incref(&p->rgrp->ref); - p->pgrp = up->pgrp; - if(up->pgrp) - incref(&up->pgrp->ref); - p->fgrp = up->fgrp; - if(p->fgrp) - incref(&p->fgrp->ref); - strecpy(p->text, p->text+sizeof p->text, name); - - osproc(p); - return p->pid; -} - diff --git a/sys/src/cmd/unix/drawterm/kern/qio.c b/sys/src/cmd/unix/drawterm/kern/qio.c deleted file mode 100644 index edee200be..000000000 --- a/sys/src/cmd/unix/drawterm/kern/qio.c +++ /dev/null @@ -1,1524 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -static ulong padblockcnt; -static ulong concatblockcnt; -static ulong pullupblockcnt; -static ulong copyblockcnt; -static ulong consumecnt; -static ulong producecnt; -static ulong qcopycnt; - -static int debugging; - -#define QDEBUG if(0) - -/* - * IO queues - */ -struct Queue -{ - Lock lk; - - Block* bfirst; /* buffer */ - Block* blast; - - int len; /* bytes allocated to queue */ - int dlen; /* data bytes in queue */ - int limit; /* max bytes in queue */ - int inilim; /* initial limit */ - int state; - int noblock; /* true if writes return immediately when q full */ - int eof; /* number of eofs read by user */ - - void (*kick)(void*); /* restart output */ - void (*bypass)(void*, Block*); /* bypass queue altogether */ - void* arg; /* argument to kick */ - - QLock rlock; /* mutex for reading processes */ - Rendez rr; /* process waiting to read */ - QLock wlock; /* mutex for writing processes */ - Rendez wr; /* process waiting to write */ - - char err[ERRMAX]; -}; - -enum -{ - Maxatomic = 64*1024, -}; - -uint qiomaxatomic = Maxatomic; - -void -ixsummary(void) -{ - debugging ^= 1; - iallocsummary(); - print("pad %lud, concat %lud, pullup %lud, copy %lud\n", - padblockcnt, concatblockcnt, pullupblockcnt, copyblockcnt); - print("consume %lud, produce %lud, qcopy %lud\n", - consumecnt, producecnt, qcopycnt); -} - -/* - * free a list of blocks - */ -void -freeblist(Block *b) -{ - Block *next; - - for(; b != 0; b = next){ - next = b->next; - b->next = 0; - freeb(b); - } -} - -/* - * pad a block to the front (or the back if size is negative) - */ -Block* -padblock(Block *bp, int size) -{ - int n; - Block *nbp; - - QDEBUG checkb(bp, "padblock 1"); - if(size >= 0){ - if(bp->rp - bp->base >= size){ - bp->rp -= size; - return bp; - } - - if(bp->next) - panic("padblock 0x%p", getcallerpc(&bp)); - n = BLEN(bp); - padblockcnt++; - nbp = allocb(size+n); - nbp->rp += size; - nbp->wp = nbp->rp; - memmove(nbp->wp, bp->rp, n); - nbp->wp += n; - freeb(bp); - nbp->rp -= size; - } else { - size = -size; - - if(bp->next) - panic("padblock 0x%p", getcallerpc(&bp)); - - if(bp->lim - bp->wp >= size) - return bp; - - n = BLEN(bp); - padblockcnt++; - nbp = allocb(size+n); - memmove(nbp->wp, bp->rp, n); - nbp->wp += n; - freeb(bp); - } - QDEBUG checkb(nbp, "padblock 1"); - return nbp; -} - -/* - * return count of bytes in a string of blocks - */ -int -blocklen(Block *bp) -{ - int len; - - len = 0; - while(bp) { - len += BLEN(bp); - bp = bp->next; - } - return len; -} - -/* - * return count of space in blocks - */ -int -blockalloclen(Block *bp) -{ - int len; - - len = 0; - while(bp) { - len += BALLOC(bp); - bp = bp->next; - } - return len; -} - -/* - * copy the string of blocks into - * a single block and free the string - */ -Block* -concatblock(Block *bp) -{ - int len; - Block *nb, *f; - - if(bp->next == 0) - return bp; - - nb = allocb(blocklen(bp)); - for(f = bp; f; f = f->next) { - len = BLEN(f); - memmove(nb->wp, f->rp, len); - nb->wp += len; - } - concatblockcnt += BLEN(nb); - freeblist(bp); - QDEBUG checkb(nb, "concatblock 1"); - return nb; -} - -/* - * make sure the first block has at least n bytes - */ -Block* -pullupblock(Block *bp, int n) -{ - int i; - Block *nbp; - - /* - * this should almost always be true, it's - * just to avoid every caller checking. - */ - if(BLEN(bp) >= n) - return bp; - - /* - * if not enough room in the first block, - * add another to the front of the list. - */ - if(bp->lim - bp->rp < n){ - nbp = allocb(n); - nbp->next = bp; - bp = nbp; - } - - /* - * copy bytes from the trailing blocks into the first - */ - n -= BLEN(bp); - while((nbp = bp->next)){ - i = BLEN(nbp); - if(i > n) { - memmove(bp->wp, nbp->rp, n); - pullupblockcnt++; - bp->wp += n; - nbp->rp += n; - QDEBUG checkb(bp, "pullupblock 1"); - return bp; - } else { - /* shouldn't happen but why crash if it does */ - if(i < 0){ - print("pullup negative length packet\n"); - i = 0; - } - memmove(bp->wp, nbp->rp, i); - pullupblockcnt++; - bp->wp += i; - bp->next = nbp->next; - nbp->next = 0; - freeb(nbp); - n -= i; - if(n == 0){ - QDEBUG checkb(bp, "pullupblock 2"); - return bp; - } - } - } - freeb(bp); - return 0; -} - -/* - * make sure the first block has at least n bytes - */ -Block* -pullupqueue(Queue *q, int n) -{ - Block *b; - - if(BLEN(q->bfirst) >= n) - return q->bfirst; - q->bfirst = pullupblock(q->bfirst, n); - for(b = q->bfirst; b != nil && b->next != nil; b = b->next) - ; - q->blast = b; - return q->bfirst; -} - -/* - * trim to len bytes starting at offset - */ -Block * -trimblock(Block *bp, int offset, int len) -{ - ulong l; - Block *nb, *startb; - - QDEBUG checkb(bp, "trimblock 1"); - if(blocklen(bp) < offset+len) { - freeblist(bp); - return nil; - } - - while((l = BLEN(bp)) < offset) { - offset -= l; - nb = bp->next; - bp->next = nil; - freeb(bp); - bp = nb; - } - - startb = bp; - bp->rp += offset; - - while((l = BLEN(bp)) < len) { - len -= l; - bp = bp->next; - } - - bp->wp -= (BLEN(bp) - len); - - if(bp->next) { - freeblist(bp->next); - bp->next = nil; - } - - return startb; -} - -/* - * copy 'count' bytes into a new block - */ -Block* -copyblock(Block *bp, int count) -{ - int l; - Block *nbp; - - QDEBUG checkb(bp, "copyblock 0"); - nbp = allocb(count); - for(; count > 0 && bp != 0; bp = bp->next){ - l = BLEN(bp); - if(l > count) - l = count; - memmove(nbp->wp, bp->rp, l); - nbp->wp += l; - count -= l; - } - if(count > 0){ - memset(nbp->wp, 0, count); - nbp->wp += count; - } - copyblockcnt++; - QDEBUG checkb(nbp, "copyblock 1"); - - return nbp; -} - -Block* -adjustblock(Block* bp, int len) -{ - int n; - Block *nbp; - - if(len < 0){ - freeb(bp); - return nil; - } - - if(bp->rp+len > bp->lim){ - nbp = copyblock(bp, len); - freeblist(bp); - QDEBUG checkb(nbp, "adjustblock 1"); - - return nbp; - } - - n = BLEN(bp); - if(len > n) - memset(bp->wp, 0, len-n); - bp->wp = bp->rp+len; - QDEBUG checkb(bp, "adjustblock 2"); - - return bp; -} - - -/* - * throw away up to count bytes from a - * list of blocks. Return count of bytes - * thrown away. - */ -int -pullblock(Block **bph, int count) -{ - Block *bp; - int n, bytes; - - bytes = 0; - if(bph == nil) - return 0; - - while(*bph != nil && count != 0) { - bp = *bph; - n = BLEN(bp); - if(count < n) - n = count; - bytes += n; - count -= n; - bp->rp += n; - QDEBUG checkb(bp, "pullblock "); - if(BLEN(bp) == 0) { - *bph = bp->next; - bp->next = nil; - freeb(bp); - } - } - return bytes; -} - -/* - * get next block from a queue, return null if nothing there - */ -Block* -qget(Queue *q) -{ - int dowakeup; - Block *b; - - /* sync with qwrite */ - ilock(&q->lk); - - b = q->bfirst; - if(b == nil){ - q->state |= Qstarve; - iunlock(&q->lk); - return nil; - } - q->bfirst = b->next; - b->next = 0; - q->len -= BALLOC(b); - q->dlen -= BLEN(b); - QDEBUG checkb(b, "qget"); - - /* if writer flow controlled, restart */ - if((q->state & Qflow) && q->len < q->limit/2){ - q->state &= ~Qflow; - dowakeup = 1; - } else - dowakeup = 0; - - iunlock(&q->lk); - - if(dowakeup) - wakeup(&q->wr); - - return b; -} - -/* - * throw away the next 'len' bytes in the queue - */ -int -qdiscard(Queue *q, int len) -{ - Block *b; - int dowakeup, n, sofar; - - ilock(&q->lk); - for(sofar = 0; sofar < len; sofar += n){ - b = q->bfirst; - if(b == nil) - break; - QDEBUG checkb(b, "qdiscard"); - n = BLEN(b); - if(n <= len - sofar){ - q->bfirst = b->next; - b->next = 0; - q->len -= BALLOC(b); - q->dlen -= BLEN(b); - freeb(b); - } else { - n = len - sofar; - b->rp += n; - q->dlen -= n; - } - } - - /* - * if writer flow controlled, restart - * - * This used to be - * q->len < q->limit/2 - * but it slows down tcp too much for certain write sizes. - * I really don't understand it completely. It may be - * due to the queue draining so fast that the transmission - * stalls waiting for the app to produce more data. - presotto - */ - if((q->state & Qflow) && q->len < q->limit){ - q->state &= ~Qflow; - dowakeup = 1; - } else - dowakeup = 0; - - iunlock(&q->lk); - - if(dowakeup) - wakeup(&q->wr); - - return sofar; -} - -/* - * Interrupt level copy out of a queue, return # bytes copied. - */ -int -qconsume(Queue *q, void *vp, int len) -{ - Block *b; - int n, dowakeup; - uchar *p = vp; - Block *tofree = nil; - - /* sync with qwrite */ - ilock(&q->lk); - - for(;;) { - b = q->bfirst; - if(b == 0){ - q->state |= Qstarve; - iunlock(&q->lk); - return -1; - } - QDEBUG checkb(b, "qconsume 1"); - - n = BLEN(b); - if(n > 0) - break; - q->bfirst = b->next; - q->len -= BALLOC(b); - - /* remember to free this */ - b->next = tofree; - tofree = b; - }; - - if(n < len) - len = n; - memmove(p, b->rp, len); - consumecnt += n; - b->rp += len; - q->dlen -= len; - - /* discard the block if we're done with it */ - if((q->state & Qmsg) || len == n){ - q->bfirst = b->next; - b->next = 0; - q->len -= BALLOC(b); - q->dlen -= BLEN(b); - - /* remember to free this */ - b->next = tofree; - tofree = b; - } - - /* if writer flow controlled, restart */ - if((q->state & Qflow) && q->len < q->limit/2){ - q->state &= ~Qflow; - dowakeup = 1; - } else - dowakeup = 0; - - iunlock(&q->lk); - - if(dowakeup) - wakeup(&q->wr); - - if(tofree != nil) - freeblist(tofree); - - return len; -} - -int -qpass(Queue *q, Block *b) -{ - int dlen, len, dowakeup; - - /* sync with qread */ - dowakeup = 0; - ilock(&q->lk); - if(q->len >= q->limit){ - freeblist(b); - iunlock(&q->lk); - return -1; - } - if(q->state & Qclosed){ - freeblist(b); - iunlock(&q->lk); - return BALLOC(b); - } - - /* add buffer to queue */ - if(q->bfirst) - q->blast->next = b; - else - q->bfirst = b; - len = BALLOC(b); - dlen = BLEN(b); - QDEBUG checkb(b, "qpass"); - while(b->next){ - b = b->next; - QDEBUG checkb(b, "qpass"); - len += BALLOC(b); - dlen += BLEN(b); - } - q->blast = b; - q->len += len; - q->dlen += dlen; - - if(q->len >= q->limit/2) - q->state |= Qflow; - - if(q->state & Qstarve){ - q->state &= ~Qstarve; - dowakeup = 1; - } - iunlock(&q->lk); - - if(dowakeup) - wakeup(&q->rr); - - return len; -} - -int -qpassnolim(Queue *q, Block *b) -{ - int dlen, len, dowakeup; - - /* sync with qread */ - dowakeup = 0; - ilock(&q->lk); - - if(q->state & Qclosed){ - freeblist(b); - iunlock(&q->lk); - return BALLOC(b); - } - - /* add buffer to queue */ - if(q->bfirst) - q->blast->next = b; - else - q->bfirst = b; - len = BALLOC(b); - dlen = BLEN(b); - QDEBUG checkb(b, "qpass"); - while(b->next){ - b = b->next; - QDEBUG checkb(b, "qpass"); - len += BALLOC(b); - dlen += BLEN(b); - } - q->blast = b; - q->len += len; - q->dlen += dlen; - - if(q->len >= q->limit/2) - q->state |= Qflow; - - if(q->state & Qstarve){ - q->state &= ~Qstarve; - dowakeup = 1; - } - iunlock(&q->lk); - - if(dowakeup) - wakeup(&q->rr); - - return len; -} - -/* - * if the allocated space is way out of line with the used - * space, reallocate to a smaller block - */ -Block* -packblock(Block *bp) -{ - Block **l, *nbp; - int n; - - for(l = &bp; *l; l = &(*l)->next){ - nbp = *l; - n = BLEN(nbp); - if((n<<2) < BALLOC(nbp)){ - *l = allocb(n); - memmove((*l)->wp, nbp->rp, n); - (*l)->wp += n; - (*l)->next = nbp->next; - freeb(nbp); - } - } - - return bp; -} - -int -qproduce(Queue *q, void *vp, int len) -{ - Block *b; - int dowakeup; - uchar *p = vp; - - /* sync with qread */ - dowakeup = 0; - ilock(&q->lk); - - /* no waiting receivers, room in buffer? */ - if(q->len >= q->limit){ - q->state |= Qflow; - iunlock(&q->lk); - return -1; - } - - /* save in buffer */ - b = iallocb(len); - if(b == 0){ - iunlock(&q->lk); - return 0; - } - memmove(b->wp, p, len); - producecnt += len; - b->wp += len; - if(q->bfirst) - q->blast->next = b; - else - q->bfirst = b; - q->blast = b; - /* b->next = 0; done by iallocb() */ - q->len += BALLOC(b); - q->dlen += BLEN(b); - QDEBUG checkb(b, "qproduce"); - - if(q->state & Qstarve){ - q->state &= ~Qstarve; - dowakeup = 1; - } - - if(q->len >= q->limit) - q->state |= Qflow; - iunlock(&q->lk); - - if(dowakeup) - wakeup(&q->rr); - - return len; -} - -/* - * copy from offset in the queue - */ -Block* -qcopy(Queue *q, int len, ulong offset) -{ - int sofar; - int n; - Block *b, *nb; - uchar *p; - - nb = allocb(len); - - ilock(&q->lk); - - /* go to offset */ - b = q->bfirst; - for(sofar = 0; ; sofar += n){ - if(b == nil){ - iunlock(&q->lk); - return nb; - } - n = BLEN(b); - if(sofar + n > offset){ - p = b->rp + offset - sofar; - n -= offset - sofar; - break; - } - QDEBUG checkb(b, "qcopy"); - b = b->next; - } - - /* copy bytes from there */ - for(sofar = 0; sofar < len;){ - if(n > len - sofar) - n = len - sofar; - memmove(nb->wp, p, n); - qcopycnt += n; - sofar += n; - nb->wp += n; - b = b->next; - if(b == nil) - break; - n = BLEN(b); - p = b->rp; - } - iunlock(&q->lk); - - return nb; -} - -/* - * called by non-interrupt code - */ -Queue* -qopen(int limit, int msg, void (*kick)(void*), void *arg) -{ - Queue *q; - - q = malloc(sizeof(Queue)); - if(q == 0) - return 0; - - q->limit = q->inilim = limit; - q->kick = kick; - q->arg = arg; - q->state = msg; - - q->state |= Qstarve; - q->eof = 0; - q->noblock = 0; - - return q; -} - -/* open a queue to be bypassed */ -Queue* -qbypass(void (*bypass)(void*, Block*), void *arg) -{ - Queue *q; - - q = malloc(sizeof(Queue)); - if(q == 0) - return 0; - - q->limit = 0; - q->arg = arg; - q->bypass = bypass; - q->state = 0; - - return q; -} - -static int -notempty(void *a) -{ - Queue *q = a; - - return (q->state & Qclosed) || q->bfirst != 0; -} - -/* - * wait for the queue to be non-empty or closed. - * called with q ilocked. - */ -static int -qwait(Queue *q) -{ - /* wait for data */ - for(;;){ - if(q->bfirst != nil) - break; - - if(q->state & Qclosed){ - if(++q->eof > 3) - return -1; - if(*q->err && strcmp(q->err, Ehungup) != 0) - return -1; - return 0; - } - - q->state |= Qstarve; /* flag requesting producer to wake me */ - iunlock(&q->lk); - sleep(&q->rr, notempty, q); - ilock(&q->lk); - } - return 1; -} - -/* - * add a block list to a queue - */ -void -qaddlist(Queue *q, Block *b) -{ - /* queue the block */ - if(q->bfirst) - q->blast->next = b; - else - q->bfirst = b; - q->len += blockalloclen(b); - q->dlen += blocklen(b); - while(b->next) - b = b->next; - q->blast = b; -} - -/* - * called with q ilocked - */ -Block* -qremove(Queue *q) -{ - Block *b; - - b = q->bfirst; - if(b == nil) - return nil; - q->bfirst = b->next; - b->next = nil; - q->dlen -= BLEN(b); - q->len -= BALLOC(b); - QDEBUG checkb(b, "qremove"); - return b; -} - -/* - * copy the contents of a string of blocks into - * memory. emptied blocks are freed. return - * pointer to first unconsumed block. - */ -Block* -bl2mem(uchar *p, Block *b, int n) -{ - int i; - Block *next; - - for(; b != nil; b = next){ - i = BLEN(b); - if(i > n){ - memmove(p, b->rp, n); - b->rp += n; - return b; - } - memmove(p, b->rp, i); - n -= i; - p += i; - b->rp += i; - next = b->next; - freeb(b); - } - return nil; -} - -/* - * copy the contents of memory into a string of blocks. - * return nil on error. - */ -Block* -mem2bl(uchar *p, int len) -{ - int n; - Block *b, *first, **l; - - first = nil; - l = &first; - if(waserror()){ - freeblist(first); - nexterror(); - } - do { - n = len; - if(n > Maxatomic) - n = Maxatomic; - - *l = b = allocb(n); - /* setmalloctag(b, (up->text[0]<<24)|(up->text[1]<<16)|(up->text[2]<<8)|up->text[3]); */ - memmove(b->wp, p, n); - b->wp += n; - p += n; - len -= n; - l = &b->next; - } while(len > 0); - poperror(); - - return first; -} - -/* - * put a block back to the front of the queue - * called with q ilocked - */ -void -qputback(Queue *q, Block *b) -{ - b->next = q->bfirst; - if(q->bfirst == nil) - q->blast = b; - q->bfirst = b; - q->len += BALLOC(b); - q->dlen += BLEN(b); -} - -/* - * flow control, get producer going again - * called with q ilocked - */ -static void -qwakeup_iunlock(Queue *q) -{ - int dowakeup = 0; - - /* if writer flow controlled, restart */ - if((q->state & Qflow) && q->len < q->limit/2){ - q->state &= ~Qflow; - dowakeup = 1; - } - - iunlock(&q->lk); - - /* wakeup flow controlled writers */ - if(dowakeup){ - if(q->kick) - q->kick(q->arg); - wakeup(&q->wr); - } -} - -/* - * get next block from a queue (up to a limit) - */ -Block* -qbread(Queue *q, int len) -{ - Block *b, *nb; - int n; - - qlock(&q->rlock); - if(waserror()){ - qunlock(&q->rlock); - nexterror(); - } - - ilock(&q->lk); - switch(qwait(q)){ - case 0: - /* queue closed */ - iunlock(&q->lk); - qunlock(&q->rlock); - poperror(); - return nil; - case -1: - /* multiple reads on a closed queue */ - iunlock(&q->lk); - error(q->err); - } - - /* if we get here, there's at least one block in the queue */ - b = qremove(q); - n = BLEN(b); - - /* split block if it's too big and this is not a message queue */ - nb = b; - if(n > len){ - if((q->state&Qmsg) == 0){ - n -= len; - b = allocb(n); - memmove(b->wp, nb->rp+len, n); - b->wp += n; - qputback(q, b); - } - nb->wp = nb->rp + len; - } - - /* restart producer */ - qwakeup_iunlock(q); - - poperror(); - qunlock(&q->rlock); - return nb; -} - -/* - * read a queue. if no data is queued, post a Block - * and wait on its Rendez. - */ -long -qread(Queue *q, void *vp, int len) -{ - Block *b, *first, **l; - int m, n; - - qlock(&q->rlock); - if(waserror()){ - qunlock(&q->rlock); - nexterror(); - } - - ilock(&q->lk); -again: - switch(qwait(q)){ - case 0: - /* queue closed */ - iunlock(&q->lk); - qunlock(&q->rlock); - poperror(); - return 0; - case -1: - /* multiple reads on a closed queue */ - iunlock(&q->lk); - error(q->err); - } - - /* if we get here, there's at least one block in the queue */ - if(q->state & Qcoalesce){ - /* when coalescing, 0 length blocks just go away */ - b = q->bfirst; - if(BLEN(b) <= 0){ - freeb(qremove(q)); - goto again; - } - - /* grab the first block plus as many - * following blocks as will completely - * fit in the read. - */ - n = 0; - l = &first; - m = BLEN(b); - for(;;) { - *l = qremove(q); - l = &b->next; - n += m; - - b = q->bfirst; - if(b == nil) - break; - m = BLEN(b); - if(n+m > len) - break; - } - } else { - first = qremove(q); - n = BLEN(first); - } - - /* copy to user space outside of the ilock */ - iunlock(&q->lk); - b = bl2mem(vp, first, len); - ilock(&q->lk); - - /* take care of any left over partial block */ - if(b != nil){ - n -= BLEN(b); - if(q->state & Qmsg) - freeb(b); - else - qputback(q, b); - } - - /* restart producer */ - qwakeup_iunlock(q); - - poperror(); - qunlock(&q->rlock); - return n; -} - -static int -qnotfull(void *a) -{ - Queue *q = a; - - return q->len < q->limit || (q->state & Qclosed); -} - -ulong noblockcnt; - -/* - * add a block to a queue obeying flow control - */ -long -qbwrite(Queue *q, Block *b) -{ - int n, dowakeup; - - n = BLEN(b); - - if(q->bypass){ - (*q->bypass)(q->arg, b); - return n; - } - - dowakeup = 0; - qlock(&q->wlock); - if(waserror()){ - if(b != nil) - freeb(b); - qunlock(&q->wlock); - nexterror(); - } - - ilock(&q->lk); - - /* give up if the queue is closed */ - if(q->state & Qclosed){ - iunlock(&q->lk); - error(q->err); - } - - /* if nonblocking, don't queue over the limit */ - if(q->len >= q->limit){ - if(q->noblock){ - iunlock(&q->lk); - freeb(b); - noblockcnt += n; - qunlock(&q->wlock); - poperror(); - return n; - } - } - - /* queue the block */ - if(q->bfirst) - q->blast->next = b; - else - q->bfirst = b; - q->blast = b; - b->next = 0; - q->len += BALLOC(b); - q->dlen += n; - QDEBUG checkb(b, "qbwrite"); - b = nil; - - /* make sure other end gets awakened */ - if(q->state & Qstarve){ - q->state &= ~Qstarve; - dowakeup = 1; - } - iunlock(&q->lk); - - /* get output going again */ - if(q->kick && (dowakeup || (q->state&Qkick))) - q->kick(q->arg); - - /* wakeup anyone consuming at the other end */ - if(dowakeup){ - wakeup(&q->rr); - - /* if we just wokeup a higher priority process, let it run */ - /* - p = wakeup(&q->rr); - if(p != nil && p->priority > up->priority) - sched(); - */ - } - - /* - * flow control, wait for queue to get below the limit - * before allowing the process to continue and queue - * more. We do this here so that postnote can only - * interrupt us after the data has been queued. This - * means that things like 9p flushes and ssl messages - * will not be disrupted by software interrupts. - * - * Note - this is moderately dangerous since a process - * that keeps getting interrupted and rewriting will - * queue infinite crud. - */ - for(;;){ - if(q->noblock || qnotfull(q)) - break; - - ilock(&q->lk); - q->state |= Qflow; - iunlock(&q->lk); - sleep(&q->wr, qnotfull, q); - } - USED(b); - - qunlock(&q->wlock); - poperror(); - return n; -} - -/* - * write to a queue. only Maxatomic bytes at a time is atomic. - */ -int -qwrite(Queue *q, void *vp, int len) -{ - int n, sofar; - Block *b; - uchar *p = vp; - - QDEBUG if(!islo()) - print("qwrite hi %p\n", getcallerpc(&q)); - - sofar = 0; - do { - n = len-sofar; - if(n > Maxatomic) - n = Maxatomic; - - b = allocb(n); - /* setmalloctag(b, (up->text[0]<<24)|(up->text[1]<<16)|(up->text[2]<<8)|up->text[3]); */ - if(waserror()){ - freeb(b); - nexterror(); - } - memmove(b->wp, p+sofar, n); - poperror(); - b->wp += n; - - qbwrite(q, b); - - sofar += n; - } while(sofar < len && (q->state & Qmsg) == 0); - - return len; -} - -/* - * used by print() to write to a queue. Since we may be splhi or not in - * a process, don't qlock. - */ -int -qiwrite(Queue *q, void *vp, int len) -{ - int n, sofar, dowakeup; - Block *b; - uchar *p = vp; - - dowakeup = 0; - - sofar = 0; - do { - n = len-sofar; - if(n > Maxatomic) - n = Maxatomic; - - b = iallocb(n); - if(b == nil) - break; - memmove(b->wp, p+sofar, n); - b->wp += n; - - ilock(&q->lk); - - QDEBUG checkb(b, "qiwrite"); - if(q->bfirst) - q->blast->next = b; - else - q->bfirst = b; - q->blast = b; - q->len += BALLOC(b); - q->dlen += n; - - if(q->state & Qstarve){ - q->state &= ~Qstarve; - dowakeup = 1; - } - - iunlock(&q->lk); - - if(dowakeup){ - if(q->kick) - q->kick(q->arg); - wakeup(&q->rr); - } - - sofar += n; - } while(sofar < len && (q->state & Qmsg) == 0); - - return sofar; -} - -/* - * be extremely careful when calling this, - * as there is no reference accounting - */ -void -qfree(Queue *q) -{ - qclose(q); - free(q); -} - -/* - * Mark a queue as closed. No further IO is permitted. - * All blocks are released. - */ -void -qclose(Queue *q) -{ - Block *bfirst; - - if(q == nil) - return; - - /* mark it */ - ilock(&q->lk); - q->state |= Qclosed; - q->state &= ~(Qflow|Qstarve); - strcpy(q->err, Ehungup); - bfirst = q->bfirst; - q->bfirst = 0; - q->len = 0; - q->dlen = 0; - q->noblock = 0; - iunlock(&q->lk); - - /* free queued blocks */ - freeblist(bfirst); - - /* wake up readers/writers */ - wakeup(&q->rr); - wakeup(&q->wr); -} - -/* - * Mark a queue as closed. Wakeup any readers. Don't remove queued - * blocks. - */ -void -qhangup(Queue *q, char *msg) -{ - /* mark it */ - ilock(&q->lk); - q->state |= Qclosed; - if(msg == 0 || *msg == 0) - strcpy(q->err, Ehungup); - else - strncpy(q->err, msg, ERRMAX-1); - iunlock(&q->lk); - - /* wake up readers/writers */ - wakeup(&q->rr); - wakeup(&q->wr); -} - -/* - * return non-zero if the q is hungup - */ -int -qisclosed(Queue *q) -{ - return q->state & Qclosed; -} - -/* - * mark a queue as no longer hung up - */ -void -qreopen(Queue *q) -{ - ilock(&q->lk); - q->state &= ~Qclosed; - q->state |= Qstarve; - q->eof = 0; - q->limit = q->inilim; - iunlock(&q->lk); -} - -/* - * return bytes queued - */ -int -qlen(Queue *q) -{ - return q->dlen; -} - -/* - * return space remaining before flow control - */ -int -qwindow(Queue *q) -{ - int l; - - l = q->limit - q->len; - if(l < 0) - l = 0; - return l; -} - -/* - * return true if we can read without blocking - */ -int -qcanread(Queue *q) -{ - return q->bfirst!=0; -} - -/* - * change queue limit - */ -void -qsetlimit(Queue *q, int limit) -{ - q->limit = limit; -} - -/* - * set blocking/nonblocking - */ -void -qnoblock(Queue *q, int onoff) -{ - q->noblock = onoff; -} - -/* - * flush the output queue - */ -void -qflush(Queue *q) -{ - Block *bfirst; - - /* mark it */ - ilock(&q->lk); - bfirst = q->bfirst; - q->bfirst = 0; - q->len = 0; - q->dlen = 0; - iunlock(&q->lk); - - /* free queued blocks */ - freeblist(bfirst); - - /* wake up readers/writers */ - wakeup(&q->wr); -} - -int -qfull(Queue *q) -{ - return q->state & Qflow; -} - -int -qstate(Queue *q) -{ - return q->state; -} diff --git a/sys/src/cmd/unix/drawterm/kern/qlock.c b/sys/src/cmd/unix/drawterm/kern/qlock.c deleted file mode 100644 index fdbeaeac3..000000000 --- a/sys/src/cmd/unix/drawterm/kern/qlock.c +++ /dev/null @@ -1,94 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" - -static void -queue(Proc **first, Proc **last) -{ - Proc *t; - - t = *last; - if(t == 0) - *first = up; - else - t->qnext = up; - *last = up; - up->qnext = 0; -} - -static Proc* -dequeue(Proc **first, Proc **last) -{ - Proc *t; - - t = *first; - if(t == 0) - return 0; - *first = t->qnext; - if(*first == 0) - *last = 0; - return t; -} - -void -qlock(QLock *q) -{ - lock(&q->lk); - - if(q->hold == 0) { - q->hold = up; - unlock(&q->lk); - return; - } - - /* - * Can't assert this because of RWLock - assert(q->hold != up); - */ - - queue((Proc**)&q->first, (Proc**)&q->last); - unlock(&q->lk); - procsleep(); -} - -int -canqlock(QLock *q) -{ - lock(&q->lk); - if(q->hold == 0) { - q->hold = up; - unlock(&q->lk); - return 1; - } - unlock(&q->lk); - return 0; -} - -void -qunlock(QLock *q) -{ - Proc *p; - - lock(&q->lk); - /* - * Can't assert this because of RWlock - assert(q->hold == CT); - */ - p = dequeue((Proc**)&q->first, (Proc**)&q->last); - if(p) { - q->hold = p; - unlock(&q->lk); - procwakeup(p); - } else { - q->hold = 0; - unlock(&q->lk); - } -} - -int -holdqlock(QLock *q) -{ - return q->hold == up; -} - diff --git a/sys/src/cmd/unix/drawterm/kern/rendez.c b/sys/src/cmd/unix/drawterm/kern/rendez.c deleted file mode 100644 index 6a9ad174e..000000000 --- a/sys/src/cmd/unix/drawterm/kern/rendez.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -void -sleep(Rendez *r, int (*f)(void*), void *arg) -{ - int s; - - s = splhi(); - - lock(&r->lk); - lock(&up->rlock); - if(r->p){ - print("double sleep %lud %lud\n", r->p->pid, up->pid); - dumpstack(); - } - - /* - * Wakeup only knows there may be something to do by testing - * r->p in order to get something to lock on. - * Flush that information out to memory in case the sleep is - * committed. - */ - r->p = up; - - if((*f)(arg) || up->notepending){ - /* - * if condition happened or a note is pending - * never mind - */ - r->p = nil; - unlock(&up->rlock); - unlock(&r->lk); - } else { - /* - * now we are committed to - * change state and call scheduler - */ - up->state = Wakeme; - up->r = r; - - /* statistics */ - /* m->cs++; */ - - unlock(&up->rlock); - unlock(&r->lk); - - procsleep(); - } - - if(up->notepending) { - up->notepending = 0; - splx(s); - error(Eintr); - } - - splx(s); -} - -Proc* -wakeup(Rendez *r) -{ - Proc *p; - int s; - - s = splhi(); - - lock(&r->lk); - p = r->p; - - if(p != nil){ - lock(&p->rlock); - if(p->state != Wakeme || p->r != r) - panic("wakeup: state"); - r->p = nil; - p->r = nil; - p->state = Running; - procwakeup(p); - unlock(&p->rlock); - } - unlock(&r->lk); - - splx(s); - - return p; -} - diff --git a/sys/src/cmd/unix/drawterm/kern/rwlock.c b/sys/src/cmd/unix/drawterm/kern/rwlock.c deleted file mode 100644 index 3381957a3..000000000 --- a/sys/src/cmd/unix/drawterm/kern/rwlock.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -void -rlock(RWlock *l) -{ - qlock(&l->x); /* wait here for writers and exclusion */ - lock(&l->lk); - l->readers++; - canqlock(&l->k); /* block writers if we are the first reader */ - unlock(&l->lk); - qunlock(&l->x); -} - -void -runlock(RWlock *l) -{ - lock(&l->lk); - if(--l->readers == 0) /* last reader out allows writers */ - qunlock(&l->k); - unlock(&l->lk); -} - -void -wlock(RWlock *l) -{ - qlock(&l->x); /* wait here for writers and exclusion */ - qlock(&l->k); /* wait here for last reader */ -} - -void -wunlock(RWlock *l) -{ - qunlock(&l->k); - qunlock(&l->x); -} diff --git a/sys/src/cmd/unix/drawterm/kern/screen.h b/sys/src/cmd/unix/drawterm/kern/screen.h deleted file mode 100644 index dfdc12de5..000000000 --- a/sys/src/cmd/unix/drawterm/kern/screen.h +++ /dev/null @@ -1,63 +0,0 @@ -typedef struct Mouseinfo Mouseinfo; -typedef struct Mousestate Mousestate; -typedef struct Cursorinfo Cursorinfo; -typedef struct Screeninfo Screeninfo; - -#define Mousequeue 16 /* queue can only have Mousequeue-1 elements */ -#define Mousewindow 500 /* mouse event window in millisec */ - -struct Mousestate { - int buttons; - Point xy; - ulong msec; -}; - -struct Mouseinfo { - Lock lk; - Mousestate queue[Mousequeue]; - int ri, wi; - int lastb; - int trans; - int open; - Rendez r; -}; - -struct Cursorinfo { - Lock lk; - Point offset; - uchar clr[2*16]; - uchar set[2*16]; -}; - -struct Screeninfo { - Lock lk; - Memimage *newsoft; - int reshaped; - int depth; - int dibtype; -}; - -extern Memimage *gscreen; -extern Mouseinfo mouse; -extern Cursorinfo cursor; -extern Screeninfo screen; - -void screeninit(void); -void screenload(Rectangle, int, uchar *, Point, int); - -void getcolor(ulong, ulong*, ulong*, ulong*); -void setcolor(ulong, ulong, ulong, ulong); - -void refreshrect(Rectangle); - -void cursorarrow(void); -void setcursor(void); -void mouseset(Point); -void drawflushr(Rectangle); -void flushmemscreen(Rectangle); -uchar *attachscreen(Rectangle*, ulong*, int*, int*, int*, void**); - -void drawqlock(void); -void drawqunlock(void); -int drawcanqlock(void); -void terminit(void); diff --git a/sys/src/cmd/unix/drawterm/kern/sleep.c b/sys/src/cmd/unix/drawterm/kern/sleep.c deleted file mode 100644 index 6a9ad174e..000000000 --- a/sys/src/cmd/unix/drawterm/kern/sleep.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -void -sleep(Rendez *r, int (*f)(void*), void *arg) -{ - int s; - - s = splhi(); - - lock(&r->lk); - lock(&up->rlock); - if(r->p){ - print("double sleep %lud %lud\n", r->p->pid, up->pid); - dumpstack(); - } - - /* - * Wakeup only knows there may be something to do by testing - * r->p in order to get something to lock on. - * Flush that information out to memory in case the sleep is - * committed. - */ - r->p = up; - - if((*f)(arg) || up->notepending){ - /* - * if condition happened or a note is pending - * never mind - */ - r->p = nil; - unlock(&up->rlock); - unlock(&r->lk); - } else { - /* - * now we are committed to - * change state and call scheduler - */ - up->state = Wakeme; - up->r = r; - - /* statistics */ - /* m->cs++; */ - - unlock(&up->rlock); - unlock(&r->lk); - - procsleep(); - } - - if(up->notepending) { - up->notepending = 0; - splx(s); - error(Eintr); - } - - splx(s); -} - -Proc* -wakeup(Rendez *r) -{ - Proc *p; - int s; - - s = splhi(); - - lock(&r->lk); - p = r->p; - - if(p != nil){ - lock(&p->rlock); - if(p->state != Wakeme || p->r != r) - panic("wakeup: state"); - r->p = nil; - p->r = nil; - p->state = Running; - procwakeup(p); - unlock(&p->rlock); - } - unlock(&r->lk); - - splx(s); - - return p; -} - diff --git a/sys/src/cmd/unix/drawterm/kern/smalloc.c b/sys/src/cmd/unix/drawterm/kern/smalloc.c deleted file mode 100644 index 314f3c850..000000000 --- a/sys/src/cmd/unix/drawterm/kern/smalloc.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -void* -smalloc(ulong n) -{ - return mallocz(n, 1); -} - -void* -malloc(ulong n) -{ - return mallocz(n, 1); -} - diff --git a/sys/src/cmd/unix/drawterm/kern/stub.c b/sys/src/cmd/unix/drawterm/kern/stub.c deleted file mode 100644 index d9c690638..000000000 --- a/sys/src/cmd/unix/drawterm/kern/stub.c +++ /dev/null @@ -1,171 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -void -mallocsummary(void) -{ -} - -void -pagersummary(void) -{ -} - -int -iseve(void) -{ - return 1; -} - -void -setswapchan(Chan *c) -{ - USED(c); -} - -void -splx(int x) -{ - USED(x); -} - -int -splhi(void) -{ - return 0; -} - -int -spllo(void) -{ - return 0; -} - -void -procdump(void) -{ -} - -void -scheddump(void) -{ -} - -void -killbig(void) -{ -} - -void -dumpstack(void) -{ -} - -void -xsummary(void) -{ -} - -void -rebootcmd(int argc, char **argv) -{ - USED(argc); - USED(argv); -} - -void -kickpager(void) -{ -} - -int -userwrite(char *a, int n) -{ - error(Eperm); - return 0; -} - -vlong -todget(vlong *p) -{ - if(p) - *p = 0; - return 0; -} - -void -todset(vlong a, vlong b, int c) -{ - USED(a); - USED(b); - USED(c); -} - -void -todsetfreq(vlong a) -{ - USED(a); -} - -long -hostdomainwrite(char *a, int n) -{ - USED(a); - USED(n); - error(Eperm); - return 0; -} - -long -hostownerwrite(char *a, int n) -{ - USED(a); - USED(n); - error(Eperm); - return 0; -} - -void -todinit(void) -{ -} - -void -rdb(void) -{ -} - -void -setmalloctag(void *v, uintptr tag) -{ - USED(v); - USED(tag); -} - -int -postnote(Proc *p, int x, char *msg, int flag) -{ - USED(p); - USED(x); - USED(msg); - USED(flag); - return 0; -} - -void -exhausted(char *s) -{ - panic("out of %s", s); -} - -uvlong -fastticks(uvlong *v) -{ - if(v) - *v = 1; - return 0; -} - diff --git a/sys/src/cmd/unix/drawterm/kern/sysfile.c b/sys/src/cmd/unix/drawterm/kern/sysfile.c deleted file mode 100644 index 18dadbcda..000000000 --- a/sys/src/cmd/unix/drawterm/kern/sysfile.c +++ /dev/null @@ -1,1244 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "user.h" -#undef open -#undef mount -#undef read -#undef write -#undef seek -#undef stat -#undef wstat -#undef remove -#undef close -#undef fstat -#undef fwstat - -/* - * The sys*() routines needn't poperror() as they return directly to syscall(). - */ - -static void -unlockfgrp(Fgrp *f) -{ - int ex; - - ex = f->exceed; - f->exceed = 0; - unlock(&f->ref.lk); - if(ex) - pprint("warning: process exceeds %d file descriptors\n", ex); -} - -int -growfd(Fgrp *f, int fd) /* fd is always >= 0 */ -{ - Chan **newfd, **oldfd; - - if(fd < f->nfd) - return 0; - if(fd >= f->nfd+DELTAFD) - return -1; /* out of range */ - /* - * Unbounded allocation is unwise; besides, there are only 16 bits - * of fid in 9P - */ - if(f->nfd >= 5000){ - Exhausted: - print("no free file descriptors\n"); - return -1; - } - newfd = malloc((f->nfd+DELTAFD)*sizeof(Chan*)); - if(newfd == 0) - goto Exhausted; - oldfd = f->fd; - memmove(newfd, oldfd, f->nfd*sizeof(Chan*)); - f->fd = newfd; - free(oldfd); - f->nfd += DELTAFD; - if(fd > f->maxfd){ - if(fd/100 > f->maxfd/100) - f->exceed = (fd/100)*100; - f->maxfd = fd; - } - return 1; -} - -/* - * this assumes that the fgrp is locked - */ -int -findfreefd(Fgrp *f, int start) -{ - int fd; - - for(fd=start; fd<f->nfd; fd++) - if(f->fd[fd] == 0) - break; - if(fd >= f->nfd && growfd(f, fd) < 0) - return -1; - return fd; -} - -int -newfd(Chan *c) -{ - int fd; - Fgrp *f; - - f = up->fgrp; - lock(&f->ref.lk); - fd = findfreefd(f, 0); - if(fd < 0){ - unlockfgrp(f); - return -1; - } - if(fd > f->maxfd) - f->maxfd = fd; - f->fd[fd] = c; - unlockfgrp(f); - return fd; -} - -int -newfd2(int fd[2], Chan *c[2]) -{ - Fgrp *f; - - f = up->fgrp; - lock(&f->ref.lk); - fd[0] = findfreefd(f, 0); - if(fd[0] < 0){ - unlockfgrp(f); - return -1; - } - fd[1] = findfreefd(f, fd[0]+1); - if(fd[1] < 0){ - unlockfgrp(f); - return -1; - } - if(fd[1] > f->maxfd) - f->maxfd = fd[1]; - f->fd[fd[0]] = c[0]; - f->fd[fd[1]] = c[1]; - unlockfgrp(f); - - return 0; -} - -Chan* -fdtochan(int fd, int mode, int chkmnt, int iref) -{ - Chan *c; - Fgrp *f; - - c = 0; - f = up->fgrp; - - lock(&f->ref.lk); - if(fd<0 || f->nfd<=fd || (c = f->fd[fd])==0) { - unlock(&f->ref.lk); - error(Ebadfd); - } - if(iref) - incref(&c->ref); - unlock(&f->ref.lk); - - if(chkmnt && (c->flag&CMSG)) { - if(iref) - cclose(c); - error(Ebadusefd); - } - - if(mode<0 || c->mode==ORDWR) - return c; - - if((mode&OTRUNC) && c->mode==OREAD) { - if(iref) - cclose(c); - error(Ebadusefd); - } - - if((mode&~OTRUNC) != c->mode) { - if(iref) - cclose(c); - error(Ebadusefd); - } - - return c; -} - -int -openmode(ulong o) -{ - o &= ~(OTRUNC|OCEXEC|ORCLOSE); - if(o > OEXEC) - error(Ebadarg); - if(o == OEXEC) - return OREAD; - return o; -} - -long -_sysfd2path(int fd, char *buf, uint nbuf) -{ - Chan *c; - - c = fdtochan(fd, -1, 0, 1); - - if(c->name == nil) - snprint(buf, nbuf, "<null>"); - else - snprint(buf, nbuf, "%s", c->name->s); - cclose(c); - return 0; -} - -long -_syspipe(int fd[2]) -{ - Chan *c[2]; - Dev *d; - static char *datastr[] = {"data", "data1"}; - - d = devtab[devno('|', 0)]; - c[0] = namec("#|", Atodir, 0, 0); - c[1] = 0; - fd[0] = -1; - fd[1] = -1; - - if(waserror()){ - cclose(c[0]); - if(c[1]) - cclose(c[1]); - nexterror(); - } - c[1] = cclone(c[0]); - if(walk(&c[0], datastr+0, 1, 1, nil) < 0) - error(Egreg); - if(walk(&c[1], datastr+1, 1, 1, nil) < 0) - error(Egreg); - c[0] = d->open(c[0], ORDWR); - c[1] = d->open(c[1], ORDWR); - if(newfd2(fd, c) < 0) - error(Enofd); - poperror(); - - return 0; -} - -long -_sysdup(int fd0, int fd1) -{ - int fd; - Chan *c, *oc; - Fgrp *f = up->fgrp; - - /* - * Close after dup'ing, so date > #d/1 works - */ - c = fdtochan(fd0, -1, 0, 1); - fd = fd1; - if(fd != -1){ - lock(&f->ref.lk); - if(fd<0 || growfd(f, fd)<0) { - unlockfgrp(f); - cclose(c); - error(Ebadfd); - } - if(fd > f->maxfd) - f->maxfd = fd; - - oc = f->fd[fd]; - f->fd[fd] = c; - unlockfgrp(f); - if(oc) - cclose(oc); - }else{ - if(waserror()) { - cclose(c); - nexterror(); - } - fd = newfd(c); - if(fd < 0) - error(Enofd); - poperror(); - } - - return fd; -} - -long -_sysopen(char *name, int mode) -{ - int fd; - Chan *c = 0; - - openmode(mode); /* error check only */ - if(waserror()){ - if(c) - cclose(c); - nexterror(); - } - c = namec(name, Aopen, mode, 0); - fd = newfd(c); - if(fd < 0) - error(Enofd); - poperror(); - return fd; -} - -void -fdclose(int fd, int flag) -{ - int i; - Chan *c; - Fgrp *f = up->fgrp; - - lock(&f->ref.lk); - c = f->fd[fd]; - if(c == 0){ - /* can happen for users with shared fd tables */ - unlock(&f->ref.lk); - return; - } - if(flag){ - if(c==0 || !(c->flag&flag)){ - unlock(&f->ref.lk); - return; - } - } - f->fd[fd] = 0; - if(fd == f->maxfd) - for(i=fd; --i>=0 && f->fd[i]==0; ) - f->maxfd = i; - - unlock(&f->ref.lk); - cclose(c); -} - -long -_sysclose(int fd) -{ - fdtochan(fd, -1, 0, 0); - fdclose(fd, 0); - - return 0; -} - -long -unionread(Chan *c, void *va, long n) -{ - int i; - long nr; - Mhead *m; - Mount *mount; - - qlock(&c->umqlock); - m = c->umh; - rlock(&m->lock); - mount = m->mount; - /* bring mount in sync with c->uri and c->umc */ - for(i = 0; mount != nil && i < c->uri; i++) - mount = mount->next; - - nr = 0; - while(mount != nil) { - /* Error causes component of union to be skipped */ - if(mount->to && !waserror()) { - if(c->umc == nil){ - c->umc = cclone(mount->to); - c->umc = devtab[c->umc->type]->open(c->umc, OREAD); - } - - nr = devtab[c->umc->type]->read(c->umc, va, n, c->umc->offset); - c->umc->offset += nr; - poperror(); - } - if(nr > 0) - break; - - /* Advance to next element */ - c->uri++; - if(c->umc) { - cclose(c->umc); - c->umc = nil; - } - mount = mount->next; - } - runlock(&m->lock); - qunlock(&c->umqlock); - return nr; -} - -static long -kread(int fd, void *buf, long n, vlong *offp) -{ - int dir; - Chan *c; - vlong off; - - c = fdtochan(fd, OREAD, 1, 1); - - if(waserror()) { - cclose(c); - nexterror(); - } - - dir = c->qid.type&QTDIR; - /* - * The offset is passed through on directories, normally. sysseek complains but - * pread is used by servers and e.g. exportfs that shouldn't need to worry about this issue. - */ - - if(offp == nil) /* use and maintain channel's offset */ - off = c->offset; - else - off = *offp; - - if(off < 0) - error(Enegoff); - - if(dir && c->umh) - n = unionread(c, buf, n); - else - n = devtab[c->type]->read(c, buf, n, off); - - if(offp == nil){ - lock(&c->ref.lk); - c->offset += n; - unlock(&c->ref.lk); - } - - poperror(); - cclose(c); - - return n; -} - -/* name conflicts with netbsd -long -_sys_read(int fd, void *buf, long n) -{ - return kread(fd, buf, n, nil); -} -*/ - -long -_syspread(int fd, void *buf, long n, vlong off) -{ - if(off == ((uvlong) ~0)) - return kread(fd, buf, n, nil); - return kread(fd, buf, n, &off); -} - -static long -kwrite(int fd, void *buf, long nn, vlong *offp) -{ - Chan *c; - long m, n; - vlong off; - - n = 0; - c = fdtochan(fd, OWRITE, 1, 1); - if(waserror()) { - if(offp == nil){ - lock(&c->ref.lk); - c->offset -= n; - unlock(&c->ref.lk); - } - cclose(c); - nexterror(); - } - - if(c->qid.type & QTDIR) - error(Eisdir); - - n = nn; - - if(offp == nil){ /* use and maintain channel's offset */ - lock(&c->ref.lk); - off = c->offset; - c->offset += n; - unlock(&c->ref.lk); - }else - off = *offp; - - if(off < 0) - error(Enegoff); - - m = devtab[c->type]->write(c, buf, n, off); - - if(offp == nil && m < n){ - lock(&c->ref.lk); - c->offset -= n - m; - unlock(&c->ref.lk); - } - - poperror(); - cclose(c); - - return m; -} - -long -sys_write(int fd, void *buf, long n) -{ - return kwrite(fd, buf, n, nil); -} - -long -_syspwrite(int fd, void *buf, long n, vlong off) -{ - if(off == ((uvlong) ~0)) - return kwrite(fd, buf, n, nil); - return kwrite(fd, buf, n, &off); -} - -static vlong -_sysseek(int fd, vlong off, int whence) -{ - Chan *c; - uchar buf[sizeof(Dir)+100]; - Dir dir; - int n; - - c = fdtochan(fd, -1, 1, 1); - if(waserror()){ - cclose(c); - nexterror(); - } - if(devtab[c->type]->dc == '|') - error(Eisstream); - - switch(whence){ - case 0: - if((c->qid.type & QTDIR) && off != 0) - error(Eisdir); - if(off < 0) - error(Enegoff); - c->offset = off; - break; - - case 1: - if(c->qid.type & QTDIR) - error(Eisdir); - lock(&c->ref.lk); /* lock for read/write update */ - off = off + c->offset; - if(off < 0) - error(Enegoff); - c->offset = off; - unlock(&c->ref.lk); - break; - - case 2: - if(c->qid.type & QTDIR) - error(Eisdir); - n = devtab[c->type]->stat(c, buf, sizeof buf); - if(convM2D(buf, n, &dir, nil) == 0) - error("internal error: stat error in seek"); - off = dir.length + off; - if(off < 0) - error(Enegoff); - c->offset = off; - break; - - default: - error(Ebadarg); - } - c->uri = 0; - c->dri = 0; - cclose(c); - poperror(); - return off; -} - -void -validstat(uchar *s, int n) -{ - int m; - char buf[64]; - - if(statcheck(s, n) < 0) - error(Ebadstat); - /* verify that name entry is acceptable */ - s += STATFIXLEN - 4*BIT16SZ; /* location of first string */ - /* - * s now points at count for first string. - * if it's too long, let the server decide; this is - * only for his protection anyway. otherwise - * we'd have to allocate and waserror. - */ - m = GBIT16(s); - s += BIT16SZ; - if(m+1 > sizeof buf) - return; - memmove(buf, s, m); - buf[m] = '\0'; - /* name could be '/' */ - if(strcmp(buf, "/") != 0) - validname(buf, 0); -} - -long -_sysfstat(int fd, void *buf, long n) -{ - Chan *c; - uint l; - - l = n; - validaddr(buf, l, 1); - c = fdtochan(fd, -1, 0, 1); - if(waserror()) { - cclose(c); - nexterror(); - } - l = devtab[c->type]->stat(c, buf, l); - poperror(); - cclose(c); - return l; -} - -long -_sysstat(char *name, void *buf, long n) -{ - Chan *c; - uint l; - - l = n; - validaddr(buf, l, 1); - validaddr(name, 1, 0); - c = namec(name, Aaccess, 0, 0); - if(waserror()){ - cclose(c); - nexterror(); - } - l = devtab[c->type]->stat(c, buf, l); - poperror(); - cclose(c); - return l; -} - -long -_syschdir(char *name) -{ - Chan *c; - - validaddr(name, 1, 0); - - c = namec(name, Atodir, 0, 0); - cclose(up->dot); - up->dot = c; - return 0; -} - -long -bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, ulong flag, char* spec) -{ - int ret; - Chan *c0, *c1, *ac, *bc; - struct{ - Chan *chan; - Chan *authchan; - char *spec; - int flags; - }bogus; - - if((flag&~MMASK) || (flag&MORDER)==(MBEFORE|MAFTER)) - error(Ebadarg); - - bogus.flags = flag & MCACHE; - - if(ismount){ - if(up->pgrp->noattach) - error(Enoattach); - - ac = nil; - bc = fdtochan(fd, ORDWR, 0, 1); - if(waserror()) { - if(ac) - cclose(ac); - cclose(bc); - nexterror(); - } - - if(afd >= 0) - ac = fdtochan(afd, ORDWR, 0, 1); - - bogus.chan = bc; - bogus.authchan = ac; - - validaddr((ulong)spec, 1, 0); - bogus.spec = spec; - if(waserror()) - error(Ebadspec); - validname(spec, 1); - poperror(); - - ret = devno('M', 0); - c0 = devtab[ret]->attach((char*)&bogus); - - poperror(); - if(ac) - cclose(ac); - cclose(bc); - }else{ - bogus.spec = 0; - validaddr((ulong)arg0, 1, 0); - c0 = namec(arg0, Abind, 0, 0); - } - - if(waserror()){ - cclose(c0); - nexterror(); - } - - validaddr((ulong)arg1, 1, 0); - c1 = namec(arg1, Amount, 0, 0); - if(waserror()){ - cclose(c1); - nexterror(); - } - - ret = cmount(&c0, c1, flag, bogus.spec); - - poperror(); - cclose(c1); - poperror(); - cclose(c0); - if(ismount) - fdclose(fd, 0); - - return ret; -} - -long -_sysbind(char *old, char *new, int flag) -{ - return bindmount(0, -1, -1, old, new, flag, nil); -} - -long -_sysmount(int fd, int afd, char *new, int flag, char *spec) -{ - return bindmount(1, fd, afd, nil, new, flag, spec); -} - -long -_sysunmount(char *old, char *new) -{ - Chan *cmount, *cmounted; - - cmounted = 0; - - cmount = namec(new, Amount, 0, 0); - - if(old) { - if(waserror()) { - cclose(cmount); - nexterror(); - } - validaddr(old, 1, 0); - /* - * This has to be namec(..., Aopen, ...) because - * if arg[0] is something like /srv/cs or /fd/0, - * opening it is the only way to get at the real - * Chan underneath. - */ - cmounted = namec(old, Aopen, OREAD, 0); - poperror(); - } - - if(waserror()) { - cclose(cmount); - if(cmounted) - cclose(cmounted); - nexterror(); - } - - cunmount(cmount, cmounted); - cclose(cmount); - if(cmounted) - cclose(cmounted); - poperror(); - return 0; -} - -long -_syscreate(char *name, int mode, ulong perm) -{ - int fd; - Chan *c = 0; - - openmode(mode&~OEXCL); /* error check only; OEXCL okay here */ - if(waserror()) { - if(c) - cclose(c); - nexterror(); - } - validaddr(name, 1, 0); - c = namec(name, Acreate, mode, perm); - fd = newfd(c); - if(fd < 0) - error(Enofd); - poperror(); - return fd; -} - -long -_sysremove(char *name) -{ - Chan *c; - - c = namec(name, Aremove, 0, 0); - if(waserror()){ - c->type = 0; /* see below */ - cclose(c); - nexterror(); - } - devtab[c->type]->remove(c); - /* - * Remove clunks the fid, but we need to recover the Chan - * so fake it up. rootclose() is known to be a nop. - */ - c->type = 0; - poperror(); - cclose(c); - return 0; -} - -long -_syswstat(char *name, void *buf, long n) -{ - Chan *c; - uint l; - - l = n; - validstat(buf, l); - validaddr(name, 1, 0); - c = namec(name, Aaccess, 0, 0); - if(waserror()){ - cclose(c); - nexterror(); - } - l = devtab[c->type]->wstat(c, buf, l); - poperror(); - cclose(c); - return l; -} - -long -_sysfwstat(int fd, void *buf, long n) -{ - Chan *c; - uint l; - - l = n; - validaddr(buf, l, 0); - validstat(buf, l); - c = fdtochan(fd, -1, 1, 1); - if(waserror()) { - cclose(c); - nexterror(); - } - l = devtab[c->type]->wstat(c, buf, l); - poperror(); - cclose(c); - return l; -} - - -static void -starterror(void) -{ - assert(up->nerrlab == 0); -} - -static void -_syserror(void) -{ - char *p; - - p = up->syserrstr; - up->syserrstr = up->errstr; - up->errstr = p; -} - -static void -enderror(void) -{ - assert(up->nerrlab == 1); - poperror(); -} - -int -sysbind(char *old, char *new, int flag) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysbind(old, new, flag); - enderror(); - return n; -} - -int -syschdir(char *path) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _syschdir(path); - enderror(); - return n; -} - -int -sysclose(int fd) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysclose(fd); - enderror(); - return n; -} - -int -syscreate(char *name, int mode, ulong perm) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _syscreate(name, mode, perm); - enderror(); - return n; -} - -int -sysdup(int fd0, int fd1) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysdup(fd0, fd1); - enderror(); - return n; -} - -int -sysfstat(int fd, uchar *buf, int n) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysfstat(fd, buf, n); - enderror(); - return n; -} - -int -sysfwstat(int fd, uchar *buf, int n) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysfwstat(fd, buf, n); - enderror(); - return n; -} - -int -sysmount(int fd, int afd, char *new, int flag, char *spec) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysmount(fd, afd, new, flag, spec); - enderror(); - return n; -} - -int -sysunmount(char *old, char *new) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysunmount(old, new); - enderror(); - return n; -} - -int -sysopen(char *name, int mode) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysopen(name, mode); - enderror(); - return n; -} - -int -syspipe(int *fd) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _syspipe(fd); - enderror(); - return n; -} - -long -syspread(int fd, void *buf, long n, vlong off) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _syspread(fd, buf, n, off); - enderror(); - return n; -} - -long -syspwrite(int fd, void *buf, long n, vlong off) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _syspwrite(fd, buf, n, off); - enderror(); - return n; -} - -long -sysread(int fd, void *buf, long n) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _syspread(fd, buf, n, (uvlong) ~0); - enderror(); - return n; -} - -int -sysremove(char *path) -{ - int n; - - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysremove(path); - enderror(); - return n; -} - -vlong -sysseek(int fd, vlong off, int whence) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - off = _sysseek(fd, off, whence); - enderror(); - return off; -} - -int -sysstat(char *name, uchar *buf, int n) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _sysstat(name, buf, n); - enderror(); - return n; -} - -long -syswrite(int fd, void *buf, long n) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _syspwrite(fd, buf, n, (uvlong) ~0); - enderror(); - return n; -} - -int -syswstat(char *name, uchar *buf, int n) -{ - starterror(); - if(waserror()){ - _syserror(); - return -1; - } - n = _syswstat(name, buf, n); - enderror(); - return n; -} - -void -werrstr(char *f, ...) -{ - char buf[ERRMAX]; - va_list arg; - - va_start(arg, f); - vsnprint(buf, sizeof buf, f, arg); - va_end(arg); - - if(up->nerrlab) - strecpy(up->errstr, up->errstr+ERRMAX, buf); - else - strecpy(up->syserrstr, up->syserrstr+ERRMAX, buf); -} - -int -__errfmt(Fmt *fmt) -{ - if(up->nerrlab) - return fmtstrcpy(fmt, up->errstr); - else - return fmtstrcpy(fmt, up->syserrstr); -} - -int -errstr(char *buf, uint n) -{ - char tmp[ERRMAX]; - char *p; - - p = up->nerrlab ? up->errstr : up->syserrstr; - memmove(tmp, p, ERRMAX); - utfecpy(p, p+ERRMAX, buf); - utfecpy(buf, buf+n, tmp); - return strlen(buf); -} - -int -rerrstr(char *buf, uint n) -{ - char *p; - - p = up->nerrlab ? up->errstr : up->syserrstr; - utfecpy(buf, buf+n, p); - return strlen(buf); -} - -void* -_sysrendezvous(void* arg0, void* arg1) -{ - void *tag, *val; - Proc *p, **l; - - tag = arg0; - l = &REND(up->rgrp, (uintptr)tag); - up->rendval = (void*)~0; - - lock(&up->rgrp->ref.lk); - for(p = *l; p; p = p->rendhash) { - if(p->rendtag == tag) { - *l = p->rendhash; - val = p->rendval; - p->rendval = arg1; - - while(p->mach != 0) - ; - procwakeup(p); - unlock(&up->rgrp->ref.lk); - return val; - } - l = &p->rendhash; - } - - /* Going to sleep here */ - up->rendtag = tag; - up->rendval = arg1; - up->rendhash = *l; - *l = up; - up->state = Rendezvous; - unlock(&up->rgrp->ref.lk); - - procsleep(); - - return up->rendval; -} - -void* -sysrendezvous(void *tag, void *val) -{ - void *n; - - starterror(); - if(waserror()){ - _syserror(); - return (void*)~0; - } - n = _sysrendezvous(tag, val); - enderror(); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/kern/sysproc.c b/sys/src/cmd/unix/drawterm/kern/sysproc.c deleted file mode 100644 index 11caeb773..000000000 --- a/sys/src/cmd/unix/drawterm/kern/sysproc.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -long -sysexits(ulong *arg) -{ - char *status; - char *inval = "invalid exit string"; - char buf[ERRMAX]; - - status = (char*)arg[0]; - if(status){ - if(waserror()) - status = inval; - else{ - validaddr((ulong)status, 1, 0); - if(vmemchr(status, 0, ERRMAX) == 0){ - memmove(buf, status, ERRMAX); - buf[ERRMAX-1] = 0; - status = buf; - } - } - poperror(); - - } - pexit(status, 1); - return 0; /* not reached */ -} - diff --git a/sys/src/cmd/unix/drawterm/kern/term.c b/sys/src/cmd/unix/drawterm/kern/term.c deleted file mode 100644 index f8fa9cbbf..000000000 --- a/sys/src/cmd/unix/drawterm/kern/term.c +++ /dev/null @@ -1,205 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include <draw.h> -#include <memdraw.h> -#include "screen.h" - -#define MINX 8 -#define Backgnd 0xFF /* white */ - - Memsubfont *memdefont; - -struct{ - Point pos; - int bwid; -}out; - -Lock screenlock; - -Memimage *conscol; -Memimage *back; -extern Memimage *gscreen; - -static Rectangle flushr; -static Rectangle window; -static Point curpos; -static int h; -static void termscreenputs(char*, int); - - -static void -screenflush(void) -{ - drawflushr(flushr); - flushr = Rect(10000, 10000, -10000, -10000); -} - -static void -addflush(Rectangle r) -{ - if(flushr.min.x >= flushr.max.x) - flushr = r; - else - combinerect(&flushr, r); -} - -static void -screenwin(void) -{ - Point p; - char *greet; - Memimage *grey; - - drawqlock(); - back = memwhite; - conscol = memblack; - memfillcolor(gscreen, 0x444488FF); - - h = memdefont->height; - - window.min = addpt(gscreen->r.min, Pt(20,20)); - window.max.x = window.min.x + Dx(gscreen->r)*3/4-40; - window.max.y = window.min.y + Dy(gscreen->r)*3/4-100; - - memimagedraw(gscreen, window, memblack, ZP, memopaque, ZP, S); - window = insetrect(window, 4); - memimagedraw(gscreen, window, memwhite, ZP, memopaque, ZP, S); - - /* a lot of work to get a grey color */ - grey = allocmemimage(Rect(0,0,1,1), CMAP8); - grey->flags |= Frepl; - grey->clipr = gscreen->r; - memfillcolor(grey, 0xAAAAAAFF); - memimagedraw(gscreen, Rect(window.min.x, window.min.y, - window.max.x, window.min.y+h+5+6), grey, ZP, nil, ZP, S); - freememimage(grey); - window = insetrect(window, 5); - - greet = " Plan 9 Console "; - p = addpt(window.min, Pt(10, 0)); - memimagestring(gscreen, p, conscol, ZP, memdefont, greet); - window.min.y += h+6; - curpos = window.min; - window.max.y = window.min.y+((window.max.y-window.min.y)/h)*h; - flushmemscreen(gscreen->r); - drawqunlock(); -} - -void -terminit(void) -{ - memdefont = getmemdefont(); - out.pos.x = MINX; - out.pos.y = 0; - out.bwid = memdefont->info[' '].width; - screenwin(); - screenputs = termscreenputs; -} - -static void -scroll(void) -{ - int o; - Point p; - Rectangle r; - - o = 8*h; - r = Rpt(window.min, Pt(window.max.x, window.max.y-o)); - p = Pt(window.min.x, window.min.y+o); - memimagedraw(gscreen, r, gscreen, p, nil, p, S); - r = Rpt(Pt(window.min.x, window.max.y-o), window.max); - memimagedraw(gscreen, r, back, ZP, nil, ZP, S); - flushmemscreen(gscreen->r); - curpos.y -= o; -} - -static void -screenputc(char *buf) -{ - Point p; - int w, pos; - Rectangle r; - static int *xp; - static int xbuf[256]; - - if(xp < xbuf || xp >= &xbuf[sizeof(xbuf)]) - xp = xbuf; - - switch(buf[0]) { - case '\n': - if(curpos.y+h >= window.max.y) - scroll(); - curpos.y += h; - screenputc("\r"); - break; - case '\r': - xp = xbuf; - curpos.x = window.min.x; - break; - case '\t': - p = memsubfontwidth(memdefont, " "); - w = p.x; - *xp++ = curpos.x; - pos = (curpos.x-window.min.x)/w; - pos = 8-(pos%8); - r = Rect(curpos.x, curpos.y, curpos.x+pos*w, curpos.y + h); - memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S); - addflush(r); - curpos.x += pos*w; - break; - case '\b': - if(xp <= xbuf) - break; - xp--; - r = Rect(*xp, curpos.y, curpos.x, curpos.y + h); - memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S); - addflush(r); - curpos.x = *xp; - break; - default: - p = memsubfontwidth(memdefont, buf); - w = p.x; - - if(curpos.x >= window.max.x-w) - screenputc("\n"); - - *xp++ = curpos.x; - r = Rect(curpos.x, curpos.y, curpos.x+w, curpos.y + h); - memimagedraw(gscreen, r, back, back->r.min, nil, back->r.min, S); - memimagestring(gscreen, curpos, conscol, ZP, memdefont, buf); - addflush(r); - curpos.x += w; - } -} - -static void -termscreenputs(char *s, int n) -{ - int i, locked; - Rune r; - char buf[4]; - - lock(&screenlock); - locked = drawcanqlock(); - while(n > 0){ - i = chartorune(&r, s); - if(i == 0){ - s++; - --n; - continue; - } - memmove(buf, s, i); - buf[i] = 0; - n -= i; - s += i; - screenputc(buf); - } - if(locked) - drawqunlock(); - screenflush(); - unlock(&screenlock); -} diff --git a/sys/src/cmd/unix/drawterm/kern/uart.c b/sys/src/cmd/unix/drawterm/kern/uart.c deleted file mode 100644 index da6d93e3d..000000000 --- a/sys/src/cmd/unix/drawterm/kern/uart.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -extern int panicking; -void -uartputs(char *s, int n) -{ - if(panicking) - write(1, s, n); -} - - diff --git a/sys/src/cmd/unix/drawterm/kern/unused/syscall.c b/sys/src/cmd/unix/drawterm/kern/unused/syscall.c deleted file mode 100644 index 1ae9a7cb2..000000000 --- a/sys/src/cmd/unix/drawterm/kern/unused/syscall.c +++ /dev/null @@ -1,837 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -Chan* -fdtochan(int fd, int mode, int chkmnt, int iref) -{ - Fgrp *f; - Chan *c; - - c = 0; - f = up->fgrp; - - lock(&f->ref.lk); - if(fd<0 || NFD<=fd || (c = f->fd[fd])==0) { - unlock(&f->ref.lk); - error(Ebadfd); - } - if(iref) - refinc(&c->ref); - unlock(&f->ref.lk); - - if(chkmnt && (c->flag&CMSG)) - goto bad; - if(mode<0 || c->mode==ORDWR) - return c; - if((mode&OTRUNC) && c->mode==OREAD) - goto bad; - if((mode&~OTRUNC) != c->mode) - goto bad; - return c; -bad: - if(iref) - cclose(c); - error(Ebadusefd); - return nil; /* shut up compiler */ -} - -static void -fdclose(int fd, int flag) -{ - int i; - Chan *c; - Fgrp *f; - - f = up->fgrp; - - lock(&f->ref.lk); - c = f->fd[fd]; - if(c == 0) { - unlock(&f->ref.lk); - return; - } - if(flag) { - if(c==0 || !(c->flag&flag)) { - unlock(&f->ref.lk); - return; - } - } - f->fd[fd] = 0; - if(fd == f->maxfd) - for(i=fd; --i>=0 && f->fd[i]==0; ) - f->maxfd = i; - - unlock(&f->ref.lk); - cclose(c); -} - -static int -newfd(Chan *c) -{ - int i; - Fgrp *f; - - f = up->fgrp; - lock(&f->ref.lk); - for(i=0; i<NFD; i++) - if(f->fd[i] == 0){ - if(i > f->maxfd) - f->maxfd = i; - f->fd[i] = c; - unlock(&f->ref.lk); - return i; - } - unlock(&f->ref.lk); - error("no file descriptors"); - return 0; -} - -int -sysclose(int fd) -{ - if(waserror()) - return -1; - - fdtochan(fd, -1, 0, 0); - fdclose(fd, 0); - poperror(); - return 0; -} - -int -syscreate(char *path, int mode, ulong perm) -{ - int fd; - Chan *c = 0; - - if(waserror()) { - cclose(c); - return -1; - } - - openmode(mode); /* error check only */ - c = namec(path, Acreate, mode, perm); - fd = newfd((Chan*)c); - poperror(); - return fd; -} - -int -sysdup(int old, int new) -{ - Chan *oc; - Fgrp *f = up->fgrp; - Chan *c = 0; - - if(waserror()) - return -1; - - c = fdtochan(old, -1, 0, 1); - if(new != -1) { - if(new < 0 || NFD <= new) { - cclose(c); - error(Ebadfd); - } - lock(&f->ref.lk); - if(new > f->maxfd) - f->maxfd = new; - oc = f->fd[new]; - f->fd[new] = (Chan*)c; - unlock(&f->ref.lk); - if(oc != 0) - cclose(oc); - } - else { - if(waserror()) { - cclose(c); - nexterror(); - } - new = newfd((Chan*)c); - poperror(); - } - poperror(); - return new; -} - -int -sysfstat(int fd, char *buf) -{ - Chan *c = 0; - - if(waserror()) { - cclose(c); - return -1; - } - c = fdtochan(fd, -1, 0, 1); - devtab[c->type]->stat((Chan*)c, buf); - poperror(); - cclose(c); - return 0; -} - -int -sysfwstat(int fd, char *buf) -{ - Chan *c = 0; - - if(waserror()) { - cclose(c); - return -1; - } - nameok(buf); - c = fdtochan(fd, -1, 1, 1); - devtab[c->type]->wstat((Chan*)c, buf); - poperror(); - cclose(c); - return 0; -} - -int -syschdir(char *dir) -{ - return 0; -} - -long -bindmount(Chan *c0, char *old, int flag, char *spec) -{ - int ret; - Chan *c1 = 0; - - if(flag>MMASK || (flag&MORDER) == (MBEFORE|MAFTER)) - error(Ebadarg); - - c1 = namec(old, Amount, 0, 0); - if(waserror()){ - cclose(c1); - nexterror(); - } - - ret = cmount(c0, c1, flag, spec); - - poperror(); - cclose(c1); - return ret; -} - -int -sysbind(char *new, char *old, int flags) -{ - long r; - Chan *c0 = 0; - - if(waserror()) { - cclose(c0); - return -1; - } - c0 = namec(new, Aaccess, 0, 0); - r = bindmount(c0, old, flags, ""); - poperror(); - cclose(c0); - return 0; -} - -int -sysmount(int fd, char *old, int flags, char *spec) -{ - long r; - Chan *c0 = 0, *bc = 0; - struct { - Chan* chan; - char* spec; - int flags; - } mntparam; - - if(waserror()) { - cclose(bc); - cclose(c0); - return -1; - } - bc = fdtochan(fd, ORDWR, 0, 1); - mntparam.chan = (Chan*)bc; - mntparam.spec = spec; - mntparam.flags = flags; - c0 = (*devtab[devno('M', 0)].attach)(&mntparam); - cclose(bc); - r = bindmount(c0, old, flags, spec); - poperror(); - cclose(c0); - - return r; -} - -int -sysunmount(char *old, char *new) -{ - Chan *cmount = 0, *cmounted = 0; - - if(waserror()) { - cclose(cmount); - cclose(cmounted); - return -1; - } - - cmount = namec(new, Amount, OREAD, 0); - if(old != 0) - cmounted = namec(old, Aopen, OREAD, 0); - - cunmount(cmount, cmounted); - poperror(); - cclose(cmount); - cclose(cmounted); - return 0; -} - -int -sysopen(char *path, int mode) -{ - int fd; - Chan *c = 0; - - if(waserror()){ - cclose(c); - return -1; - } - openmode(mode); /* error check only */ - c = namec(path, Aopen, mode, 0); - fd = newfd((Chan*)c); - poperror(); - return fd; -} - -long -unionread(Chan *c, void *va, long n) -{ - long nr; - Chan *nc = 0; - Pgrp *pg = 0; - - pg = up->pgrp; - rlock(&pg->ns); - - for(;;) { - if(waserror()) { - runlock(&pg->ns); - nexterror(); - } - nc = clone(c->mnt->to, 0); - poperror(); - - if(c->mountid != c->mnt->mountid) { - runlock(&pg->ns); - cclose(nc); - return 0; - } - - /* Error causes component of union to be skipped */ - if(waserror()) { - cclose(nc); - goto next; - } - - nc = (*devtab[nc->type].open)((Chan*)nc, OREAD); - nc->offset = c->offset; - nr = (*devtab[nc->type].read)((Chan*)nc, va, n, nc->offset); - /* devdirread e.g. changes it */ - c->offset = nc->offset; - poperror(); - - cclose(nc); - if(nr > 0) { - runlock(&pg->ns); - return nr; - } - /* Advance to next element */ - next: - c->mnt = c->mnt->next; - if(c->mnt == 0) - break; - c->mountid = c->mnt->mountid; - c->offset = 0; - } - runlock(&pg->ns); - return 0; -} - -long -sysread(int fd, void *va, long n) -{ - int dir; - Lock *cl; - Chan *c = 0; - - if(waserror()) { - cclose(c); - return -1; - } - c = fdtochan(fd, OREAD, 1, 1); - - dir = c->qid.path&CHDIR; - if(dir) { - n -= n%DIRLEN; - if(c->offset%DIRLEN || n==0) - error(Etoosmall); - } - - if(dir && c->mnt) - n = unionread((Chan*)c, va, n); - else - n = (*devtab[c->type].read)((Chan*)c, va, n, c->offset); - - cl = (Lock*)&c->r.l; - lock(cl); - c->offset += n; - unlock(cl); - - poperror(); - cclose(c); - - return n; -} - -int -sysremove(char *path) -{ - Chan *c = 0; - - if(waserror()) { - if(c != 0) - c->type = 0; /* see below */ - cclose(c); - return -1; - } - c = namec(path, Aaccess, 0, 0); - (*devtab[c->type].remove)((Chan*)c); - /* - * Remove clunks the fid, but we need to recover the Chan - * so fake it up. rootclose() is known to be a nop. - */ - c->type = 0; - poperror(); - cclose(c); - return 0; -} - -long -sysseek(int fd, long off, int whence) -{ - Dir dir; - Chan *c; - char buf[DIRLEN]; - - if(waserror()) - return -1; - - c = fdtochan(fd, -1, 1, 0); - if(c->qid.path & CHDIR) - error(Eisdir); - - switch(whence) { - case 0: - c->offset = off; - break; - - case 1: - lock(&c->r.l); /* lock for read/write update */ - c->offset += off; - off = c->offset; - unlock(&c->r.l); - break; - - case 2: - (*devtab[c->type].stat)(c, buf); - convM2D(buf, &dir); - c->offset = dir.length + off; - off = c->offset; - break; - } - poperror(); - return off; -} - -int -sysstat(char *path, char *buf) -{ - Chan *c = 0; - - if(waserror()){ - cclose(c); - return -1; - } - c = namec(path, Aaccess, 0, 0); - (*devtab[c->type].stat)((Chan*)c, buf); - poperror(); - cclose(c); - return 0; -} - -long -syswrite(int fd, void *va, long n) -{ - Lock *cl; - Chan *c = 0; - - if(waserror()) { - cclose(c); - return -1; - } - c = fdtochan(fd, OWRITE, 1, 1); - if(c->qid.path & CHDIR) - error(Eisdir); - - n = (*devtab[c->type].write)((Chan*)c, va, n, c->offset); - - cl = (Lock*)&c->r.l; - lock(cl); - c->offset += n; - unlock(cl); - - poperror(); - cclose(c); - - return n; -} - -int -syswstat(char *path, char *buf) -{ - Chan *c = 0; - - if(waserror()) { - cclose(c); - return -1; - } - - nameok(buf); - c = namec(path, Aaccess, 0, 0); - (*devtab[c->type].wstat)((Chan*)c, buf); - poperror(); - cclose(c); - return 0; -} - -int -sysdirstat(char *name, Dir *dir) -{ - char buf[DIRLEN]; - - if(sysstat(name, buf) == -1) - return -1; - convM2D(buf, dir); - return 0; -} - -int -sysdirfstat(int fd, Dir *dir) -{ - char buf[DIRLEN]; - - if(sysfstat(fd, buf) == -1) - return -1; - - convM2D(buf, dir); - return 0; -} - -int -sysdirwstat(char *name, Dir *dir) -{ - char buf[DIRLEN]; - - convD2M(dir, buf); - return syswstat(name, buf); -} - -int -sysdirfwstat(int fd, Dir *dir) -{ - char buf[DIRLEN]; - - convD2M(dir, buf); - return sysfwstat(fd, buf); -} - -long -sysdirread(int fd, Dir *dbuf, long count) -{ - int c, n, i, r; - char buf[DIRLEN*50]; - - n = 0; - count = (count/sizeof(Dir)) * DIRLEN; - while(n < count) { - c = count - n; - if(c > sizeof(buf)) - c = sizeof(buf); - r = sysread(fd, buf, c); - if(r == 0) - break; - if(r < 0 || r % DIRLEN) - return -1; - for(i=0; i<r; i+=DIRLEN) { - convM2D(buf+i, dbuf); - dbuf++; - } - n += r; - if(r != c) - break; - } - - return (n/DIRLEN) * sizeof(Dir); -} - -static int -call(char *clone, char *dest, int *cfdp, char *dir, char *local) -{ - int fd, cfd, n; - char *p, name[3*NAMELEN+5], data[3*NAMELEN+10]; - - cfd = sysopen(clone, ORDWR); - if(cfd < 0){ - werrstr("%s: %r", clone); - return -1; - } - - /* get directory name */ - n = sysread(cfd, name, sizeof(name)-1); - if(n < 0) { - sysclose(cfd); - return -1; - } - name[n] = 0; - sprint(name, "%d", strtoul(name, 0, 0)); - p = strrchr(clone, '/'); - *p = 0; - if(dir) - snprint(dir, 2*NAMELEN, "%s/%s", clone, name); - snprint(data, sizeof(data), "%s/%s/data", clone, name); - - /* connect */ - /* set local side (port number, for example) if we need to */ - if(local) - snprint(name, sizeof(name), "connect %s %s", dest, local); - else - snprint(name, sizeof(name), "connect %s", dest); - if(syswrite(cfd, name, strlen(name)) < 0){ - werrstr("%s failed: %r", name); - sysclose(cfd); - return -1; - } - - /* open data connection */ - fd = sysopen(data, ORDWR); - if(fd < 0){ - werrstr("can't open %s: %r", data); - sysclose(cfd); - return -1; - } - if(cfdp) - *cfdp = cfd; - else - sysclose(cfd); - return fd; -} - -int -sysdial(char *dest, char *local, char *dir, int *cfdp) -{ - int n, fd, rv; - char *p, net[128], clone[NAMELEN+12]; - - /* go for a standard form net!... */ - p = strchr(dest, '!'); - if(p == 0){ - snprint(net, sizeof(net), "net!%s", dest); - } else { - strncpy(net, dest, sizeof(net)-1); - net[sizeof(net)-1] = 0; - } - - /* call the connection server */ - fd = sysopen("/net/cs", ORDWR); - if(fd < 0){ - /* no connection server, don't translate */ - p = strchr(net, '!'); - *p++ = 0; - snprint(clone, sizeof(clone), "/net/%s/clone", net); - return call(clone, p, cfdp, dir, local); - } - - /* - * send dest to connection to translate - */ - if(syswrite(fd, net, strlen(net)) < 0){ - werrstr("%s: %r", net); - sysclose(fd); - return -1; - } - - /* - * loop through each address from the connection server till - * we get one that works. - */ - rv = -1; - sysseek(fd, 0, 0); - while((n = sysread(fd, net, sizeof(net) - 1)) > 0){ - net[n] = 0; - p = strchr(net, ' '); - if(p == 0) - continue; - *p++ = 0; - rv = call(net, p, cfdp, dir, local); - if(rv >= 0) - break; - } - sysclose(fd); - return rv; -} - -static int -identtrans(char *addr, char *naddr, int na, char *file, int nf) -{ - char *p; - char reply[4*NAMELEN]; - - /* parse the network */ - strncpy(reply, addr, sizeof(reply)); - reply[sizeof(reply)-1] = 0; - p = strchr(reply, '!'); - if(p) - *p++ = 0; - - sprint(file, "/net/%.*s/clone", na - sizeof("/net//clone"), reply); - strncpy(naddr, p, na); - naddr[na-1] = 0; - return 1; -} - -static int -nettrans(char *addr, char *naddr, int na, char *file, int nf) -{ - long n; - int fd; - char *cp; - char reply[4*NAMELEN]; - - /* - * ask the connection server - */ - fd = sysopen("/net/cs", ORDWR); - if(fd < 0) - return identtrans(addr, naddr, na, file, nf); - if(syswrite(fd, addr, strlen(addr)) < 0){ - sysclose(fd); - return -1; - } - sysseek(fd, 0, 0); - n = sysread(fd, reply, sizeof(reply)-1); - sysclose(fd); - if(n <= 0) - return -1; - reply[n] = '\0'; - - /* - * parse the reply - */ - cp = strchr(reply, ' '); - if(cp == 0) - return -1; - *cp++ = 0; - strncpy(naddr, cp, na); - naddr[na-1] = 0; - strncpy(file, reply, nf); - file[nf-1] = 0; - return 0; -} - -int -sysannounce(char *addr, char *dir) -{ - char *cp; - int ctl, n, m; - char buf[3*NAMELEN]; - char buf2[3*NAMELEN]; - char netdir[2*NAMELEN]; - char naddr[3*NAMELEN]; - - /* - * translate the address - */ - if(nettrans(addr, naddr, sizeof(naddr), netdir, sizeof(netdir)) < 0){ - werrstr("can't translate address"); - return -1; - } - - /* - * get a control channel - */ - ctl = sysopen(netdir, ORDWR); - if(ctl<0){ - werrstr("can't open control channel"); - return -1; - } - cp = strrchr(netdir, '/'); - *cp = 0; - - /* - * find out which line we have - */ - n = sprint(buf, "%.*s/", 2*NAMELEN+1, netdir); - m = sysread(ctl, &buf[n], sizeof(buf)-n-1); - if(m <= 0) { - sysclose(ctl); - werrstr("can't read control file"); - return -1; - } - buf[n+m] = 0; - - /* - * make the call - */ - n = sprint(buf2, "announce %.*s", 2*NAMELEN, naddr); - if(syswrite(ctl, buf2, n) != n) { - sysclose(ctl); - werrstr("announcement fails"); - return -1; - } - - strcpy(dir, buf); - - return ctl; -} - -int -syslisten(char *dir, char *newdir) -{ - char *cp; - int ctl, n, m; - char buf[3*NAMELEN]; - - /* - * open listen, wait for a call - */ - sprint(buf, "%.*s/listen", 2*NAMELEN+1, dir); - ctl = sysopen(buf, ORDWR); - if(ctl < 0) - return -1; - - /* - * find out which line we have - */ - strcpy(buf, dir); - cp = strrchr(buf, '/'); - *++cp = 0; - n = cp-buf; - m = sysread(ctl, cp, sizeof(buf) - n - 1); - if(n<=0){ - sysclose(ctl); - return -1; - } - buf[n+m] = 0; - - strcpy(newdir, buf); - return ctl; -} diff --git a/sys/src/cmd/unix/drawterm/kern/waserror.c b/sys/src/cmd/unix/drawterm/kern/waserror.c deleted file mode 100644 index 3a07bc928..000000000 --- a/sys/src/cmd/unix/drawterm/kern/waserror.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -Label* -pwaserror(void) -{ - if(up->nerrlab == NERR) - panic("error stack overflow"); - return &up->errlab[up->nerrlab++]; -} - -void -nexterror(void) -{ - longjmp(up->errlab[--up->nerrlab].buf, 1); -} - -void -error(char *e) -{ - kstrcpy(up->errstr, e, ERRMAX); - setjmp(up->errlab[NERR-1].buf); - nexterror(); -} diff --git a/sys/src/cmd/unix/drawterm/kern/win32.c b/sys/src/cmd/unix/drawterm/kern/win32.c deleted file mode 100644 index fa79c1d54..000000000 --- a/sys/src/cmd/unix/drawterm/kern/win32.c +++ /dev/null @@ -1,470 +0,0 @@ -#include <windows.h> -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include <libsec.h> - -typedef struct Oproc Oproc; -struct Oproc { - int tid; - HANDLE *sema; -}; - -static int tlsx = TLS_OUT_OF_INDEXES; - -char *argv0; - -Proc* -_getproc(void) -{ - if(tlsx == TLS_OUT_OF_INDEXES) - return nil; - return TlsGetValue(tlsx); -} - -void -_setproc(Proc *p) -{ - if(tlsx == TLS_OUT_OF_INDEXES){ - tlsx = TlsAlloc(); - if(tlsx == TLS_OUT_OF_INDEXES) - panic("out of indexes"); - } - TlsSetValue(tlsx, p); -} - -void -oserror(void) -{ - oserrstr(); - nexterror(); -} - -void -osinit(void) -{ - Oproc *t; - static Proc firstprocCTstore; - - _setproc(&firstprocCTstore); - t = (Oproc*)firstprocCTstore.oproc; - assert(t != 0); - - t->tid = GetCurrentThreadId(); - t->sema = CreateSemaphore(0, 0, 1000, 0); - if(t->sema == 0) { - oserror(); - panic("could not create semaphore: %r"); - } -} - -void -osnewproc(Proc *p) -{ - Oproc *op; - - op = (Oproc*)p->oproc; - op->sema = CreateSemaphore(0, 0, 1000, 0); - if (op->sema == 0) { - oserror(); - panic("could not create semaphore: %r"); - } -} - -void -osmsleep(int ms) -{ - Sleep((DWORD) ms); -} - -void -osyield(void) -{ - Sleep(0); -} - -static DWORD WINAPI tramp(LPVOID vp); - -void -osproc(Proc *p) -{ - DWORD tid; - - if(CreateThread(0, 0, tramp, p, 0, &tid) == 0) { - oserror(); - panic("osproc: %r"); - } - - Sleep(0); -} - -static DWORD WINAPI -tramp(LPVOID vp) -{ - Proc *p = (Proc *) vp; - Oproc *op = (Oproc*) p->oproc; - - _setproc(p); - op->tid = GetCurrentThreadId(); - op->sema = CreateSemaphore(0, 0, 1000, 0); - if(op->sema == 0) { - oserror(); - panic("could not create semaphore: %r"); - } - - (*p->fn)(p->arg); - ExitThread(0); - return 0; -} - -void -procsleep(void) -{ - Proc *p; - Oproc *op; - - p = up; - op = (Oproc*)p->oproc; - WaitForSingleObject(op->sema, INFINITE);} - -void -procwakeup(Proc *p) -{ - Oproc *op; - - op = (Oproc*)p->oproc; - ReleaseSemaphore(op->sema, 1, 0); -} - -void -random20(uchar *p) -{ - LARGE_INTEGER ti; - int i, j; - FILETIME ft; - DigestState ds; - vlong tsc; - - GetSystemTimeAsFileTime(&ft); - memset(&ds, 0, sizeof ds); - sha1((uchar*)&ft, sizeof(ft), 0, &ds); - for(i=0; i<50; i++) { - for(j=0; j<10; j++) { - QueryPerformanceCounter(&ti); - sha1((uchar*)&ti, sizeof(ti), 0, &ds); - tsc = GetTickCount(); - sha1((uchar*)&tsc, sizeof(tsc), 0, &ds); - } - Sleep(10); - } - sha1(0, 0, p, &ds); -} - -void -randominit(void) -{ -} - -ulong -randomread(void *v, ulong n) -{ - int i; - uchar p[20]; - - for(i=0; i<n; i+=20){ - random20(p); - if(i+20 <= n) - memmove((char*)v+i, p, 20); - else - memmove((char*)v+i, p, n-i); - } - return n; -} - -long -seconds(void) -{ - return time(0); -} - -ulong -ticks(void) -{ - return GetTickCount(); -} - -#if 0 -uvlong -fastticks(uvlong *v) -{ - uvlong n; - - n = GetTickCount() * 1000 * 1000; - if(v) - *v = n; - return n; -} -#endif - -extern int main(int, char*[]); - - -int -wstrutflen(Rune *s) -{ - int n; - - for(n=0; *s; n+=runelen(*s),s++) - ; - return n; -} - -int -wstrtoutf(char *s, Rune *t, int n) -{ - int i; - char *s0; - - s0 = s; - if(n <= 0) - return wstrutflen(t)+1; - while(*t) { - if(n < UTFmax+1 && n < runelen(*t)+1) { - *s = 0; - return s-s0+wstrutflen(t)+1; - } - i = runetochar(s, t); - s += i; - n -= i; - t++; - } - *s = 0; - return s-s0; -} - -int -win_hasunicode(void) -{ - OSVERSIONINFOA osinfo; - int r; - - osinfo.dwOSVersionInfoSize = sizeof(osinfo); - if(!GetVersionExA(&osinfo)) - panic("GetVersionEx failed"); - switch(osinfo.dwPlatformId) { - default: - panic("unknown PlatformId"); - case VER_PLATFORM_WIN32s: - panic("Win32s not supported"); - case VER_PLATFORM_WIN32_WINDOWS: - r = 0; - break; - case VER_PLATFORM_WIN32_NT: - r = 1; - break; - } - - return r; -} - -int -wstrlen(Rune *s) -{ - int n; - - for(n=0; *s; s++,n++) - ; - return n; -} -static int args(char *argv[], int n, char *p); - -int APIENTRY -WinMain(HINSTANCE x, HINSTANCE y, LPSTR z, int w) -{ - int argc, n; - char *arg, *p, **argv; - Rune *warg; - - if(0 && win_hasunicode()){ - warg = GetCommandLineW(); - n = (wstrlen(warg)+1)*UTFmax; - arg = malloc(n); - wstrtoutf(arg, warg, n); - }else - arg = GetCommandLineA(); - - /* conservative guess at the number of args */ - for(argc=4,p=arg; *p; p++) - if(*p == ' ' || *p == '\t') - argc++; - argv = malloc(argc*sizeof(char*)); - argc = args(argv, argc, arg); - - mymain(argc, argv); - ExitThread(0); - return 0; -} - -/* - * Break the command line into arguments - * The rules for this are not documented but appear to be the following - * according to the source for the microsoft C library. - * Words are seperated by space or tab - * Words containing a space or tab can be quoted using " - * 2N backslashes + " ==> N backslashes and end quote - * 2N+1 backslashes + " ==> N backslashes + literal " - * N backslashes not followed by " ==> N backslashes - */ -static int -args(char *argv[], int n, char *p) -{ - char *p2; - int i, j, quote, nbs; - - for(i=0; *p && i<n-1; i++) { - while(*p == ' ' || *p == '\t') - p++; - quote = 0; - argv[i] = p2 = p; - for(;*p; p++) { - if(!quote && (*p == ' ' || *p == '\t')) - break; - for(nbs=0; *p == '\\'; p++,nbs++) - ; - if(*p == '"') { - for(j=0; j<(nbs>>1); j++) - *p2++ = '\\'; - if(nbs&1) - *p2++ = *p; - else - quote = !quote; - } else { - for(j=0; j<nbs; j++) - *p2++ = '\\'; - *p2++ = *p; - } - } - /* move p up one to avoid pointing to null at end of p2 */ - if(*p) - p++; - *p2 = 0; - } - argv[i] = 0; - - return i; -} -/* - * Windows socket error messages - * There must be a way to get these strings out of the library. - * This table is derived from the MSDN online help. - */ -static struct { - int e; - char *s; -} tab[] = { - { 10004, "interrupted function call" }, - { 10013, "permission denied" }, - { 10014, "bad address" }, - { 10022, "invalid argument" }, - { 10024, "too many open files" }, - { 10035, "resource temporarily unavailable" }, - { 10036, "operation now in progress" }, - { 10037, "operation already in progress" }, - { 10038, "socket operation on nonsocket" }, - { 10039, "destination address required" }, - { 10040, "message too long" }, - { 10041, "protocol wrong type for socket" }, - { 10042, "bad protocol option" }, - { 10043, "protocol not supported" }, - { 10044, "socket type not supported" }, - { 10045, "operation not supported" }, - { 10046, "protocol family not supported" }, - { 10047, "address family not supported by protocol family" }, - { 10048, "address already in use" }, - { 10049, "cannot assign requested address" }, - { 10050, "network is down" }, - { 10051, "network is unreachable" }, - { 10052, "network dropped connection on reset" }, - { 10053, "software caused connection abort" }, - { 10054, "connection reset by peer" }, - { 10055, "no buffer space available" }, - { 10056, "socket is already connected" }, - { 10057, "socket is not connected" }, - { 10058, "cannot send after socket shutdown" }, - { 10060, "connection timed out" }, - { 10061, "connection refused" }, - { 10064, "host is down" }, - { 10065, "no route to host" }, - { 10067, "too many processes" }, - { 10091, "network subsystem is unavailable" }, - { 10092, "winsock.dll version out of range" }, - { 10093, "wsastartup not called" }, - { 10101, "graceful shutdown in progress" }, - { 10109, "class type not found" }, - { 11001, "host name not found" }, - { 11002, "host not found (non-authoritative)" }, - { 11003, "nonrecoverable error" }, - { 11004, "valid name, but no data record of requested type" }, -}; - -void -osrerrstr(char *buf, uint nbuf) -{ - char *p, *q; - int e, i, r; - - e = GetLastError(); - r = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, - 0, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - buf, nbuf, 0); - if(r == 0){ - for(i=0; i<nelem(tab); i++) - if(tab[i].e == e){ - strecpy(buf, buf+nbuf, tab[i].s); - break; - } - if(i==nelem(tab)) - snprint(buf, nbuf, "windows error %d", e); - } - - for(p=q=buf; *p; p++) { - if(*p == '\r') - continue; - if(*p == '\n') - *q++ = ' '; - else - *q++ = *p; - } - *q = '\0'; -} - -void -oserrstr(void) -{ - osrerrstr(up->errstr, ERRMAX); -} - -long -showfilewrite(char *a, int n) -{ - Rune *action, *arg, *cmd; - static Rune Lopen[] = { 'o', 'p', 'e', 'n', 0 }; - - cmd = runesmprint("%.*s", n, a); - if(cmd == nil) - error("out of memory"); - if(cmd[runestrlen(cmd)-1] == '\n') - cmd[runestrlen(cmd)] = 0; - p = runestrchr(cmd, ' '); - if(p){ - action = cmd; - *p++ = 0; - arg = p; - }else{ - action = Lopen; - arg = cmd; - } - ShellExecute(0, 0, action, arg, 0, SW_SHOWNORMAL); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/latin1.c b/sys/src/cmd/unix/drawterm/latin1.c deleted file mode 100644 index eede94b80..000000000 --- a/sys/src/cmd/unix/drawterm/latin1.c +++ /dev/null @@ -1,177 +0,0 @@ -#include "u.h" -#include "libc.h" - -/* - * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a - * prefix of latintab[j].ld only when j<i. - */ -struct cvlist -{ - char *ld; /* must be seen before using this conversion */ - char *si; /* options for last input characters */ - Rune so[50]; /* the corresponding Rune for each si entry */ -} latintab[] = { - " ", " i", { 0x2423, 0x0131 }, - "w", "kqrbnp", { 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2659, }, - "x", "O", { 0x2297, }, - "f", "a", { 0x2200, }, - "=", "V:=O<>", { 0x21D2, 0x2255, 0x2261, 0x229C, 0x22DC, 0x22DD, }, - "V", "=", { 0x21D0, }, - "7", "8", { 0x215E, }, - "5", "68", { 0x215A, 0x215D, }, - "4", "5", { 0x2158, }, - "R", "R", { 0x211D, }, - "Q", "Q", { 0x211A, }, - "P", "P", { 0x2119, }, - "C", "CAU", { 0x2102, 0x22C2, 0x22C3, }, - "e", "nmsl", { 0x2013, 0x2014, 0x2205, 0x22EF, }, - "b", "u0123456789+-=()kqrbnp", { 0x2022, 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x208A, 0x208B, 0x208C, 0x208D, 0x208E, 0x265A, 0x265B, 0x265C, 0x265D, 0x265E, 0x265F, }, - "@e", "h", { 0x44D, }, - "@\'", "\'", { 0x44A, }, - "@s", "hc", { 0x448, 0x449, }, - "@c", "h", { 0x447, }, - "@t", "s", { 0x446, }, - "@k", "h", { 0x445, }, - "@z", "h", { 0x436, }, - "@y", "euao", { 0x435, 0x44E, 0x44F, 0x451, }, - "@E", "Hh", { 0x42D, 0x42D, }, - "@S", "HhCc", { 0x428, 0x428, 0x429, 0x429, }, - "@C", "Hh", { 0x427, 0x427, }, - "@T", "Ss", { 0x426, 0x426, }, - "@K", "Hh", { 0x425, 0x425, }, - "@Z", "Hh", { 0x416, 0x416, }, - "@@", "EZKSTYezksty\'", { 0x415, 0x417, 0x41A, 0x421, 0x422, 0x42B, 0x435, 0x437, 0x43A, 0x441, 0x442, 0x44B, 0x44C, }, - "@Y", "OoEeUuAa", { 0x401, 0x401, 0x415, 0x415, 0x42E, 0x42E, 0x42F, 0x42F, }, - "@", "ABVGDIJLMNOPRUFXabvgdijlmnoprufx", { 0x410, 0x411, 0x412, 0x413, 0x414, 0x418, 0x419, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x423, 0x424, 0x425, 0x430, 0x431, 0x432, 0x433, 0x434, 0x438, 0x439, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x443, 0x444, 0x445, }, - "*", "ABGDEZYHIKLMNCOPRSTUFXQWabgdezyhiklmncoprstufxqw*", { 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x2217, }, - "G", "-", { 0x1E4, }, - "N", "JjN", { 0x1CA, 0x1CB, 0x2115, }, - "2", "-35", { 0x1BB, 0x2154, 0x2156, }, - "z", "-", { 0x1B6, }, - "Z", "-Z", { 0x1B5, 0x2124, }, - "Y", "R", { 0x1A6, }, - "h", "v-", { 0x195, 0x210F, }, - "$*", "hfk", { 0x3D1, 0x3D5, 0x3F0, }, - "$", "fVavgHILlpRBeEFMo", { 0x192, 0x1B2, 0x251, 0x28B, 0x210A, 0x210B, 0x2110, 0x2112, 0x2113, 0x2118, 0x211B, 0x212C, 0x212F, 0x2130, 0x2131, 0x2133, 0x2134, }, - "t", "-smefu", { 0x167, 0x3C2, 0x2122, 0x2203, 0x2234, 0x22A2, }, - "T", "-u", { 0x166, 0x22A8, }, - "L", "-Jj&|", { 0x141, 0x1C7, 0x1C8, 0x22C0, 0x22C1, }, - "i", "j-fsbp", { 0x133, 0x268, 0x221E, 0x222B, 0x2286, 0x2287, }, - "I", "J-", { 0x132, 0x197, }, - "H", "-H", { 0x126, 0x210D, }, - "v\"", "Uu", { 0x1D9, 0x1DA, }, - "v", "CcDdEeLlNnRrSsTtZzAaIiOoUuGgKkj", { 0x10C, 0x10D, 0x10E, 0x10F, 0x11A, 0x11B, 0x13D, 0x13E, 0x147, 0x148, 0x158, 0x159, 0x160, 0x161, 0x164, 0x165, 0x17D, 0x17E, 0x1CD, 0x1CE, 0x1CF, 0x1D0, 0x1D1, 0x1D2, 0x1D3, 0x1D4, 0x1E6, 0x1E7, 0x1E8, 0x1E9, 0x1F0, }, - "u", "AEeGgIiOoUu-a", { 0x102, 0x114, 0x115, 0x11E, 0x11F, 0x12C, 0x12D, 0x14E, 0x14F, 0x16C, 0x16D, 0x289, 0x2191, }, - ":", "-=()", { 0xF7, 0x2254, 0x2639, 0x263A, }, - "a", "ebn", { 0xE6, 0x2194, 0x2220, }, - "/", "Oo", { 0xD8, 0xF8, }, - "Dv", "Zz", { 0x1C4, 0x1C5, }, - "D", "-e", { 0xD0, 0x2206, }, - "A", "E", { 0xC6, }, - "o", "AaeUuiO", { 0xC5, 0xE5, 0x153, 0x16E, 0x16F, 0x1A3, 0x229A, }, - "~!", "=", { 0x2246, }, - "~", "ANOanoIiUu-=~", { 0xC3, 0xD1, 0xD5, 0xE3, 0xF1, 0xF5, 0x128, 0x129, 0x168, 0x169, 0x2243, 0x2245, 0x2248, }, - "^", "AEIOUaeiouCcGgHhJjSsWwYy", { 0xC2, 0xCA, 0xCE, 0xD4, 0xDB, 0xE2, 0xEA, 0xEE, 0xF4, 0xFB, 0x108, 0x109, 0x11C, 0x11D, 0x124, 0x125, 0x134, 0x135, 0x15C, 0x15D, 0x174, 0x175, 0x176, 0x177, }, - "`\"", "Uu", { 0x1DB, 0x1DC, }, - "`", "AEIOUaeiou", { 0xC0, 0xC8, 0xCC, 0xD2, 0xD9, 0xE0, 0xE8, 0xEC, 0xF2, 0xF9, }, - "?", "?!", { 0xBF, 0x203D, }, - "3", "458", { 0xBE, 0x2157, 0x215C, }, - "1", "423568", { 0xBC, 0xBD, 0x2153, 0x2155, 0x2159, 0x215B, }, - ">!", "=~", { 0x2269, 0x22E7, }, - ">", ">=~<", { 0xBB, 0x2265, 0x2273, 0x2277, }, - ",", ",CcAaEeGgIiKkLlNnRrSsTtUuOo", { 0xB8, 0xC7, 0xE7, 0x104, 0x105, 0x118, 0x119, 0x122, 0x123, 0x12E, 0x12F, 0x136, 0x137, 0x13B, 0x13C, 0x145, 0x146, 0x156, 0x157, 0x15E, 0x15F, 0x162, 0x163, 0x172, 0x173, 0x1EA, 0x1EB, }, - ".", ".CcEeGgILlZzO", { 0xB7, 0x10A, 0x10B, 0x116, 0x117, 0x120, 0x121, 0x130, 0x13F, 0x140, 0x17B, 0x17C, 0x2299, }, - "p", "gOdrt", { 0xB6, 0x2117, 0x2202, 0x220F, 0x221D, }, - "m", "iuo", { 0xB5, 0xD7, 0x2208, }, - "\'\"", "Uu", { 0x1D7, 0x1D8, }, - "\'", "\'AEIOUYaeiouyCcgLlNnRrSsZz", { 0xB4, 0xC1, 0xC9, 0xCD, 0xD3, 0xDA, 0xDD, 0xE1, 0xE9, 0xED, 0xF3, 0xFA, 0xFD, 0x106, 0x107, 0x123, 0x139, 0x13A, 0x143, 0x144, 0x154, 0x155, 0x15A, 0x15B, 0x179, 0x17A, }, - "+", "-O", { 0xB1, 0x2295, }, - "dv", "z", { 0x1C6, }, - "d", "e-zgda", { 0xB0, 0xF0, 0x2A3, 0x2020, 0x2021, 0x2193, }, - "_,", "Oo", { 0x1EC, 0x1ED, }, - "_.", "Aa", { 0x1E0, 0x1E1, }, - "_\"", "UuAa", { 0x1D5, 0x1D6, 0x1DE, 0x1DF, }, - "_", "_AaEeIiOoUu", { 0xAF, 0x100, 0x101, 0x112, 0x113, 0x12A, 0x12B, 0x14C, 0x14D, 0x16A, 0x16B, }, - "r", "O\'\"", { 0xAE, 0x2019, 0x201D, }, - "-*", "l", { 0x19B, }, - "-", "-Dd:HLlTtbIZz2Ggiuh>+~O", { 0xAD, 0xD0, 0xF0, 0xF7, 0x126, 0x141, 0x142, 0x166, 0x167, 0x180, 0x197, 0x1B5, 0x1B6, 0x1BB, 0x1E4, 0x1E5, 0x268, 0x289, 0x210F, 0x2192, 0x2213, 0x2242, 0x2296, }, - "n", "oj", { 0xAC, 0x1CC, }, - "<!", "=~", { 0x2268, 0x22E6, }, - "<", "<-=~>", { 0xAB, 0x2190, 0x2264, 0x2272, 0x2276, }, - "s", "a231os0456789+-=()nturbp", { 0xAA, 0xB2, 0xB3, 0xB9, 0xBA, 0xDF, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x207A, 0x207B, 0x207C, 0x207D, 0x207E, 0x207F, 0x220D, 0x2211, 0x221A, 0x2282, 0x2283, }, - "O", "crEIp+-x/.o*=", { 0xA9, 0xAE, 0x152, 0x1A2, 0x2117, 0x2295, 0x2296, 0x2297, 0x2298, 0x2299, 0x229A, 0x229B, 0x229C, }, - "\"*", "IUiu", { 0x3AA, 0x3AB, 0x3CA, 0x3CB, }, - "\"", "\"AEIOUaeiouyY", { 0xA8, 0xC4, 0xCB, 0xCF, 0xD6, 0xDC, 0xE4, 0xEB, 0xEF, 0xF6, 0xFC, 0xFF, 0x178, }, - "S", "S", { 0xA7, }, - "|", "|Pp", { 0xA6, 0xDE, 0xFE, }, - "y", "$", { 0xA5, }, - "g", "$-r", { 0xA4, 0x1E5, 0x2207, }, - "l", "$-j\'\"&|z", { 0xA3, 0x142, 0x1C9, 0x2018, 0x201C, 0x2227, 0x2228, 0x22C4, }, - "c", "$Oaug", { 0xA2, 0xA9, 0x2229, 0x222A, 0x2245, }, - "!~", "-=~", { 0x2244, 0x2247, 0x2249, }, - "!", "!?m=<>bp", { 0xA1, 0x203D, 0x2209, 0x2260, 0x226E, 0x226F, 0x2284, 0x2285, }, - 0, 0, { 0, } -}; - -/* - * Given 5 characters k[0]..k[4], find the rune or return -1 for failure. - */ -long -unicode(Rune *k) -{ - long i, c; - - k++; /* skip 'X' */ - c = 0; - for(i=0; i<4; i++,k++){ - c <<= 4; - if('0'<=*k && *k<='9') - c += *k-'0'; - else if('a'<=*k && *k<='f') - c += 10 + *k-'a'; - else if('A'<=*k && *k<='F') - c += 10 + *k-'A'; - else - return -1; - } - return c; -} - -/* - * Given n characters k[0]..k[n-1], find the corresponding rune or return -1 for - * failure, or something < -1 if n is too small. In the latter case, the result - * is minus the required n. - */ -long -latin1(Rune *k, int n) -{ - struct cvlist *l; - int c; - char* p; - - if(k[0] == 'X'){ - if(n>=5) - return unicode(k); - else - return -5; - } - - for(l=latintab; l->ld!=0; l++) - if(k[0] == l->ld[0]){ - if(n == 1) - return -2; - if(l->ld[1] == 0) - c = k[1]; - else if(l->ld[1] != k[1]) - continue; - else if(n == 2) - return -3; - else - c = k[2]; - for(p=l->si; *p!=0; p++) - if(*p == c) - return l->so[p - l->si]; - return -1; - } - return -1; -} diff --git a/sys/src/cmd/unix/drawterm/libauth/Makefile b/sys/src/cmd/unix/drawterm/libauth/Makefile deleted file mode 100644 index 39b1ec9e4..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -ROOT=.. -include ../Make.config - -LIB=libauth.a -OFILES=\ - attr.$O\ - auth_attr.$O\ - auth_challenge.$O\ - auth_getuserpasswd.$O\ - auth_proxy.$O\ - auth_respond.$O\ - auth_rpc.$O\ - auth_userpasswd.$O\ - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/libauth/attr.c b/sys/src/cmd/unix/drawterm/libauth/attr.c deleted file mode 100644 index fcfa35f6a..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/attr.c +++ /dev/null @@ -1,174 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> - -int -_attrfmt(Fmt *fmt) -{ - char *b, buf[1024], *ebuf; - Attr *a; - - ebuf = buf+sizeof buf; - b = buf; - strcpy(buf, " "); - for(a=va_arg(fmt->args, Attr*); a; a=a->next){ - if(a->name == nil) - continue; - switch(a->type){ - case AttrQuery: - b = seprint(b, ebuf, " %q?", a->name); - break; - case AttrNameval: - b = seprint(b, ebuf, " %q=%q", a->name, a->val); - break; - case AttrDefault: - b = seprint(b, ebuf, " %q:=%q", a->name, a->val); - break; - } - } - return fmtstrcpy(fmt, buf+1); -} - -Attr* -_copyattr(Attr *a) -{ - Attr **la, *na; - - na = nil; - la = &na; - for(; a; a=a->next){ - *la = _mkattr(a->type, a->name, a->val, nil); - setmalloctag(*la, getcallerpc(&a)); - la = &(*la)->next; - } - *la = nil; - return na; -} - -Attr* -_delattr(Attr *a, char *name) -{ - Attr *fa; - Attr **la; - - for(la=&a; *la; ){ - if(strcmp((*la)->name, name) == 0){ - fa = *la; - *la = (*la)->next; - fa->next = nil; - _freeattr(fa); - }else - la=&(*la)->next; - } - return a; -} - -Attr* -_findattr(Attr *a, char *n) -{ - for(; a; a=a->next) - if(strcmp(a->name, n) == 0 && a->type != AttrQuery) - return a; - return nil; -} - -void -_freeattr(Attr *a) -{ - Attr *anext; - - for(; a; a=anext){ - anext = a->next; - free(a->name); - free(a->val); - a->name = (void*)~0; - a->val = (void*)~0; - a->next = (void*)~0; - free(a); - } -} - -Attr* -_mkattr(int type, char *name, char *val, Attr *next) -{ - Attr *a; - - a = malloc(sizeof(*a)); - if(a==nil) - sysfatal("_mkattr malloc: %r"); - a->type = type; - a->name = strdup(name); - a->val = strdup(val); - if(a->name==nil || a->val==nil) - sysfatal("_mkattr malloc: %r"); - a->next = next; - setmalloctag(a, getcallerpc(&type)); - return a; -} - -static Attr* -cleanattr(Attr *a) -{ - Attr *fa; - Attr **la; - - for(la=&a; *la; ){ - if((*la)->type==AttrQuery && _findattr(a, (*la)->name)){ - fa = *la; - *la = (*la)->next; - fa->next = nil; - _freeattr(fa); - }else - la=&(*la)->next; - } - return a; -} - -Attr* -_parseattr(char *s) -{ - char *p, *t, *tok[256]; - int i, ntok, type; - Attr *a; - - s = strdup(s); - if(s == nil) - sysfatal("_parseattr strdup: %r"); - - ntok = tokenize(s, tok, nelem(tok)); - a = nil; - for(i=ntok-1; i>=0; i--){ - t = tok[i]; - if((p = strchr(t, '='))){ - *p++ = '\0'; - // if(p-2 >= t && p[-2] == ':'){ - // p[-2] = '\0'; - // type = AttrDefault; - // }else - type = AttrNameval; - a = _mkattr(type, t, p, a); - setmalloctag(a, getcallerpc(&s)); - } - else if(t[strlen(t)-1] == '?'){ - t[strlen(t)-1] = '\0'; - a = _mkattr(AttrQuery, t, "", a); - setmalloctag(a, getcallerpc(&s)); - }else{ - /* really a syntax error, but better to provide some indication */ - a = _mkattr(AttrNameval, t, "", a); - setmalloctag(a, getcallerpc(&s)); - } - } - free(s); - return cleanattr(a); -} - -char* -_strfindattr(Attr *a, char *n) -{ - a = _findattr(a, n); - if(a == nil) - return nil; - return a->val; -} - diff --git a/sys/src/cmd/unix/drawterm/libauth/auth_attr.c b/sys/src/cmd/unix/drawterm/libauth/auth_attr.c deleted file mode 100644 index 8842590a9..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/auth_attr.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <authsrv.h> -#include "authlocal.h" - -Attr* -auth_attr(AuthRpc *rpc) -{ - if(auth_rpc(rpc, "attr", nil, 0) != ARok) - return nil; - return _parseattr(rpc->arg); -} diff --git a/sys/src/cmd/unix/drawterm/libauth/auth_challenge.c b/sys/src/cmd/unix/drawterm/libauth/auth_challenge.c deleted file mode 100644 index 298f5f1b2..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/auth_challenge.c +++ /dev/null @@ -1,117 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <authsrv.h> -#include "authlocal.h" - -Chalstate* -auth_challenge(char *fmt, ...) -{ - char *p; - va_list arg; - Chalstate *c; - - quotefmtinstall(); /* just in case */ - va_start(arg, fmt); - p = vsmprint(fmt, arg); - va_end(arg); - if(p == nil) - return nil; - - c = mallocz(sizeof(*c), 1); - if(c == nil){ - free(p); - return nil; - } - - if((c->afd = open("/mnt/factotum/rpc", ORDWR)) < 0){ - Error: - auth_freechal(c); - free(p); - return nil; - } - - if((c->rpc=auth_allocrpc(c->afd)) == nil - || auth_rpc(c->rpc, "start", p, strlen(p)) != ARok - || auth_rpc(c->rpc, "read", nil, 0) != ARok) - goto Error; - - if(c->rpc->narg > sizeof(c->chal)-1){ - werrstr("buffer too small for challenge"); - goto Error; - } - memmove(c->chal, c->rpc->arg, c->rpc->narg); - c->nchal = c->rpc->narg; - free(p); - return c; -} - -AuthInfo* -auth_response(Chalstate *c) -{ - int ret; - AuthInfo *ai; - - ai = nil; - if(c->afd < 0){ - werrstr("auth_response: connection not open"); - return nil; - } - if(c->resp == nil){ - werrstr("auth_response: nil response"); - return nil; - } - if(c->nresp == 0){ - werrstr("auth_response: unspecified response length"); - return nil; - } - - if(c->user){ - if(auth_rpc(c->rpc, "write", c->user, strlen(c->user)) != ARok){ - /* - * if this fails we're out of phase with factotum. - * give up. - */ - goto Out; - } - } - - if(auth_rpc(c->rpc, "write", c->resp, c->nresp) != ARok){ - /* - * don't close the connection -- maybe we'll try again. - */ - return nil; - } - - switch(ret = auth_rpc(c->rpc, "read", nil, 0)){ - case ARok: - default: - werrstr("factotum protocol botch %d %s", ret, c->rpc->ibuf); - break; - case ARdone: - ai = auth_getinfo(c->rpc); - break; - } - -Out: - close(c->afd); - auth_freerpc(c->rpc); - c->afd = -1; - c->rpc = nil; - return ai; -} - -void -auth_freechal(Chalstate *c) -{ - if(c == nil) - return; - - if(c->afd >= 0) - close(c->afd); - if(c->rpc != nil) - auth_freerpc(c->rpc); - - memset(c, 0xBB, sizeof(*c)); - free(c); -} diff --git a/sys/src/cmd/unix/drawterm/libauth/auth_getuserpasswd.c b/sys/src/cmd/unix/drawterm/libauth/auth_getuserpasswd.c deleted file mode 100644 index 186488f52..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/auth_getuserpasswd.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include "authlocal.h" - -enum { - ARgiveup = 100, -}; - -static int -dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey) -{ - int ret; - - for(;;){ - if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey) - return ret; - if(getkey == 0) - return ARgiveup; /* don't know how */ - if((*getkey)(rpc->arg) < 0) - return ARgiveup; /* user punted */ - } -} - -UserPasswd* -auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...) -{ - AuthRpc *rpc; - char *f[3], *p, *params; - int fd; - va_list arg; - UserPasswd *up; - - up = nil; - rpc = nil; - params = nil; - - fd = open("/mnt/factotum/rpc", ORDWR); - if(fd < 0) - goto out; - rpc = auth_allocrpc(fd); - if(rpc == nil) - goto out; - quotefmtinstall(); /* just in case */ - va_start(arg, fmt); - params = vsmprint(fmt, arg); - va_end(arg); - if(params == nil) - goto out; - - if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok - || dorpc(rpc, "read", nil, 0, getkey) != ARok) - goto out; - - rpc->arg[rpc->narg] = '\0'; - if(tokenize(rpc->arg, f, 2) != 2){ - werrstr("bad answer from factotum"); - goto out; - } - up = malloc(sizeof(*up)+rpc->narg+1); - if(up == nil) - goto out; - p = (char*)&up[1]; - strcpy(p, f[0]); - up->user = p; - p += strlen(p)+1; - strcpy(p, f[1]); - up->passwd = p; - -out: - free(params); - auth_freerpc(rpc); - close(fd); - return up; -} diff --git a/sys/src/cmd/unix/drawterm/libauth/auth_proxy.c b/sys/src/cmd/unix/drawterm/libauth/auth_proxy.c deleted file mode 100644 index b6b24df14..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/auth_proxy.c +++ /dev/null @@ -1,213 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> -#include <auth.h> -#include "authlocal.h" - -enum { - ARgiveup = 100, -}; - -static uchar* -gstring(uchar *p, uchar *ep, char **s) -{ - uint n; - - if(p == nil) - return nil; - if(p+BIT16SZ > ep) - return nil; - n = GBIT16(p); - p += BIT16SZ; - if(p+n > ep) - return nil; - *s = malloc(n+1); - memmove((*s), p, n); - (*s)[n] = '\0'; - p += n; - return p; -} - -static uchar* -gcarray(uchar *p, uchar *ep, uchar **s, int *np) -{ - uint n; - - if(p == nil) - return nil; - if(p+BIT16SZ > ep) - return nil; - n = GBIT16(p); - p += BIT16SZ; - if(p+n > ep) - return nil; - *s = malloc(n); - if(*s == nil) - return nil; - memmove((*s), p, n); - *np = n; - p += n; - return p; -} - -void -auth_freeAI(AuthInfo *ai) -{ - if(ai == nil) - return; - free(ai->cuid); - free(ai->suid); - free(ai->cap); - free(ai->secret); - free(ai); -} - -static uchar* -convM2AI(uchar *p, int n, AuthInfo **aip) -{ - uchar *e = p+n; - AuthInfo *ai; - - ai = mallocz(sizeof(*ai), 1); - if(ai == nil) - return nil; - - p = gstring(p, e, &ai->cuid); - p = gstring(p, e, &ai->suid); - p = gstring(p, e, &ai->cap); - p = gcarray(p, e, &ai->secret, &ai->nsecret); - if(p == nil) - auth_freeAI(ai); - else - *aip = ai; - return p; -} - -AuthInfo* -auth_getinfo(AuthRpc *rpc) -{ - AuthInfo *a; - - if(auth_rpc(rpc, "authinfo", nil, 0) != ARok) - return nil; - a = nil; - if(convM2AI((uchar*)rpc->arg, rpc->narg, &a) == nil){ - werrstr("bad auth info from factotum"); - return nil; - } - return a; -} - -static int -dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey) -{ - int ret; - - for(;;){ - if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey) - return ret; - if(getkey == 0) - return ARgiveup; /* don't know how */ - if((*getkey)(rpc->arg) < 0) - return ARgiveup; /* user punted */ - } -} - -/* - * this just proxies what the factotum tells it to. - */ -AuthInfo* -fauth_proxy(int fd, AuthRpc *rpc, AuthGetkey *getkey, char *params) -{ - char *buf; - int m, n, ret; - AuthInfo *a; - char oerr[ERRMAX]; - - rerrstr(oerr, sizeof oerr); - werrstr("UNKNOWN AUTH ERROR"); - - if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok){ - werrstr("fauth_proxy start: %r"); - return nil; - } - - buf = malloc(AuthRpcMax); - if(buf == nil) - return nil; - for(;;){ - switch(dorpc(rpc, "read", nil, 0, getkey)){ - case ARdone: - free(buf); - a = auth_getinfo(rpc); - errstr(oerr, sizeof oerr); /* no error, restore whatever was there */ - return a; - case ARok: - if(write(fd, rpc->arg, rpc->narg) != rpc->narg){ - werrstr("auth_proxy write fd: %r"); - goto Error; - } - break; - case ARphase: - n = 0; - memset(buf, 0, AuthRpcMax); - while((ret = dorpc(rpc, "write", buf, n, getkey)) == ARtoosmall){ - if(atoi(rpc->arg) > AuthRpcMax) - break; - m = read(fd, buf+n, atoi(rpc->arg)-n); - if(m <= 0){ - if(m == 0) - werrstr("auth_proxy short read: %s", buf); - goto Error; - } - n += m; - } - if(ret != ARok){ - werrstr("auth_proxy rpc write: %s: %r", buf); - goto Error; - } - break; - default: - werrstr("auth_proxy rpc: %r"); - goto Error; - } - } -Error: - free(buf); - return nil; -} - -AuthInfo* -auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...) -{ - int afd; - char *p; - va_list arg; - AuthInfo *ai; - AuthRpc *rpc; - - quotefmtinstall(); /* just in case */ - va_start(arg, fmt); - p = vsmprint(fmt, arg); - va_end(arg); - - afd = open("/mnt/factotum/rpc", ORDWR); - if(afd < 0){ - werrstr("opening /mnt/factotum/rpc: %r"); - free(p); - return nil; - } - - rpc = auth_allocrpc(afd); - if(rpc == nil){ - free(p); - return nil; - } - - ai = fauth_proxy(fd, rpc, getkey, p); - free(p); - auth_freerpc(rpc); - close(afd); - return ai; -} - diff --git a/sys/src/cmd/unix/drawterm/libauth/auth_respond.c b/sys/src/cmd/unix/drawterm/libauth/auth_respond.c deleted file mode 100644 index 5c6d177f3..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/auth_respond.c +++ /dev/null @@ -1,73 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <authsrv.h> -#include "authlocal.h" - -enum { - ARgiveup = 100, -}; - -static int -dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey) -{ - int ret; - - for(;;){ - if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey) - return ret; - if(getkey == 0) - return ARgiveup; /* don't know how */ - if((*getkey)(rpc->arg) < 0) - return ARgiveup; /* user punted */ - } -} - -int -auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nresp, AuthGetkey *getkey, char *fmt, ...) -{ - char *p, *s; - va_list arg; - int afd; - AuthRpc *rpc; - Attr *a; - - if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0) - return -1; - - if((rpc = auth_allocrpc(afd)) == nil){ - close(afd); - return -1; - } - - quotefmtinstall(); /* just in case */ - va_start(arg, fmt); - p = vsmprint(fmt, arg); - va_end(arg); - - if(p==nil - || dorpc(rpc, "start", p, strlen(p), getkey) != ARok - || dorpc(rpc, "write", chal, nchal, getkey) != ARok - || dorpc(rpc, "read", nil, 0, getkey) != ARok){ - free(p); - close(afd); - auth_freerpc(rpc); - return -1; - } - free(p); - - if(rpc->narg < nresp) - nresp = rpc->narg; - memmove(resp, rpc->arg, nresp); - - if((a = auth_attr(rpc)) != nil - && (s = _strfindattr(a, "user")) != nil && strlen(s) < nuser) - strcpy(user, s); - else if(nuser > 0) - user[0] = '\0'; - - _freeattr(a); - close(afd); - auth_freerpc(rpc); - return nresp; -} diff --git a/sys/src/cmd/unix/drawterm/libauth/auth_rpc.c b/sys/src/cmd/unix/drawterm/libauth/auth_rpc.c deleted file mode 100644 index 4333a7381..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/auth_rpc.c +++ /dev/null @@ -1,116 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include "authlocal.h" - -static struct { - char *verb; - int val; -} tab[] = { - "ok", ARok, - "done", ARdone, - "error", ARerror, - "needkey", ARneedkey, - "badkey", ARbadkey, - "phase", ARphase, - "toosmall", ARtoosmall, - "error", ARerror, -}; - -static int -classify(char *buf, uint n, AuthRpc *rpc) -{ - int i, len; - - for(i=0; i<nelem(tab); i++){ - len = strlen(tab[i].verb); - if(n >= len && memcmp(buf, tab[i].verb, len) == 0 && (n==len || buf[len]==' ')){ - if(n==len){ - rpc->narg = 0; - rpc->arg = ""; - }else{ - rpc->narg = n - (len+1); - rpc->arg = (char*)buf+len+1; - } - return tab[i].val; - } - } - werrstr("malformed rpc response: %s", buf); - return ARrpcfailure; -} - -AuthRpc* -auth_allocrpc(int afd) -{ - AuthRpc *rpc; - - rpc = mallocz(sizeof(*rpc), 1); - if(rpc == nil) - return nil; - rpc->afd = afd; - return rpc; -} - -void -auth_freerpc(AuthRpc *rpc) -{ - free(rpc); -} - -uint -auth_rpc(AuthRpc *rpc, char *verb, void *a, int na) -{ - int l, n, type; - char *f[4]; - - l = strlen(verb); - if(na+l+1 > AuthRpcMax){ - werrstr("rpc too big"); - return ARtoobig; - } - - memmove(rpc->obuf, verb, l); - rpc->obuf[l] = ' '; - memmove(rpc->obuf+l+1, a, na); - if((n=write(rpc->afd, rpc->obuf, l+1+na)) != l+1+na){ - if(n >= 0) - werrstr("auth_rpc short write"); - return ARrpcfailure; - } - - if((n=read(rpc->afd, rpc->ibuf, AuthRpcMax)) < 0) - return ARrpcfailure; - rpc->ibuf[n] = '\0'; - - /* - * Set error string for good default behavior. - */ - switch(type = classify(rpc->ibuf, n, rpc)){ - default: - werrstr("unknown rpc type %d (bug in auth_rpc.c)", type); - break; - case ARok: - break; - case ARrpcfailure: - break; - case ARerror: - if(rpc->narg == 0) - werrstr("unspecified rpc error"); - else - werrstr("%s", rpc->arg); - break; - case ARneedkey: - werrstr("needkey %s", rpc->arg); - break; - case ARbadkey: - if(getfields(rpc->arg, f, nelem(f), 0, "\n") < 2) - werrstr("badkey %s", rpc->arg); - else - werrstr("badkey %s", f[1]); - break; - case ARphase: - werrstr("phase error %s", rpc->arg); - break; - } - return type; -} diff --git a/sys/src/cmd/unix/drawterm/libauth/auth_userpasswd.c b/sys/src/cmd/unix/drawterm/libauth/auth_userpasswd.c deleted file mode 100644 index 34a38c26a..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/auth_userpasswd.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <authsrv.h> -#include "authlocal.h" - -/* - * compute the proper response. We encrypt the ascii of - * challenge number, with trailing binary zero fill. - * This process was derived empirically. - * this was copied from inet's guard. - */ -static void -netresp(char *key, long chal, char *answer) -{ - uchar buf[8]; - - memset(buf, 0, 8); - sprint((char *)buf, "%lud", chal); - if(encrypt(key, buf, 8) < 0) - abort(); - chal = (buf[0]<<24)+(buf[1]<<16)+(buf[2]<<8)+buf[3]; - sprint(answer, "%.8lux", chal); -} - -AuthInfo* -auth_userpasswd(char *user, char *passwd) -{ - char key[DESKEYLEN], resp[16]; - AuthInfo *ai; - Chalstate *ch; - - /* - * Probably we should have a factotum protocol - * to check a raw password. For now, we use - * p9cr, which is simplest to speak. - */ - if((ch = auth_challenge("user=%q proto=p9cr role=server", user)) == nil) - return nil; - - passtokey(key, passwd); - netresp(key, atol(ch->chal), resp); - memset(key, 0, sizeof key); - - ch->resp = resp; - ch->nresp = strlen(resp); - ai = auth_response(ch); - auth_freechal(ch); - return ai; -} diff --git a/sys/src/cmd/unix/drawterm/libauth/authlocal.h b/sys/src/cmd/unix/drawterm/libauth/authlocal.h deleted file mode 100644 index 2c52bf8b6..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/authlocal.h +++ /dev/null @@ -1 +0,0 @@ -extern AuthInfo* _fauth_proxy(int fd, AuthRpc *rpc, AuthGetkey *getkey, char *params); diff --git a/sys/src/cmd/unix/drawterm/libauth/httpauth.c b/sys/src/cmd/unix/drawterm/libauth/httpauth.c deleted file mode 100644 index 9d1b0d26f..000000000 --- a/sys/src/cmd/unix/drawterm/libauth/httpauth.c +++ /dev/null @@ -1,51 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <authsrv.h> - -/* deprecated. - This is the mechanism that put entries in /sys/lib/httpd.rewrite - and passwords on the authserver in /sys/lib/httppasswords, which - was awkward to administer. Instead, use local .httplogin files, - which are implemented in sys/src/cmd/ip/httpd/authorize.c */ - -int -httpauth(char *name, char *password) -{ - int afd; - Ticketreq tr; - Ticket t; - char key[DESKEYLEN]; - char buf[512]; - - afd = authdial(nil, nil); - if(afd < 0) - return -1; - - /* send ticket request to AS */ - memset(&tr, 0, sizeof(tr)); - strcpy(tr.uid, name); - tr.type = AuthHttp; - convTR2M(&tr, buf); - if(write(afd, buf, TICKREQLEN) != TICKREQLEN){ - close(afd); - return -1; - } - if(_asrdresp(afd, buf, TICKETLEN) < 0){ - close(afd); - return -1; - } - close(afd); - - /* - * use password and try to decrypt the - * ticket. If it doesn't work we've got a bad password, - * give up. - */ - passtokey(key, password); - convM2T(buf, &t, key); - if(t.num != AuthHr || strcmp(t.cuid, tr.uid)) - return -1; - - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/Makefile b/sys/src/cmd/unix/drawterm/libauthsrv/Makefile deleted file mode 100644 index 67d34f704..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libauthsrv.a - -OFILES=\ - _asgetticket.$O\ - _asrdresp.$O\ - convA2M.$O\ - convM2A.$O\ - convM2PR.$O\ - convM2T.$O\ - convM2TR.$O\ - convPR2M.$O\ - convT2M.$O\ - convTR2M.$O\ - nvcsum.$O\ - opasstokey.$O\ - passtokey.$O\ - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/_asgetticket.c b/sys/src/cmd/unix/drawterm/libauthsrv/_asgetticket.c deleted file mode 100644 index ea9e0c9ef..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/_asgetticket.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -static char *pbmsg = "AS protocol botch"; - -int -_asgetticket(int fd, char *trbuf, char *tbuf) -{ - if(write(fd, trbuf, TICKREQLEN) < 0){ - close(fd); - werrstr(pbmsg); - return -1; - } - return _asrdresp(fd, tbuf, 2*TICKETLEN); -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/_asrdresp.c b/sys/src/cmd/unix/drawterm/libauthsrv/_asrdresp.c deleted file mode 100644 index 8a7daf8cc..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/_asrdresp.c +++ /dev/null @@ -1,56 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -static char *pbmsg = "AS protocol botch"; - -int -_asrdresp(int fd, char *buf, int len) -{ - int n; - char error[64]; - - if(read(fd, buf, 1) != 1){ - werrstr(pbmsg); - return -1; - } - - n = len; - switch(buf[0]){ - case AuthOK: - if(readn(fd, buf, len) != len){ - werrstr(pbmsg); - return -1; - } - break; - case AuthErr: - if(readn(fd, error, sizeof error) != sizeof error){ - werrstr(pbmsg); - return -1; - } - error[sizeof error-1] = '\0'; - werrstr("remote: %s", error); - return -1; - case AuthOKvar: - if(readn(fd, error, 5) != 5){ - werrstr(pbmsg); - return -1; - } - error[5] = 0; - n = atoi(error); - if(n <= 0 || n > len){ - werrstr(pbmsg); - return -1; - } - memset(buf, 0, len); - if(readn(fd, buf, n) != n){ - werrstr(pbmsg); - return -1; - } - break; - default: - werrstr(pbmsg); - return -1; - } - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/authdial.c b/sys/src/cmd/unix/drawterm/libauthsrv/authdial.c deleted file mode 100644 index c2463a156..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/authdial.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> -#include <bio.h> -#include <ndb.h> - -int -authdial(char *netroot, char *dom) -{ - char server[Ndbvlen]; - Ndbtuple *nt; - - - if(dom != nil){ - /* look up an auth server in an authentication domain */ - nt = csgetval(netroot, "authdom", dom, "auth", server); - - /* if that didn't work, just try the IP domain */ - if(nt == nil) - nt = csgetval(netroot, "dom", dom, "auth", server); - if(nt == nil){ - werrstr("no auth server found for %s", dom); - return -1; - } - ndbfree(nt); - return dial(netmkaddr(server, netroot, "ticket"), 0, 0, 0); - } else { - /* look for one relative to my machine */ - return dial(netmkaddr("$auth", netroot, "ticket"), 0, 0, 0); - } -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/convA2M.c b/sys/src/cmd/unix/drawterm/libauthsrv/convA2M.c deleted file mode 100644 index 2799cbf56..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/convA2M.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -#define CHAR(x) *p++ = f->x -#define SHORT(x) p[0] = f->x; p[1] = f->x>>8; p += 2 -#define VLONG(q) p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(p, f->x, n); p += n - -int -convA2M(Authenticator *f, char *ap, char *key) -{ - int n; - uchar *p; - - p = (uchar*)ap; - CHAR(num); - STRING(chal, CHALLEN); - LONG(id); - n = p - (uchar*)ap; - if(key) - encrypt(key, ap, n); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/convM2A.c b/sys/src/cmd/unix/drawterm/libauthsrv/convM2A.c deleted file mode 100644 index 3d58f9b59..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/convM2A.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -#define CHAR(x) f->x = *p++ -#define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 -#define VLONG(q) q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(f->x, p, n); p += n - -void -convM2A(char *ap, Authenticator *f, char *key) -{ - uchar *p; - - if(key) - decrypt(key, ap, AUTHENTLEN); - p = (uchar*)ap; - CHAR(num); - STRING(chal, CHALLEN); - LONG(id); - USED(p); -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/convM2PR.c b/sys/src/cmd/unix/drawterm/libauthsrv/convM2PR.c deleted file mode 100644 index 21df5b508..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/convM2PR.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -#define CHAR(x) f->x = *p++ -#define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 -#define VLONG(q) q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(f->x, p, n); p += n - -void -convM2PR(char *ap, Passwordreq *f, char *key) -{ - uchar *p; - - p = (uchar*)ap; - if(key) - decrypt(key, ap, PASSREQLEN); - CHAR(num); - STRING(old, ANAMELEN); - f->old[ANAMELEN-1] = 0; - STRING(new, ANAMELEN); - f->new[ANAMELEN-1] = 0; - CHAR(changesecret); - STRING(secret, SECRETLEN); - f->secret[SECRETLEN-1] = 0; - USED(p); -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/convM2T.c b/sys/src/cmd/unix/drawterm/libauthsrv/convM2T.c deleted file mode 100644 index 372825a87..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/convM2T.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -#define CHAR(x) f->x = *p++ -#define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 -#define VLONG(q) q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(f->x, p, n); p += n - -void -convM2T(char *ap, Ticket *f, char *key) -{ - uchar *p; - - if(key) - decrypt(key, ap, TICKETLEN); - p = (uchar*)ap; - CHAR(num); - STRING(chal, CHALLEN); - STRING(cuid, ANAMELEN); - f->cuid[ANAMELEN-1] = 0; - STRING(suid, ANAMELEN); - f->suid[ANAMELEN-1] = 0; - STRING(key, DESKEYLEN); - USED(p); -} - diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/convM2TR.c b/sys/src/cmd/unix/drawterm/libauthsrv/convM2TR.c deleted file mode 100644 index ffad75c77..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/convM2TR.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -#define CHAR(x) f->x = *p++ -#define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 -#define VLONG(q) q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(f->x, p, n); p += n - -void -convM2TR(char *ap, Ticketreq *f) -{ - uchar *p; - - p = (uchar*)ap; - CHAR(type); - STRING(authid, ANAMELEN); - f->authid[ANAMELEN-1] = 0; - STRING(authdom, DOMLEN); - f->authdom[DOMLEN-1] = 0; - STRING(chal, CHALLEN); - STRING(hostid, ANAMELEN); - f->hostid[ANAMELEN-1] = 0; - STRING(uid, ANAMELEN); - f->uid[ANAMELEN-1] = 0; - USED(p); -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/convPR2M.c b/sys/src/cmd/unix/drawterm/libauthsrv/convPR2M.c deleted file mode 100644 index 8b2422f1b..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/convPR2M.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -#define CHAR(x) *p++ = f->x -#define SHORT(x) p[0] = f->x; p[1] = f->x>>8; p += 2 -#define VLONG(q) p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(p, f->x, n); p += n - -int -convPR2M(Passwordreq *f, char *ap, char *key) -{ - int n; - uchar *p; - - p = (uchar*)ap; - CHAR(num); - STRING(old, ANAMELEN); - STRING(new, ANAMELEN); - CHAR(changesecret); - STRING(secret, SECRETLEN); - n = p - (uchar*)ap; - if(key) - encrypt(key, ap, n); - return n; -} - diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/convT2M.c b/sys/src/cmd/unix/drawterm/libauthsrv/convT2M.c deleted file mode 100644 index 810ba5c67..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/convT2M.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -#define CHAR(x) *p++ = f->x -#define SHORT(x) p[0] = f->x; p[1] = f->x>>8; p += 2 -#define VLONG(q) p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(p, f->x, n); p += n - -int -convT2M(Ticket *f, char *ap, char *key) -{ - int n; - uchar *p; - - p = (uchar*)ap; - CHAR(num); - STRING(chal, CHALLEN); - STRING(cuid, ANAMELEN); - STRING(suid, ANAMELEN); - STRING(key, DESKEYLEN); - n = p - (uchar*)ap; - if(key) - encrypt(key, ap, n); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/convTR2M.c b/sys/src/cmd/unix/drawterm/libauthsrv/convTR2M.c deleted file mode 100644 index 3a7610a71..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/convTR2M.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -#define CHAR(x) *p++ = f->x -#define SHORT(x) p[0] = f->x; p[1] = f->x>>8; p += 2 -#define VLONG(q) p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4 -#define LONG(x) VLONG(f->x) -#define STRING(x,n) memmove(p, f->x, n); p += n - -int -convTR2M(Ticketreq *f, char *ap) -{ - int n; - uchar *p; - - p = (uchar*)ap; - CHAR(type); - STRING(authid, 28); /* BUG */ - STRING(authdom, DOMLEN); - STRING(chal, CHALLEN); - STRING(hostid, 28); /* BUG */ - STRING(uid, 28); /* BUG */ - n = p - (uchar*)ap; - return n; -} - diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/nvcsum.c b/sys/src/cmd/unix/drawterm/libauthsrv/nvcsum.c deleted file mode 100644 index 306d7f7ed..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/nvcsum.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> - -uchar -nvcsum(void *vmem, int n) -{ - uchar *mem, sum; - int i; - - sum = 9; - mem = vmem; - for(i = 0; i < n; i++) - sum += mem[i]; - return sum; -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/opasstokey.c b/sys/src/cmd/unix/drawterm/libauthsrv/opasstokey.c deleted file mode 100644 index d263d4b76..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/opasstokey.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -int -opasstokey(char *key, char *p) -{ - uchar t[10]; - int c, n; - - n = strlen(p); - memset(t, ' ', sizeof t); - if(n < 5) - return 0; - if(n > 10) - n = 10; - strncpy((char*)t, p, n); - if(n >= 9){ - c = p[8] & 0xf; - if(n == 10) - c += p[9] << 4; - for(n = 0; n < 8; n++) - if(c & (1 << n)) - t[n] -= ' '; - } - for(n = 0; n < 7; n++) - key[n] = (t[n] >> n) + (t[n+1] << (8 - (n+1))); - return 1; -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/passtokey.c b/sys/src/cmd/unix/drawterm/libauthsrv/passtokey.c deleted file mode 100644 index 8e267ce4c..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/passtokey.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -int -passtokey(char *key, char *p) -{ - uchar buf[ANAMELEN], *t; - int i, n; - - n = strlen(p); - if(n >= ANAMELEN) - n = ANAMELEN-1; - memset(buf, ' ', 8); - t = buf; - strncpy((char*)t, p, n); - t[n] = 0; - memset(key, 0, DESKEYLEN); - for(;;){ - for(i = 0; i < DESKEYLEN; i++) - key[i] = (t[i] >> i) + (t[i+1] << (8 - (i+1))); - if(n <= 8) - return 1; - n -= 8; - t += 8; - if(n < 8){ - t -= 8 - n; - n = 8; - } - encrypt(key, t, 8); - } - return 1; /* not reached */ -} diff --git a/sys/src/cmd/unix/drawterm/libauthsrv/readnvram.c b/sys/src/cmd/unix/drawterm/libauthsrv/readnvram.c deleted file mode 100644 index 4c92efcad..000000000 --- a/sys/src/cmd/unix/drawterm/libauthsrv/readnvram.c +++ /dev/null @@ -1,368 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <authsrv.h> - -static long finddosfile(int, char*); - -static int -check(void *x, int len, uchar sum, char *msg) -{ - if(nvcsum(x, len) == sum) - return 0; - memset(x, 0, len); - fprint(2, "%s\n", msg); - return 1; -} - -/* - * get key info out of nvram. since there isn't room in the PC's nvram use - * a disk partition there. - */ -static struct { - char *cputype; - char *file; - int off; - int len; -} nvtab[] = { - "sparc", "#r/nvram", 1024+850, sizeof(Nvrsafe), - "pc", "#S/sdC0/nvram", 0, sizeof(Nvrsafe), - "pc", "#S/sdC0/9fat", -1, sizeof(Nvrsafe), - "pc", "#S/sd00/nvram", 0, sizeof(Nvrsafe), - "pc", "#S/sd00/9fat", -1, sizeof(Nvrsafe), - "pc", "#S/sd01/nvram", 0, sizeof(Nvrsafe), - "pc", "#S/sd01/9fat", -1, sizeof(Nvrsafe), - "pc", "#f/fd0disk", -1, 512, /* 512: #f requires whole sector reads */ - "pc", "#f/fd1disk", -1, 512, - "mips", "#r/nvram", 1024+900, sizeof(Nvrsafe), - "power", "#F/flash/flash0", 0x300000, sizeof(Nvrsafe), - "power", "#r/nvram", 4352, sizeof(Nvrsafe), /* OK for MTX-604e */ - "debug", "/tmp/nvram", 0, sizeof(Nvrsafe), -}; - -static char* -readcons(char *prompt, char *def, int raw, char *buf, int nbuf) -{ - int fdin, fdout, ctl, n, m; - char line[10]; - - fdin = open("/dev/cons", OREAD); - if(fdin < 0) - fdin = 0; - fdout = open("/dev/cons", OWRITE); - if(fdout < 0) - fdout = 1; - if(def != nil) - fprint(fdout, "%s[%s]: ", prompt, def); - else - fprint(fdout, "%s: ", prompt); - if(raw){ - ctl = open("/dev/consctl", OWRITE); - if(ctl >= 0) - write(ctl, "rawon", 5); - } else - ctl = -1; - - m = 0; - for(;;){ - n = read(fdin, line, 1); - if(n == 0){ - close(ctl); - werrstr("readcons: EOF"); - return nil; - } - if(n < 0){ - close(ctl); - werrstr("can't read cons"); - return nil; - } - if(line[0] == 0x7f) - exits(0); - if(n == 0 || line[0] == '\n' || line[0] == '\r'){ - if(raw){ - write(ctl, "rawoff", 6); - write(fdout, "\n", 1); - close(ctl); - } - buf[m] = '\0'; - if(buf[0]=='\0' && def) - strcpy(buf, def); - return buf; - } - if(line[0] == '\b'){ - if(m > 0) - m--; - }else if(line[0] == 0x15){ /* ^U: line kill */ - m = 0; - if(def != nil) - fprint(fdout, "%s[%s]: ", prompt, def); - else - fprint(fdout, "%s: ", prompt); - }else{ - if(m >= nbuf-1){ - fprint(fdout, "line too long\n"); - m = 0; - if(def != nil) - fprint(fdout, "%s[%s]: ", prompt, def); - else - fprint(fdout, "%s: ", prompt); - }else - buf[m++] = line[0]; - } - } - return buf; /* how does this happen */ -} - - -/* - * get key info out of nvram. since there isn't room in the PC's nvram use - * a disk partition there. - */ -int -readnvram(Nvrsafe *safep, int flag) -{ - char buf[1024], in[128], *cputype, *nvrfile, *nvrlen, *nvroff, *v[2]; - int fd, err, i, safeoff, safelen; - Nvrsafe *safe; - - err = 0; - memset(safep, 0, sizeof(*safep)); - - nvrfile = getenv("nvram"); - cputype = getenv("cputype"); - if(cputype == nil) - cputype = "mips"; - if(strcmp(cputype, "386")==0 || strcmp(cputype, "alpha")==0) - cputype = "pc"; - - safe = (Nvrsafe*)buf; - - fd = -1; - safeoff = -1; - safelen = -1; - if(nvrfile != nil){ - /* accept device and device!file */ - i = gettokens(nvrfile, v, nelem(v), "!"); - fd = open(v[0], ORDWR); - safelen = sizeof(Nvrsafe); - if(strstr(v[0], "/9fat") == nil) - safeoff = 0; - nvrlen = getenv("nvrlen"); - if(nvrlen != nil) - safelen = atoi(nvrlen); - nvroff = getenv("nvroff"); - if(nvroff != nil){ - if(strcmp(nvroff, "dos") == 0) - safeoff = -1; - else - safeoff = atoi(nvroff); - } - if(safeoff < 0 && fd >= 0){ - safelen = 512; - safeoff = finddosfile(fd, i == 2 ? v[1] : "plan9.nvr"); - if(safeoff < 0){ - close(fd); - fd = -1; - } - } - free(nvrfile); - if(nvrlen != nil) - free(nvrlen); - if(nvroff != nil) - free(nvroff); - }else{ - for(i=0; i<nelem(nvtab); i++){ - if(strcmp(cputype, nvtab[i].cputype) != 0) - continue; - if((fd = open(nvtab[i].file, ORDWR)) < 0) - continue; - safeoff = nvtab[i].off; - safelen = nvtab[i].len; - if(safeoff == -1){ - safeoff = finddosfile(fd, "plan9.nvr"); - if(safeoff < 0){ - close(fd); - fd = -1; - continue; - } - } - break; - } - } - - if(fd < 0 - || seek(fd, safeoff, 0) < 0 - || read(fd, buf, safelen) != safelen){ - err = 1; - if(flag&(NVwrite|NVwriteonerr)) - fprint(2, "can't read nvram: %r\n"); - memset(safep, 0, sizeof(*safep)); - safe = safep; - }else{ - *safep = *safe; - safe = safep; - - err |= check(safe->machkey, DESKEYLEN, safe->machsum, "bad nvram key"); -// err |= check(safe->config, CONFIGLEN, safe->configsum, "bad secstore key"); - err |= check(safe->authid, ANAMELEN, safe->authidsum, "bad authentication id"); - err |= check(safe->authdom, DOMLEN, safe->authdomsum, "bad authentication domain"); - } - - if((flag&NVwrite) || (err && (flag&NVwriteonerr))){ - readcons("authid", nil, 0, safe->authid, sizeof(safe->authid)); - readcons("authdom", nil, 0, safe->authdom, sizeof(safe->authdom)); - readcons("secstore key", nil, 1, safe->config, sizeof(safe->config)); - for(;;){ - if(readcons("password", nil, 1, in, sizeof in) == nil) - goto Out; - if(passtokey(safe->machkey, in)) - break; - } - safe->machsum = nvcsum(safe->machkey, DESKEYLEN); - safe->configsum = nvcsum(safe->config, CONFIGLEN); - safe->authidsum = nvcsum(safe->authid, sizeof(safe->authid)); - safe->authdomsum = nvcsum(safe->authdom, sizeof(safe->authdom)); - *(Nvrsafe*)buf = *safe; - if(seek(fd, safeoff, 0) < 0 - || write(fd, buf, safelen) != safelen){ - fprint(2, "can't write key to nvram: %r\n"); - err = 1; - }else - err = 0; - } -Out: - close(fd); - return err ? -1 : 0; -} - -typedef struct Dosboot Dosboot; -struct Dosboot{ - uchar magic[3]; /* really an xx86 JMP instruction */ - uchar version[8]; - uchar sectsize[2]; - uchar clustsize; - uchar nresrv[2]; - uchar nfats; - uchar rootsize[2]; - uchar volsize[2]; - uchar mediadesc; - uchar fatsize[2]; - uchar trksize[2]; - uchar nheads[2]; - uchar nhidden[4]; - uchar bigvolsize[4]; - uchar driveno; - uchar reserved0; - uchar bootsig; - uchar volid[4]; - uchar label[11]; - uchar type[8]; -}; -#define GETSHORT(p) (((p)[1]<<8) | (p)[0]) -#define GETLONG(p) ((GETSHORT((p)+2) << 16) | GETSHORT((p))) - -typedef struct Dosdir Dosdir; -struct Dosdir -{ - char name[8]; - char ext[3]; - uchar attr; - uchar reserved[10]; - uchar time[2]; - uchar date[2]; - uchar start[2]; - uchar length[4]; -}; - -static char* -dosparse(char *from, char *to, int len) -{ - char c; - - memset(to, ' ', len); - if(from == 0) - return 0; - while(len-- > 0){ - c = *from++; - if(c == '.') - return from; - if(c == 0) - break; - if(c >= 'a' && c <= 'z') - *to++ = c + 'A' - 'a'; - else - *to++ = c; - } - return 0; -} - -/* - * return offset of first file block - * - * This is a very simplistic dos file system. It only - * works on floppies, only looks in the root, and only - * returns a pointer to the first block of a file. - * - * This exists for cpu servers that have no hard disk - * or nvram to store the key on. - * - * Please don't make this any smarter: it stays resident - * and I'ld prefer not to waste the space on something that - * runs only at boottime -- presotto. - */ -static long -finddosfile(int fd, char *file) -{ - uchar secbuf[512]; - char name[8]; - char ext[3]; - Dosboot *b; - Dosdir *root, *dp; - int nroot, sectsize, rootoff, rootsects, n; - - /* dos'ize file name */ - file = dosparse(file, name, 8); - dosparse(file, ext, 3); - - /* read boot block, check for sanity */ - b = (Dosboot*)secbuf; - if(read(fd, secbuf, sizeof(secbuf)) != sizeof(secbuf)) - return -1; - if(b->magic[0] != 0xEB || b->magic[1] != 0x3C || b->magic[2] != 0x90) - return -1; - sectsize = GETSHORT(b->sectsize); - if(sectsize != 512) - return -1; - rootoff = (GETSHORT(b->nresrv) + b->nfats*GETSHORT(b->fatsize)) * sectsize; - if(seek(fd, rootoff, 0) < 0) - return -1; - nroot = GETSHORT(b->rootsize); - rootsects = (nroot*sizeof(Dosdir)+sectsize-1)/sectsize; - if(rootsects <= 0 || rootsects > 64) - return -1; - - /* - * read root. it is contiguous to make stuff like - * this easier - */ - root = malloc(rootsects*sectsize); - if(read(fd, root, rootsects*sectsize) != rootsects*sectsize) - return -1; - n = -1; - for(dp = root; dp < &root[nroot]; dp++) - if(memcmp(name, dp->name, 8) == 0 && memcmp(ext, dp->ext, 3) == 0){ - n = GETSHORT(dp->start); - break; - } - free(root); - - if(n < 0) - return -1; - - /* - * dp->start is in cluster units, not sectors. The first - * cluster is cluster 2 which starts immediately after the - * root directory - */ - return rootoff + rootsects*sectsize + (n-2)*sectsize*b->clustsize; -} - diff --git a/sys/src/cmd/unix/drawterm/libc/Makefile b/sys/src/cmd/unix/drawterm/libc/Makefile deleted file mode 100644 index d17530b78..000000000 --- a/sys/src/cmd/unix/drawterm/libc/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libc.a - -OFILES=\ - charstod.$O\ - cleanname.$O\ - convD2M.$O\ - convM2D.$O\ - convM2S.$O\ - convS2M.$O\ - crypt.$O\ - dial.$O\ - dirfstat.$O\ - dirfwstat.$O\ - dirmodefmt.$O\ - dirstat.$O\ - dirwstat.$O\ - dofmt.$O\ - dorfmt.$O\ - encodefmt.$O\ - fcallfmt.$O\ - fltfmt.$O\ - fmt.$O\ - fmtfd.$O\ - fmtfdflush.$O\ - fmtlock.$O\ - fmtprint.$O\ - fmtquote.$O\ - fmtrune.$O\ - fmtstr.$O\ - fmtvprint.$O\ - fprint.$O\ - getfields.$O\ - getpid.$O\ - lock.$O\ - mallocz.$O\ - nan64.$O\ - netmkaddr.$O\ - nsec.$O\ - pow10.$O\ - pushssl.$O\ - pushtls.$O\ - read9pmsg.$O\ - readn.$O\ - rune.$O\ - runefmtstr.$O\ - runeseprint.$O\ - runesmprint.$O\ - runesnprint.$O\ - runesprint.$O\ - runestrchr.$O\ - runestrlen.$O\ - runestrstr.$O\ - runetype.$O\ - runevseprint.$O\ - runevsmprint.$O\ - runevsnprint.$O\ - seprint.$O\ - smprint.$O\ - snprint.$O\ - sprint.$O\ - strecpy.$O\ - strtod.$O\ - strtoll.$O\ - sysfatal.$O\ - time.$O\ - tokenize.$O\ - truerand.$O\ - u16.$O\ - u32.$O\ - u64.$O\ - utfecpy.$O\ - utflen.$O\ - utfnlen.$O\ - utfrrune.$O\ - utfrune.$O\ - utfutf.$O\ - vfprint.$O\ - vseprint.$O\ - vsmprint.$O\ - vsnprint.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/libc/charstod.c b/sys/src/cmd/unix/drawterm/libc/charstod.c deleted file mode 100644 index fcf741839..000000000 --- a/sys/src/cmd/unix/drawterm/libc/charstod.c +++ /dev/null @@ -1,70 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -/* - * Reads a floating-point number by interpreting successive characters - * returned by (*f)(vp). The last call it makes to f terminates the - * scan, so is not a character in the number. It may therefore be - * necessary to back up the input stream up one byte after calling charstod. - */ - -double -fmtcharstod(int(*f)(void*), void *vp) -{ - double num, dem; - int neg, eneg, dig, exp, c; - - num = 0; - neg = 0; - dig = 0; - exp = 0; - eneg = 0; - - c = (*f)(vp); - while(c == ' ' || c == '\t') - c = (*f)(vp); - if(c == '-' || c == '+'){ - if(c == '-') - neg = 1; - c = (*f)(vp); - } - while(c >= '0' && c <= '9'){ - num = num*10 + c-'0'; - c = (*f)(vp); - } - if(c == '.') - c = (*f)(vp); - while(c >= '0' && c <= '9'){ - num = num*10 + c-'0'; - dig++; - c = (*f)(vp); - } - if(c == 'e' || c == 'E'){ - c = (*f)(vp); - if(c == '-' || c == '+'){ - if(c == '-'){ - dig = -dig; - eneg = 1; - } - c = (*f)(vp); - } - while(c >= '0' && c <= '9'){ - exp = exp*10 + c-'0'; - c = (*f)(vp); - } - } - exp -= dig; - if(exp < 0){ - exp = -exp; - eneg = !eneg; - } - dem = __fmtpow10(exp); - if(eneg) - num /= dem; - else - num *= dem; - if(neg) - return -num; - return num; -} diff --git a/sys/src/cmd/unix/drawterm/libc/cleanname.c b/sys/src/cmd/unix/drawterm/libc/cleanname.c deleted file mode 100644 index cfcb4822a..000000000 --- a/sys/src/cmd/unix/drawterm/libc/cleanname.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <u.h> -#include <libc.h> - -/* - * In place, rewrite name to compress multiple /, eliminate ., and process .. - */ -#define SEP(x) ((x)=='/' || (x) == 0) -char* -cleanname(char *name) -{ - char *p, *q, *dotdot; - int rooted; - - rooted = name[0] == '/'; - - /* - * invariants: - * p points at beginning of path element we're considering. - * q points just past the last path element we wrote (no slash). - * dotdot points just past the point where .. cannot backtrack - * any further (no slash). - */ - p = q = dotdot = name+rooted; - while(*p) { - if(p[0] == '/') /* null element */ - p++; - else if(p[0] == '.' && SEP(p[1])) - p += 1; /* don't count the separator in case it is nul */ - else if(p[0] == '.' && p[1] == '.' && SEP(p[2])) { - p += 2; - if(q > dotdot) { /* can backtrack */ - while(--q > dotdot && *q != '/') - ; - } else if(!rooted) { /* /.. is / but ./../ is .. */ - if(q != name) - *q++ = '/'; - *q++ = '.'; - *q++ = '.'; - dotdot = q; - } - } else { /* real path element */ - if(q != name+rooted) - *q++ = '/'; - while((*q = *p) != '/' && *q != 0) - p++, q++; - } - } - if(q == name) /* empty string is really ``.'' */ - *q++ = '.'; - *q = '\0'; - return name; -} diff --git a/sys/src/cmd/unix/drawterm/libc/convD2M.c b/sys/src/cmd/unix/drawterm/libc/convD2M.c deleted file mode 100644 index 5acee7e5c..000000000 --- a/sys/src/cmd/unix/drawterm/libc/convD2M.c +++ /dev/null @@ -1,95 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -uint -sizeD2M(Dir *d) -{ - char *sv[4]; - int i, ns; - - sv[0] = d->name; - sv[1] = d->uid; - sv[2] = d->gid; - sv[3] = d->muid; - - ns = 0; - for(i = 0; i < 4; i++) - if(sv[i]) - ns += strlen(sv[i]); - - return STATFIXLEN + ns; -} - -uint -convD2M(Dir *d, uchar *buf, uint nbuf) -{ - uchar *p, *ebuf; - char *sv[4]; - int i, ns, nsv[4], ss; - - if(nbuf < BIT16SZ) - return 0; - - p = buf; - ebuf = buf + nbuf; - - sv[0] = d->name; - sv[1] = d->uid; - sv[2] = d->gid; - sv[3] = d->muid; - - ns = 0; - for(i = 0; i < 4; i++){ - if(sv[i]) - nsv[i] = strlen(sv[i]); - else - nsv[i] = 0; - ns += nsv[i]; - } - - ss = STATFIXLEN + ns; - - /* set size befor erroring, so user can know how much is needed */ - /* note that length excludes count field itself */ - PBIT16(p, ss-BIT16SZ); - p += BIT16SZ; - - if(ss > nbuf) - return BIT16SZ; - - PBIT16(p, d->type); - p += BIT16SZ; - PBIT32(p, d->dev); - p += BIT32SZ; - PBIT8(p, d->qid.type); - p += BIT8SZ; - PBIT32(p, d->qid.vers); - p += BIT32SZ; - PBIT64(p, d->qid.path); - p += BIT64SZ; - PBIT32(p, d->mode); - p += BIT32SZ; - PBIT32(p, d->atime); - p += BIT32SZ; - PBIT32(p, d->mtime); - p += BIT32SZ; - PBIT64(p, d->length); - p += BIT64SZ; - - for(i = 0; i < 4; i++){ - ns = nsv[i]; - if(p + ns + BIT16SZ > ebuf) - return 0; - PBIT16(p, ns); - p += BIT16SZ; - if(ns) - memmove(p, sv[i], ns); - p += ns; - } - - if(ss != p - buf) - return 0; - - return p - buf; -} diff --git a/sys/src/cmd/unix/drawterm/libc/convM2D.c b/sys/src/cmd/unix/drawterm/libc/convM2D.c deleted file mode 100644 index 6f4b4bd93..000000000 --- a/sys/src/cmd/unix/drawterm/libc/convM2D.c +++ /dev/null @@ -1,94 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -int -statcheck(uchar *buf, uint nbuf) -{ - uchar *ebuf; - int i; - - ebuf = buf + nbuf; - - if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf)) - return -1; - - buf += STATFIXLEN - 4 * BIT16SZ; - - for(i = 0; i < 4; i++){ - if(buf + BIT16SZ > ebuf) - return -1; - buf += BIT16SZ + GBIT16(buf); - } - - if(buf != ebuf) - return -1; - - return 0; -} - -static char nullstring[] = ""; - -uint -convM2D(uchar *buf, uint nbuf, Dir *d, char *strs) -{ - uchar *p, *ebuf; - char *sv[4]; - int i, ns; - - if(nbuf < STATFIXLEN) - return 0; - - p = buf; - ebuf = buf + nbuf; - - p += BIT16SZ; /* ignore size */ - d->type = GBIT16(p); - p += BIT16SZ; - d->dev = GBIT32(p); - p += BIT32SZ; - d->qid.type = GBIT8(p); - p += BIT8SZ; - d->qid.vers = GBIT32(p); - p += BIT32SZ; - d->qid.path = GBIT64(p); - p += BIT64SZ; - d->mode = GBIT32(p); - p += BIT32SZ; - d->atime = GBIT32(p); - p += BIT32SZ; - d->mtime = GBIT32(p); - p += BIT32SZ; - d->length = GBIT64(p); - p += BIT64SZ; - - for(i = 0; i < 4; i++){ - if(p + BIT16SZ > ebuf) - return 0; - ns = GBIT16(p); - p += BIT16SZ; - if(p + ns > ebuf) - return 0; - if(strs){ - sv[i] = strs; - memmove(strs, p, ns); - strs += ns; - *strs++ = '\0'; - } - p += ns; - } - - if(strs){ - d->name = sv[0]; - d->uid = sv[1]; - d->gid = sv[2]; - d->muid = sv[3]; - }else{ - d->name = nullstring; - d->uid = nullstring; - d->gid = nullstring; - d->muid = nullstring; - } - - return p - buf; -} diff --git a/sys/src/cmd/unix/drawterm/libc/convM2S.c b/sys/src/cmd/unix/drawterm/libc/convM2S.c deleted file mode 100644 index fcdcd42d6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/convM2S.c +++ /dev/null @@ -1,315 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -static -uchar* -gstring(uchar *p, uchar *ep, char **s) -{ - uint n; - - if(p+BIT16SZ > ep) - return nil; - n = GBIT16(p); - p += BIT16SZ - 1; - if(p+n+1 > ep) - return nil; - /* move it down, on top of count, to make room for '\0' */ - memmove(p, p + 1, n); - p[n] = '\0'; - *s = (char*)p; - p += n+1; - return p; -} - -static -uchar* -gqid(uchar *p, uchar *ep, Qid *q) -{ - if(p+QIDSZ > ep) - return nil; - q->type = GBIT8(p); - p += BIT8SZ; - q->vers = GBIT32(p); - p += BIT32SZ; - q->path = GBIT64(p); - p += BIT64SZ; - return p; -} - -/* - * no syntactic checks. - * three causes for error: - * 1. message size field is incorrect - * 2. input buffer too short for its own data (counts too long, etc.) - * 3. too many names or qids - * gqid() and gstring() return nil if they would reach beyond buffer. - * main switch statement checks range and also can fall through - * to test at end of routine. - */ -uint -convM2S(uchar *ap, uint nap, Fcall *f) -{ - uchar *p, *ep; - uint i, size; - - p = ap; - ep = p + nap; - - if(p+BIT32SZ+BIT8SZ+BIT16SZ > ep) - return 0; - size = GBIT32(p); - p += BIT32SZ; - - if(size < BIT32SZ+BIT8SZ+BIT16SZ) - return 0; - - f->type = GBIT8(p); - p += BIT8SZ; - f->tag = GBIT16(p); - p += BIT16SZ; - - switch(f->type) - { - default: - return 0; - - case Tversion: - if(p+BIT32SZ > ep) - return 0; - f->msize = GBIT32(p); - p += BIT32SZ; - p = gstring(p, ep, &f->version); - break; - - case Tflush: - if(p+BIT16SZ > ep) - return 0; - f->oldtag = GBIT16(p); - p += BIT16SZ; - break; - - case Tauth: - if(p+BIT32SZ > ep) - return 0; - f->afid = GBIT32(p); - p += BIT32SZ; - p = gstring(p, ep, &f->uname); - if(p == nil) - break; - p = gstring(p, ep, &f->aname); - if(p == nil) - break; - break; - - case Tattach: - if(p+BIT32SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - if(p+BIT32SZ > ep) - return 0; - f->afid = GBIT32(p); - p += BIT32SZ; - p = gstring(p, ep, &f->uname); - if(p == nil) - break; - p = gstring(p, ep, &f->aname); - if(p == nil) - break; - break; - - case Twalk: - if(p+BIT32SZ+BIT32SZ+BIT16SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - f->newfid = GBIT32(p); - p += BIT32SZ; - f->nwname = GBIT16(p); - p += BIT16SZ; - if(f->nwname > MAXWELEM) - return 0; - for(i=0; i<f->nwname; i++){ - p = gstring(p, ep, &f->wname[i]); - if(p == nil) - break; - } - break; - - case Topen: - if(p+BIT32SZ+BIT8SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - f->mode = GBIT8(p); - p += BIT8SZ; - break; - - case Tcreate: - if(p+BIT32SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - p = gstring(p, ep, &f->name); - if(p == nil) - break; - if(p+BIT32SZ+BIT8SZ > ep) - return 0; - f->perm = GBIT32(p); - p += BIT32SZ; - f->mode = GBIT8(p); - p += BIT8SZ; - break; - - case Tread: - if(p+BIT32SZ+BIT64SZ+BIT32SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - f->offset = GBIT64(p); - p += BIT64SZ; - f->count = GBIT32(p); - p += BIT32SZ; - break; - - case Twrite: - if(p+BIT32SZ+BIT64SZ+BIT32SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - f->offset = GBIT64(p); - p += BIT64SZ; - f->count = GBIT32(p); - p += BIT32SZ; - if(p+f->count > ep) - return 0; - f->data = (char*)p; - p += f->count; - break; - - case Tclunk: - case Tremove: - if(p+BIT32SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - break; - - case Tstat: - if(p+BIT32SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - break; - - case Twstat: - if(p+BIT32SZ+BIT16SZ > ep) - return 0; - f->fid = GBIT32(p); - p += BIT32SZ; - f->nstat = GBIT16(p); - p += BIT16SZ; - if(p+f->nstat > ep) - return 0; - f->stat = p; - p += f->nstat; - break; - -/* - */ - case Rversion: - if(p+BIT32SZ > ep) - return 0; - f->msize = GBIT32(p); - p += BIT32SZ; - p = gstring(p, ep, &f->version); - break; - - case Rerror: - p = gstring(p, ep, &f->ename); - break; - - case Rflush: - break; - - case Rauth: - p = gqid(p, ep, &f->aqid); - if(p == nil) - break; - break; - - case Rattach: - p = gqid(p, ep, &f->qid); - if(p == nil) - break; - break; - - case Rwalk: - if(p+BIT16SZ > ep) - return 0; - f->nwqid = GBIT16(p); - p += BIT16SZ; - if(f->nwqid > MAXWELEM) - return 0; - for(i=0; i<f->nwqid; i++){ - p = gqid(p, ep, &f->wqid[i]); - if(p == nil) - break; - } - break; - - case Ropen: - case Rcreate: - p = gqid(p, ep, &f->qid); - if(p == nil) - break; - if(p+BIT32SZ > ep) - return 0; - f->iounit = GBIT32(p); - p += BIT32SZ; - break; - - case Rread: - if(p+BIT32SZ > ep) - return 0; - f->count = GBIT32(p); - p += BIT32SZ; - if(p+f->count > ep) - return 0; - f->data = (char*)p; - p += f->count; - break; - - case Rwrite: - if(p+BIT32SZ > ep) - return 0; - f->count = GBIT32(p); - p += BIT32SZ; - break; - - case Rclunk: - case Rremove: - break; - - case Rstat: - if(p+BIT16SZ > ep) - return 0; - f->nstat = GBIT16(p); - p += BIT16SZ; - if(p+f->nstat > ep) - return 0; - f->stat = p; - p += f->nstat; - break; - - case Rwstat: - break; - } - - if(p==nil || p>ep) - return 0; - if(ap+size == p) - return size; - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/convS2M.c b/sys/src/cmd/unix/drawterm/libc/convS2M.c deleted file mode 100644 index 9acdcfa56..000000000 --- a/sys/src/cmd/unix/drawterm/libc/convS2M.c +++ /dev/null @@ -1,386 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -static -uchar* -pstring(uchar *p, char *s) -{ - uint n; - - if(s == nil){ - PBIT16(p, 0); - p += BIT16SZ; - return p; - } - - n = strlen(s); - PBIT16(p, n); - p += BIT16SZ; - memmove(p, s, n); - p += n; - return p; -} - -static -uchar* -pqid(uchar *p, Qid *q) -{ - PBIT8(p, q->type); - p += BIT8SZ; - PBIT32(p, q->vers); - p += BIT32SZ; - PBIT64(p, q->path); - p += BIT64SZ; - return p; -} - -static -uint -stringsz(char *s) -{ - if(s == nil) - return BIT16SZ; - - return BIT16SZ+strlen(s); -} - -uint -sizeS2M(Fcall *f) -{ - uint n; - int i; - - n = 0; - n += BIT32SZ; /* size */ - n += BIT8SZ; /* type */ - n += BIT16SZ; /* tag */ - - switch(f->type) - { - default: - return 0; - - case Tversion: - n += BIT32SZ; - n += stringsz(f->version); - break; - - case Tflush: - n += BIT16SZ; - break; - - case Tauth: - n += BIT32SZ; - n += stringsz(f->uname); - n += stringsz(f->aname); - break; - - case Tattach: - n += BIT32SZ; - n += BIT32SZ; - n += stringsz(f->uname); - n += stringsz(f->aname); - break; - - case Twalk: - n += BIT32SZ; - n += BIT32SZ; - n += BIT16SZ; - for(i=0; i<f->nwname; i++) - n += stringsz(f->wname[i]); - break; - - case Topen: - n += BIT32SZ; - n += BIT8SZ; - break; - - case Tcreate: - n += BIT32SZ; - n += stringsz(f->name); - n += BIT32SZ; - n += BIT8SZ; - break; - - case Tread: - n += BIT32SZ; - n += BIT64SZ; - n += BIT32SZ; - break; - - case Twrite: - n += BIT32SZ; - n += BIT64SZ; - n += BIT32SZ; - n += f->count; - break; - - case Tclunk: - case Tremove: - n += BIT32SZ; - break; - - case Tstat: - n += BIT32SZ; - break; - - case Twstat: - n += BIT32SZ; - n += BIT16SZ; - n += f->nstat; - break; -/* - */ - - case Rversion: - n += BIT32SZ; - n += stringsz(f->version); - break; - - case Rerror: - n += stringsz(f->ename); - break; - - case Rflush: - break; - - case Rauth: - n += QIDSZ; - break; - - case Rattach: - n += QIDSZ; - break; - - case Rwalk: - n += BIT16SZ; - n += f->nwqid*QIDSZ; - break; - - case Ropen: - case Rcreate: - n += QIDSZ; - n += BIT32SZ; - break; - - case Rread: - n += BIT32SZ; - n += f->count; - break; - - case Rwrite: - n += BIT32SZ; - break; - - case Rclunk: - break; - - case Rremove: - break; - - case Rstat: - n += BIT16SZ; - n += f->nstat; - break; - - case Rwstat: - break; - } - return n; -} - -uint -convS2M(Fcall *f, uchar *ap, uint nap) -{ - uchar *p; - uint i, size; - - size = sizeS2M(f); - if(size == 0) - return 0; - if(size > nap) - return 0; - - p = (uchar*)ap; - - PBIT32(p, size); - p += BIT32SZ; - PBIT8(p, f->type); - p += BIT8SZ; - PBIT16(p, f->tag); - p += BIT16SZ; - - switch(f->type) - { - default: - return 0; - - case Tversion: - PBIT32(p, f->msize); - p += BIT32SZ; - p = pstring(p, f->version); - break; - - case Tflush: - PBIT16(p, f->oldtag); - p += BIT16SZ; - break; - - case Tauth: - PBIT32(p, f->afid); - p += BIT32SZ; - p = pstring(p, f->uname); - p = pstring(p, f->aname); - break; - - case Tattach: - PBIT32(p, f->fid); - p += BIT32SZ; - PBIT32(p, f->afid); - p += BIT32SZ; - p = pstring(p, f->uname); - p = pstring(p, f->aname); - break; - - case Twalk: - PBIT32(p, f->fid); - p += BIT32SZ; - PBIT32(p, f->newfid); - p += BIT32SZ; - PBIT16(p, f->nwname); - p += BIT16SZ; - if(f->nwname > MAXWELEM) - return 0; - for(i=0; i<f->nwname; i++) - p = pstring(p, f->wname[i]); - break; - - case Topen: - PBIT32(p, f->fid); - p += BIT32SZ; - PBIT8(p, f->mode); - p += BIT8SZ; - break; - - case Tcreate: - PBIT32(p, f->fid); - p += BIT32SZ; - p = pstring(p, f->name); - PBIT32(p, f->perm); - p += BIT32SZ; - PBIT8(p, f->mode); - p += BIT8SZ; - break; - - case Tread: - PBIT32(p, f->fid); - p += BIT32SZ; - PBIT64(p, f->offset); - p += BIT64SZ; - PBIT32(p, f->count); - p += BIT32SZ; - break; - - case Twrite: - PBIT32(p, f->fid); - p += BIT32SZ; - PBIT64(p, f->offset); - p += BIT64SZ; - PBIT32(p, f->count); - p += BIT32SZ; - memmove(p, f->data, f->count); - p += f->count; - break; - - case Tclunk: - case Tremove: - PBIT32(p, f->fid); - p += BIT32SZ; - break; - - case Tstat: - PBIT32(p, f->fid); - p += BIT32SZ; - break; - - case Twstat: - PBIT32(p, f->fid); - p += BIT32SZ; - PBIT16(p, f->nstat); - p += BIT16SZ; - memmove(p, f->stat, f->nstat); - p += f->nstat; - break; -/* - */ - - case Rversion: - PBIT32(p, f->msize); - p += BIT32SZ; - p = pstring(p, f->version); - break; - - case Rerror: - p = pstring(p, f->ename); - break; - - case Rflush: - break; - - case Rauth: - p = pqid(p, &f->aqid); - break; - - case Rattach: - p = pqid(p, &f->qid); - break; - - case Rwalk: - PBIT16(p, f->nwqid); - p += BIT16SZ; - if(f->nwqid > MAXWELEM) - return 0; - for(i=0; i<f->nwqid; i++) - p = pqid(p, &f->wqid[i]); - break; - - case Ropen: - case Rcreate: - p = pqid(p, &f->qid); - PBIT32(p, f->iounit); - p += BIT32SZ; - break; - - case Rread: - PBIT32(p, f->count); - p += BIT32SZ; - memmove(p, f->data, f->count); - p += f->count; - break; - - case Rwrite: - PBIT32(p, f->count); - p += BIT32SZ; - break; - - case Rclunk: - break; - - case Rremove: - break; - - case Rstat: - PBIT16(p, f->nstat); - p += BIT16SZ; - memmove(p, f->stat, f->nstat); - p += f->nstat; - break; - - case Rwstat: - break; - } - if(size != p-ap) - return 0; - return size; -} diff --git a/sys/src/cmd/unix/drawterm/libc/crypt.c b/sys/src/cmd/unix/drawterm/libc/crypt.c deleted file mode 100644 index 0524c9422..000000000 --- a/sys/src/cmd/unix/drawterm/libc/crypt.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Data Encryption Standard - * D.P.Mitchell 83/06/08. - * - * block_cipher(key, block, decrypting) - * - * these routines use the non-standard 7 byte format - * for DES keys. - */ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <libsec.h> - -/* - * destructively encrypt the buffer, which - * must be at least 8 characters long. - */ -int -encrypt(void *key, void *vbuf, int n) -{ - ulong ekey[32]; - uchar *buf; - int i, r; - - if(n < 8) - return 0; - key_setup(key, ekey); - buf = vbuf; - n--; - r = n % 7; - n /= 7; - for(i = 0; i < n; i++){ - block_cipher(ekey, buf, 0); - buf += 7; - } - if(r) - block_cipher(ekey, buf - 7 + r, 0); - return 1; -} - -/* - * destructively decrypt the buffer, which - * must be at least 8 characters long. - */ -int -decrypt(void *key, void *vbuf, int n) -{ - ulong ekey[128]; - uchar *buf; - int i, r; - - if(n < 8) - return 0; - key_setup(key, ekey); - buf = vbuf; - n--; - r = n % 7; - n /= 7; - buf += n * 7; - if(r) - block_cipher(ekey, buf - 7 + r, 1); - for(i = 0; i < n; i++){ - buf -= 7; - block_cipher(ekey, buf, 1); - } - return 1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/dial.c b/sys/src/cmd/unix/drawterm/libc/dial.c deleted file mode 100644 index 55954d283..000000000 --- a/sys/src/cmd/unix/drawterm/libc/dial.c +++ /dev/null @@ -1,209 +0,0 @@ -#include <u.h> -#include <libc.h> - -typedef struct DS DS; - -static int call(char*, char*, DS*); -static int csdial(DS*); -static void _dial_string_parse(char*, DS*); - -enum -{ - Maxstring = 128, - Maxpath = 256, -}; - -struct DS { - /* dist string */ - char buf[Maxstring]; - char *netdir; - char *proto; - char *rem; - - /* other args */ - char *local; - char *dir; - int *cfdp; -}; - - -/* - * the dialstring is of the form '[/net/]proto!dest' - */ -int -dial(char *dest, char *local, char *dir, int *cfdp) -{ - DS ds; - int rv; - char err[ERRMAX], alterr[ERRMAX]; - - ds.local = local; - ds.dir = dir; - ds.cfdp = cfdp; - - _dial_string_parse(dest, &ds); - if(ds.netdir) - return csdial(&ds); - - ds.netdir = "/net"; - rv = csdial(&ds); - if(rv >= 0) - return rv; - err[0] = '\0'; - errstr(err, sizeof err); - if(strstr(err, "refused") != 0){ - werrstr("%s", err); - return rv; - } - ds.netdir = "/net.alt"; - rv = csdial(&ds); - if(rv >= 0) - return rv; - - alterr[0] = 0; - errstr(alterr, sizeof alterr); - if(strstr(alterr, "translate") || strstr(alterr, "does not exist")) - werrstr("%s", err); - else - werrstr("%s", alterr); - return rv; -} - -static int -csdial(DS *ds) -{ - int n, fd, rv; - char *p, buf[Maxstring], clone[Maxpath], err[ERRMAX], besterr[ERRMAX]; - - /* - * open connection server - */ - snprint(buf, sizeof(buf), "%s/cs", ds->netdir); - fd = open(buf, ORDWR); - if(fd < 0){ - /* no connection server, don't translate */ - snprint(clone, sizeof(clone), "%s/%s/clone", ds->netdir, ds->proto); - return call(clone, ds->rem, ds); - } - - /* - * ask connection server to translate - */ - snprint(buf, sizeof(buf), "%s!%s", ds->proto, ds->rem); - if(write(fd, buf, strlen(buf)) < 0){ - close(fd); - return -1; - } - - /* - * loop through each address from the connection server till - * we get one that works. - */ - *besterr = 0; - rv = -1; - seek(fd, 0, 0); - strcpy(err, "cs gave empty translation list"); - while((n = read(fd, buf, sizeof(buf) - 1)) > 0){ - buf[n] = 0; - p = strchr(buf, ' '); - if(p == 0) - continue; - *p++ = 0; - rv = call(buf, p, ds); - if(rv >= 0) - break; - err[0] = '\0'; - errstr(err, sizeof err); - if(strstr(err, "does not exist") == 0) - strcpy(besterr, err); - } - close(fd); - - if(rv < 0 && *besterr) - werrstr("%s", besterr); - else - werrstr("%s", err); - return rv; -} - -static int -call(char *clone, char *dest, DS *ds) -{ - int fd, cfd, n; - char name[Maxpath], data[Maxpath], *p; - - cfd = open(clone, ORDWR); - if(cfd < 0) - return -1; - - /* get directory name */ - n = read(cfd, name, sizeof(name)-1); - if(n < 0){ - close(cfd); - return -1; - } - name[n] = 0; - for(p = name; *p == ' '; p++) - ; - snprint(name, sizeof(name), "%ld", strtoul(p, 0, 0)); - p = strrchr(clone, '/'); - *p = 0; - if(ds->dir) - snprint(ds->dir, NETPATHLEN, "%s/%s", clone, name); - snprint(data, sizeof(data), "%s/%s/data", clone, name); - - /* connect */ - if(ds->local) - snprint(name, sizeof(name), "connect %s %s", dest, ds->local); - else - snprint(name, sizeof(name), "connect %s", dest); - if(write(cfd, name, strlen(name)) < 0){ - close(cfd); - return -1; - } - - /* open data connection */ - fd = open(data, ORDWR); - if(fd < 0){ -print("open %s: %r\n", data); - close(cfd); - return -1; - } - if(ds->cfdp) - *ds->cfdp = cfd; - else - close(cfd); - return fd; -} - -/* - * parse a dial string - */ -static void -_dial_string_parse(char *str, DS *ds) -{ - char *p, *p2; - - strncpy(ds->buf, str, Maxstring); - ds->buf[Maxstring-1] = 0; - - p = strchr(ds->buf, '!'); - if(p == 0) { - ds->netdir = 0; - ds->proto = "net"; - ds->rem = ds->buf; - } else { - if(*ds->buf != '/' && *ds->buf != '#'){ - ds->netdir = 0; - ds->proto = ds->buf; - } else { - for(p2 = p; *p2 != '/'; p2--) - ; - *p2++ = 0; - ds->netdir = ds->buf; - ds->proto = p2; - } - *p = 0; - ds->rem = p + 1; - } -} diff --git a/sys/src/cmd/unix/drawterm/libc/dirfstat.c b/sys/src/cmd/unix/drawterm/libc/dirfstat.c deleted file mode 100644 index 0534a2278..000000000 --- a/sys/src/cmd/unix/drawterm/libc/dirfstat.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -enum -{ - DIRSIZE = STATFIXLEN + 16 * 4 /* enough for encoded stat buf + some reasonable strings */ -}; - -Dir* -dirfstat(int fd) -{ - Dir *d; - uchar *buf; - int n, nd, i; - - nd = DIRSIZE; - for(i=0; i<2; i++){ /* should work by the second try */ - d = malloc(sizeof(Dir) + BIT16SZ + nd); - if(d == nil) - return nil; - buf = (uchar*)&d[1]; - n = fstat(fd, buf, BIT16SZ+nd); - if(n < BIT16SZ){ - free(d); - return nil; - } - nd = GBIT16(buf); /* upper bound on size of Dir + strings */ - if(nd <= n){ - convM2D(buf, n, d, (char*)&d[1]); - return d; - } - /* else sizeof(Dir)+BIT16SZ+nd is plenty */ - free(d); - } - return nil; -} diff --git a/sys/src/cmd/unix/drawterm/libc/dirfwstat.c b/sys/src/cmd/unix/drawterm/libc/dirfwstat.c deleted file mode 100644 index 85803ff4c..000000000 --- a/sys/src/cmd/unix/drawterm/libc/dirfwstat.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -int -dirfwstat(int fd, Dir *d) -{ - uchar *buf; - int r; - - r = sizeD2M(d); - buf = malloc(r); - if(buf == nil) - return -1; - convD2M(d, buf, r); - r = fwstat(fd, buf, r); - free(buf); - return r; -} diff --git a/sys/src/cmd/unix/drawterm/libc/dirmodefmt.c b/sys/src/cmd/unix/drawterm/libc/dirmodefmt.c deleted file mode 100644 index 82eb5a308..000000000 --- a/sys/src/cmd/unix/drawterm/libc/dirmodefmt.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -static char *modes[] = -{ - "---", - "--x", - "-w-", - "-wx", - "r--", - "r-x", - "rw-", - "rwx", -}; - -static void -rwx(long m, char *s) -{ - strncpy(s, modes[m], 3); -} - -int -dirmodefmt(Fmt *f) -{ - static char buf[16]; - ulong m; - - m = va_arg(f->args, ulong); - - if(m & DMDIR) - buf[0]='d'; - else if(m & DMAPPEND) - buf[0]='a'; - else if(m & DMAUTH) - buf[0]='A'; - else - buf[0]='-'; - if(m & DMEXCL) - buf[1]='l'; - else - buf[1]='-'; - rwx((m>>6)&7, buf+2); - rwx((m>>3)&7, buf+5); - rwx((m>>0)&7, buf+8); - buf[11] = 0; - return fmtstrcpy(f, buf); -} diff --git a/sys/src/cmd/unix/drawterm/libc/dirstat.c b/sys/src/cmd/unix/drawterm/libc/dirstat.c deleted file mode 100644 index eb5171d2a..000000000 --- a/sys/src/cmd/unix/drawterm/libc/dirstat.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -enum -{ - DIRSIZE = STATFIXLEN + 16 * 4 /* enough for encoded stat buf + some reasonable strings */ -}; - -Dir* -dirstat(char *name) -{ - Dir *d; - uchar *buf; - int n, nd, i; - - nd = DIRSIZE; - for(i=0; i<2; i++){ /* should work by the second try */ - d = malloc(sizeof(Dir) + BIT16SZ + nd); - if(d == nil) - return nil; - buf = (uchar*)&d[1]; - n = stat(name, buf, BIT16SZ+nd); - if(n < BIT16SZ){ - free(d); - return nil; - } - nd = GBIT16((uchar*)buf); /* upper bound on size of Dir + strings */ - if(nd <= n){ - convM2D(buf, n, d, (char*)&d[1]); - return d; - } - /* else sizeof(Dir)+BIT16SZ+nd is plenty */ - free(d); - } - return nil; -} diff --git a/sys/src/cmd/unix/drawterm/libc/dirwstat.c b/sys/src/cmd/unix/drawterm/libc/dirwstat.c deleted file mode 100644 index cb62e3fc4..000000000 --- a/sys/src/cmd/unix/drawterm/libc/dirwstat.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -int -dirwstat(char *name, Dir *d) -{ - uchar *buf; - int r; - - r = sizeD2M(d); - buf = malloc(r); - if(buf == nil) - return -1; - convD2M(d, buf, r); - r = wstat(name, buf, r); - free(buf); - return r; -} diff --git a/sys/src/cmd/unix/drawterm/libc/dofmt.c b/sys/src/cmd/unix/drawterm/libc/dofmt.c deleted file mode 100644 index f905c0ad8..000000000 --- a/sys/src/cmd/unix/drawterm/libc/dofmt.c +++ /dev/null @@ -1,542 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -/* format the output into f->to and return the number of characters fmted */ -int -dofmt(Fmt *f, char *fmt) -{ - Rune rune, *rt, *rs; - int r; - char *t, *s; - int n, nfmt; - - nfmt = f->nfmt; - for(;;){ - if(f->runes){ - rt = (Rune*)f->to; - rs = (Rune*)f->stop; - while((r = *(uchar*)fmt) && r != '%'){ - if(r < Runeself) - fmt++; - else{ - fmt += chartorune(&rune, fmt); - r = rune; - } - FMTRCHAR(f, rt, rs, r); - } - fmt++; - f->nfmt += rt - (Rune *)f->to; - f->to = rt; - if(!r) - return f->nfmt - nfmt; - f->stop = rs; - }else{ - t = (char*)f->to; - s = (char*)f->stop; - while((r = *(uchar*)fmt) && r != '%'){ - if(r < Runeself){ - FMTCHAR(f, t, s, r); - fmt++; - }else{ - n = chartorune(&rune, fmt); - if(t + n > s){ - t = (char*)__fmtflush(f, t, n); - if(t != nil) - s = (char*)f->stop; - else - return -1; - } - while(n--) - *t++ = *fmt++; - } - } - fmt++; - f->nfmt += t - (char *)f->to; - f->to = t; - if(!r) - return f->nfmt - nfmt; - f->stop = s; - } - - fmt = (char*)__fmtdispatch(f, fmt, 0); - if(fmt == nil) - return -1; - } -} - -void * -__fmtflush(Fmt *f, void *t, int len) -{ - if(f->runes) - f->nfmt += (Rune*)t - (Rune*)f->to; - else - f->nfmt += (char*)t - (char *)f->to; - f->to = t; - if(f->flush == 0 || (*f->flush)(f) == 0 || (char*)f->to + len > (char*)f->stop){ - f->stop = f->to; - return nil; - } - return f->to; -} - -/* - * put a formatted block of memory sz bytes long of n runes into the output buffer, - * left/right justified in a field of at least f->width charactes - */ -int -__fmtpad(Fmt *f, int n) -{ - char *t, *s; - int i; - - t = (char*)f->to; - s = (char*)f->stop; - for(i = 0; i < n; i++) - FMTCHAR(f, t, s, ' '); - f->nfmt += t - (char *)f->to; - f->to = t; - return 0; -} - -int -__rfmtpad(Fmt *f, int n) -{ - Rune *t, *s; - int i; - - t = (Rune*)f->to; - s = (Rune*)f->stop; - for(i = 0; i < n; i++) - FMTRCHAR(f, t, s, ' '); - f->nfmt += t - (Rune *)f->to; - f->to = t; - return 0; -} - -int -__fmtcpy(Fmt *f, const void *vm, int n, int sz) -{ - Rune *rt, *rs, r; - char *t, *s, *m, *me; - ulong fl; - int nc, w; - - m = (char*)vm; - me = m + sz; - w = f->width; - fl = f->flags; - if((fl & FmtPrec) && n > f->prec) - n = f->prec; - if(f->runes){ - if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0) - return -1; - rt = (Rune*)f->to; - rs = (Rune*)f->stop; - for(nc = n; nc > 0; nc--){ - r = *(uchar*)m; - if(r < Runeself) - m++; - else if((me - m) >= UTFmax || fullrune(m, me-m)) - m += chartorune(&r, m); - else - break; - FMTRCHAR(f, rt, rs, r); - } - f->nfmt += rt - (Rune *)f->to; - f->to = rt; - if(fl & FmtLeft && __rfmtpad(f, w - n) < 0) - return -1; - }else{ - if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0) - return -1; - t = (char*)f->to; - s = (char*)f->stop; - for(nc = n; nc > 0; nc--){ - r = *(uchar*)m; - if(r < Runeself) - m++; - else if((me - m) >= UTFmax || fullrune(m, me-m)) - m += chartorune(&r, m); - else - break; - FMTRUNE(f, t, s, r); - } - f->nfmt += t - (char *)f->to; - f->to = t; - if(fl & FmtLeft && __fmtpad(f, w - n) < 0) - return -1; - } - return 0; -} - -int -__fmtrcpy(Fmt *f, const void *vm, int n) -{ - Rune r, *m, *me, *rt, *rs; - char *t, *s; - ulong fl; - int w; - - m = (Rune*)vm; - w = f->width; - fl = f->flags; - if((fl & FmtPrec) && n > f->prec) - n = f->prec; - if(f->runes){ - if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0) - return -1; - rt = (Rune*)f->to; - rs = (Rune*)f->stop; - for(me = m + n; m < me; m++) - FMTRCHAR(f, rt, rs, *m); - f->nfmt += rt - (Rune *)f->to; - f->to = rt; - if(fl & FmtLeft && __rfmtpad(f, w - n) < 0) - return -1; - }else{ - if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0) - return -1; - t = (char*)f->to; - s = (char*)f->stop; - for(me = m + n; m < me; m++){ - r = *m; - FMTRUNE(f, t, s, r); - } - f->nfmt += t - (char *)f->to; - f->to = t; - if(fl & FmtLeft && __fmtpad(f, w - n) < 0) - return -1; - } - return 0; -} - -/* fmt out one character */ -int -__charfmt(Fmt *f) -{ - char x[1]; - - x[0] = va_arg(f->args, int); - f->prec = 1; - return __fmtcpy(f, (const char*)x, 1, 1); -} - -/* fmt out one rune */ -int -__runefmt(Fmt *f) -{ - Rune x[1]; - - x[0] = va_arg(f->args, int); - return __fmtrcpy(f, (const void*)x, 1); -} - -/* public helper routine: fmt out a null terminated string already in hand */ -int -fmtstrcpy(Fmt *f, char *s) -{ - int i, j; - Rune r; - - if(!s) - return __fmtcpy(f, "<nil>", 5, 5); - /* if precision is specified, make sure we don't wander off the end */ - if(f->flags & FmtPrec){ - i = 0; - for(j=0; j<f->prec && s[i]; j++) - i += chartorune(&r, s+i); - return __fmtcpy(f, s, j, i); - } - return __fmtcpy(f, s, utflen(s), strlen(s)); -} - -/* fmt out a null terminated utf string */ -int -__strfmt(Fmt *f) -{ - char *s; - - s = va_arg(f->args, char *); - return fmtstrcpy(f, s); -} - -/* public helper routine: fmt out a null terminated rune string already in hand */ -int -fmtrunestrcpy(Fmt *f, Rune *s) -{ - Rune *e; - int n, p; - - if(!s) - return __fmtcpy(f, "<nil>", 5, 5); - /* if precision is specified, make sure we don't wander off the end */ - if(f->flags & FmtPrec){ - p = f->prec; - for(n = 0; n < p; n++) - if(s[n] == 0) - break; - }else{ - for(e = s; *e; e++) - ; - n = e - s; - } - return __fmtrcpy(f, s, n); -} - -/* fmt out a null terminated rune string */ -int -__runesfmt(Fmt *f) -{ - Rune *s; - - s = va_arg(f->args, Rune *); - return fmtrunestrcpy(f, s); -} - -/* fmt a % */ -int -__percentfmt(Fmt *f) -{ - Rune x[1]; - - x[0] = f->r; - f->prec = 1; - return __fmtrcpy(f, (const void*)x, 1); -} - -/* fmt an integer */ -int -__ifmt(Fmt *f) -{ - char buf[70], *p, *conv; - uvlong vu; - ulong u; - int neg, base, i, n, fl, w, isv; - - neg = 0; - fl = f->flags; - isv = 0; - vu = 0; - u = 0; - /* - * Unsigned verbs for ANSI C - */ - switch(f->r){ - case 'x': - case 'X': - case 'o': - case 'u': - case 'p': - fl |= FmtUnsigned; - fl &= ~(FmtSign|FmtSpace); - break; - } - if(f->r == 'p'){ - if(sizeof(void*) == sizeof(uvlong)){ - isv = 1; - vu = (uvlong)va_arg(f->args, uvlong); - }else - u = (ulong)va_arg(f->args, ulong); - f->r = 'x'; - fl |= FmtUnsigned; - }else if(fl & FmtVLong){ - isv = 1; - if(fl & FmtUnsigned) - vu = va_arg(f->args, uvlong); - else - vu = va_arg(f->args, vlong); - }else if(fl & FmtLong){ - if(fl & FmtUnsigned) - u = va_arg(f->args, ulong); - else - u = va_arg(f->args, long); - }else if(fl & FmtByte){ - if(fl & FmtUnsigned) - u = (uchar)va_arg(f->args, int); - else - u = (char)va_arg(f->args, int); - }else if(fl & FmtShort){ - if(fl & FmtUnsigned) - u = (ushort)va_arg(f->args, int); - else - u = (short)va_arg(f->args, int); - }else{ - if(fl & FmtUnsigned) - u = va_arg(f->args, uint); - else - u = va_arg(f->args, int); - } - conv = "0123456789abcdef"; - switch(f->r){ - case 'd': - case 'i': - case 'u': - base = 10; - break; - case 'x': - base = 16; - break; - case 'X': - base = 16; - conv = "0123456789ABCDEF"; - break; - case 'b': - base = 2; - break; - case 'o': - base = 8; - break; - default: - return -1; - } - if(!(fl & FmtUnsigned)){ - if(isv && (vlong)vu < 0){ - vu = -(vlong)vu; - neg = 1; - }else if(!isv && (long)u < 0){ - u = -(long)u; - neg = 1; - } - } - p = buf + sizeof buf - 1; - n = 0; - if(isv){ - while(vu){ - i = vu % base; - vu /= base; - if((fl & FmtComma) && n % 4 == 3){ - *p-- = ','; - n++; - } - *p-- = conv[i]; - n++; - } - }else{ - while(u){ - i = u % base; - u /= base; - if((fl & FmtComma) && n % 4 == 3){ - *p-- = ','; - n++; - } - *p-- = conv[i]; - n++; - } - } - if(n == 0){ - *p-- = '0'; - n = 1; - } - for(w = f->prec; n < w && p > buf+3; n++) - *p-- = '0'; - if(neg || (fl & (FmtSign|FmtSpace))) - n++; - if(fl & FmtSharp){ - if(base == 16) - n += 2; - else if(base == 8){ - if(p[1] == '0') - fl &= ~FmtSharp; - else - n++; - } - } - if((fl & FmtZero) && !(fl & (FmtLeft|FmtPrec))){ - for(w = f->width; n < w && p > buf+3; n++) - *p-- = '0'; - f->width = 0; - } - if(fl & FmtSharp){ - if(base == 16) - *p-- = f->r; - if(base == 16 || base == 8) - *p-- = '0'; - } - if(neg) - *p-- = '-'; - else if(fl & FmtSign) - *p-- = '+'; - else if(fl & FmtSpace) - *p-- = ' '; - f->flags &= ~FmtPrec; - return __fmtcpy(f, p + 1, n, n); -} - -int -__countfmt(Fmt *f) -{ - void *p; - ulong fl; - - fl = f->flags; - p = va_arg(f->args, void*); - if(fl & FmtVLong){ - *(vlong*)p = f->nfmt; - }else if(fl & FmtLong){ - *(long*)p = f->nfmt; - }else if(fl & FmtByte){ - *(char*)p = f->nfmt; - }else if(fl & FmtShort){ - *(short*)p = f->nfmt; - }else{ - *(int*)p = f->nfmt; - } - return 0; -} - -int -__flagfmt(Fmt *f) -{ - switch(f->r){ - case ',': - f->flags |= FmtComma; - break; - case '-': - f->flags |= FmtLeft; - break; - case '+': - f->flags |= FmtSign; - break; - case '#': - f->flags |= FmtSharp; - break; - case ' ': - f->flags |= FmtSpace; - break; - case 'u': - f->flags |= FmtUnsigned; - break; - case 'h': - if(f->flags & FmtShort) - f->flags |= FmtByte; - f->flags |= FmtShort; - break; - case 'L': - f->flags |= FmtLDouble; - break; - case 'l': - if(f->flags & FmtLong) - f->flags |= FmtVLong; - f->flags |= FmtLong; - break; - } - return 1; -} - -/* default error format */ -int -__badfmt(Fmt *f) -{ - char x[2+UTFmax]; - Rune r; - int n; - - r = f->r; - x[0] = '%'; - n = 1+runetochar(x+1, &r); - x[n++] = '%'; - f->prec = n; - _fmtcpy(f, x, n, n); - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/dorfmt.c b/sys/src/cmd/unix/drawterm/libc/dorfmt.c deleted file mode 100644 index 68c6fafdf..000000000 --- a/sys/src/cmd/unix/drawterm/libc/dorfmt.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -/* format the output into f->to and return the number of characters fmted */ - -int -dorfmt(Fmt *f, const Rune *fmt) -{ - Rune *rt, *rs; - int r; - char *t, *s; - int nfmt; - - nfmt = f->nfmt; - for(;;){ - if(f->runes){ - rt = f->to; - rs = f->stop; - while((r = *fmt++) && r != '%'){ - FMTRCHAR(f, rt, rs, r); - } - f->nfmt += rt - (Rune *)f->to; - f->to = rt; - if(!r) - return f->nfmt - nfmt; - f->stop = rs; - }else{ - t = f->to; - s = f->stop; - while((r = *fmt++) && r != '%'){ - FMTRUNE(f, t, f->stop, r); - } - f->nfmt += t - (char *)f->to; - f->to = t; - if(!r) - return f->nfmt - nfmt; - f->stop = s; - } - - fmt = __fmtdispatch(f, (Rune*)fmt, 1); - if(fmt == nil) - return -1; - } - return 0; /* not reached */ -} diff --git a/sys/src/cmd/unix/drawterm/libc/encodefmt.c b/sys/src/cmd/unix/drawterm/libc/encodefmt.c deleted file mode 100644 index 721a58c9f..000000000 --- a/sys/src/cmd/unix/drawterm/libc/encodefmt.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <ctype.h> - -int -encodefmt(Fmt *f) -{ - char *out; - char *buf; - int len; - int ilen; - int rv; - uchar *b; - char *p; - char obuf[64]; // rsc optimization - - if(!(f->flags&FmtPrec) || f->prec < 1) - goto error; - - b = va_arg(f->args, uchar*); - if(b == 0) - return fmtstrcpy(f, "<nil>"); - - ilen = f->prec; - f->prec = 0; - f->flags &= ~FmtPrec; - switch(f->r){ - case '<': - len = (8*ilen+4)/5 + 3; - break; - case '[': - len = (8*ilen+5)/6 + 4; - break; - case 'H': - len = 2*ilen + 1; - break; - default: - goto error; - } - - if(len > sizeof(obuf)){ - buf = malloc(len); - if(buf == nil) - goto error; - } else - buf = obuf; - - // convert - out = buf; - switch(f->r){ - case '<': - rv = enc32(out, len, b, ilen); - break; - case '[': - rv = enc64(out, len, b, ilen); - break; - case 'H': - rv = enc16(out, len, b, ilen); - if(rv >= 0 && (f->flags & FmtLong)) - for(p = buf; *p; p++) - *p = tolower(*p); - break; - default: - rv = -1; - break; - } - if(rv < 0) - goto error; - - fmtstrcpy(f, buf); - if(buf != obuf) - free(buf); - return 0; - -error: - return fmtstrcpy(f, "<encodefmt>"); -} diff --git a/sys/src/cmd/unix/drawterm/libc/errfmt.c b/sys/src/cmd/unix/drawterm/libc/errfmt.c deleted file mode 100644 index 5b29b1671..000000000 --- a/sys/src/cmd/unix/drawterm/libc/errfmt.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -errfmt(Fmt *f) -{ - char buf[ERRMAX]; - - rerrstr(buf, sizeof buf); - return _fmtcpy(f, buf, utflen(buf), strlen(buf)); -} diff --git a/sys/src/cmd/unix/drawterm/libc/fcallfmt.c b/sys/src/cmd/unix/drawterm/libc/fcallfmt.c deleted file mode 100644 index 4eef88dec..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fcallfmt.c +++ /dev/null @@ -1,234 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -static uint dumpsome(char*, char*, char*, long); -static void fdirconv(char*, char*, Dir*); -static char *qidtype(char*, uchar); - -#define QIDFMT "(%.16llux %lud %s)" - -int -fcallfmt(Fmt *fmt) -{ - Fcall *f; - int fid, type, tag, i; - char buf[512], tmp[200]; - char *p, *e; - Dir *d; - Qid *q; - - e = buf+sizeof(buf); - f = va_arg(fmt->args, Fcall*); - type = f->type; - fid = f->fid; - tag = f->tag; - switch(type){ - case Tversion: /* 100 */ - seprint(buf, e, "Tversion tag %ud msize %ud version '%s'", tag, f->msize, f->version); - break; - case Rversion: - seprint(buf, e, "Rversion tag %ud msize %ud version '%s'", tag, f->msize, f->version); - break; - case Tauth: /* 102 */ - seprint(buf, e, "Tauth tag %ud afid %d uname %s aname %s", tag, - f->afid, f->uname, f->aname); - break; - case Rauth: - seprint(buf, e, "Rauth tag %ud qid " QIDFMT, tag, - f->aqid.path, f->aqid.vers, qidtype(tmp, f->aqid.type)); - break; - case Tattach: /* 104 */ - seprint(buf, e, "Tattach tag %ud fid %d afid %d uname %s aname %s", tag, - fid, f->afid, f->uname, f->aname); - break; - case Rattach: - seprint(buf, e, "Rattach tag %ud qid " QIDFMT, tag, - f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type)); - break; - case Rerror: /* 107; 106 (Terror) illegal */ - seprint(buf, e, "Rerror tag %ud ename %s", tag, f->ename); - break; - case Tflush: /* 108 */ - seprint(buf, e, "Tflush tag %ud oldtag %ud", tag, f->oldtag); - break; - case Rflush: - seprint(buf, e, "Rflush tag %ud", tag); - break; - case Twalk: /* 110 */ - p = seprint(buf, e, "Twalk tag %ud fid %d newfid %d nwname %d ", tag, fid, f->newfid, f->nwname); - if(f->nwname <= MAXWELEM) - for(i=0; i<f->nwname; i++) - p = seprint(p, e, "%d:%s ", i, f->wname[i]); - break; - case Rwalk: - p = seprint(buf, e, "Rwalk tag %ud nwqid %ud ", tag, f->nwqid); - if(f->nwqid <= MAXWELEM) - for(i=0; i<f->nwqid; i++){ - q = &f->wqid[i]; - p = seprint(p, e, "%d:" QIDFMT " ", i, - q->path, q->vers, qidtype(tmp, q->type)); - } - break; - case Topen: /* 112 */ - seprint(buf, e, "Topen tag %ud fid %ud mode %d", tag, fid, f->mode); - break; - case Ropen: - seprint(buf, e, "Ropen tag %ud qid " QIDFMT " iounit %ud ", tag, - f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type), f->iounit); - break; - case Tcreate: /* 114 */ - seprint(buf, e, "Tcreate tag %ud fid %ud name %s perm %M mode %d", tag, fid, f->name, (ulong)f->perm, f->mode); - break; - case Rcreate: - seprint(buf, e, "Rcreate tag %ud qid " QIDFMT " iounit %ud ", tag, - f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type), f->iounit); - break; - case Tread: /* 116 */ - seprint(buf, e, "Tread tag %ud fid %d offset %lld count %ud", - tag, fid, f->offset, f->count); - break; - case Rread: - p = seprint(buf, e, "Rread tag %ud count %ud ", tag, f->count); - dumpsome(p, e, f->data, f->count); - break; - case Twrite: /* 118 */ - p = seprint(buf, e, "Twrite tag %ud fid %d offset %lld count %ud ", - tag, fid, f->offset, f->count); - dumpsome(p, e, f->data, f->count); - break; - case Rwrite: - seprint(buf, e, "Rwrite tag %ud count %ud", tag, f->count); - break; - case Tclunk: /* 120 */ - seprint(buf, e, "Tclunk tag %ud fid %ud", tag, fid); - break; - case Rclunk: - seprint(buf, e, "Rclunk tag %ud", tag); - break; - case Tremove: /* 122 */ - seprint(buf, e, "Tremove tag %ud fid %ud", tag, fid); - break; - case Rremove: - seprint(buf, e, "Rremove tag %ud", tag); - break; - case Tstat: /* 124 */ - seprint(buf, e, "Tstat tag %ud fid %ud", tag, fid); - break; - case Rstat: - p = seprint(buf, e, "Rstat tag %ud ", tag); - if(f->nstat > sizeof tmp) - seprint(p, e, " stat(%d bytes)", f->nstat); - else{ - d = (Dir*)tmp; - convM2D(f->stat, f->nstat, d, (char*)(d+1)); - seprint(p, e, " stat "); - fdirconv(p+6, e, d); - } - break; - case Twstat: /* 126 */ - p = seprint(buf, e, "Twstat tag %ud fid %ud", tag, fid); - if(f->nstat > sizeof tmp) - seprint(p, e, " stat(%d bytes)", f->nstat); - else{ - d = (Dir*)tmp; - convM2D(f->stat, f->nstat, d, (char*)(d+1)); - seprint(p, e, " stat "); - fdirconv(p+6, e, d); - } - break; - case Rwstat: - seprint(buf, e, "Rwstat tag %ud", tag); - break; - default: - seprint(buf, e, "unknown type %d", type); - } - return fmtstrcpy(fmt, buf); -} - -static char* -qidtype(char *s, uchar t) -{ - char *p; - - p = s; - if(t & QTDIR) - *p++ = 'd'; - if(t & QTAPPEND) - *p++ = 'a'; - if(t & QTEXCL) - *p++ = 'l'; - if(t & QTAUTH) - *p++ = 'A'; - *p = '\0'; - return s; -} - -int -dirfmt(Fmt *fmt) -{ - char buf[160]; - - fdirconv(buf, buf+sizeof buf, va_arg(fmt->args, Dir*)); - return fmtstrcpy(fmt, buf); -} - -static void -fdirconv(char *buf, char *e, Dir *d) -{ - char tmp[16]; - - seprint(buf, e, "'%s' '%s' '%s' '%s' " - "q " QIDFMT " m %#luo " - "at %ld mt %ld l %lld " - "t %d d %d", - d->name, d->uid, d->gid, d->muid, - d->qid.path, d->qid.vers, qidtype(tmp, d->qid.type), d->mode, - d->atime, d->mtime, d->length, - d->type, d->dev); -} - -/* - * dump out count (or DUMPL, if count is bigger) bytes from - * buf to ans, as a string if they are all printable, - * else as a series of hex bytes - */ -#define DUMPL 64 - -static uint -dumpsome(char *ans, char *e, char *buf, long count) -{ - int i, printable; - char *p; - - if(buf == nil){ - seprint(ans, e, "<no data>"); - return strlen(ans); - } - printable = 1; - if(count > DUMPL) - count = DUMPL; - for(i=0; i<count && printable; i++) - if((buf[i]<32 && buf[i] !='\n' && buf[i] !='\t') || (uchar)buf[i]>127) - printable = 0; - p = ans; - *p++ = '\''; - if(printable){ - if(count > e-p-2) - count = e-p-2; - memmove(p, buf, count); - p += count; - }else{ - if(2*count > e-p-2) - count = (e-p-2)/2; - for(i=0; i<count; i++){ - if(i>0 && i%4==0) - *p++ = ' '; - sprint(p, "%2.2ux", buf[i]); - p += 2; - } - } - *p++ = '\''; - *p = 0; - return p - ans; -} diff --git a/sys/src/cmd/unix/drawterm/libc/fltfmt.c b/sys/src/cmd/unix/drawterm/libc/fltfmt.c deleted file mode 100644 index d14d67202..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fltfmt.c +++ /dev/null @@ -1,375 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <float.h> -#include <ctype.h> -#include "fmtdef.h" - -enum -{ - FDIGIT = 30, - FDEFLT = 6, - NSIGNIF = 17 -}; - -/* - * first few powers of 10, enough for about 1/2 of the - * total space for doubles. - */ -static double pows10[] = -{ - 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, - 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, - 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, - 1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39, - 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49, - 1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59, - 1e60, 1e61, 1e62, 1e63, 1e64, 1e65, 1e66, 1e67, 1e68, 1e69, - 1e70, 1e71, 1e72, 1e73, 1e74, 1e75, 1e76, 1e77, 1e78, 1e79, - 1e80, 1e81, 1e82, 1e83, 1e84, 1e85, 1e86, 1e87, 1e88, 1e89, - 1e90, 1e91, 1e92, 1e93, 1e94, 1e95, 1e96, 1e97, 1e98, 1e99, - 1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, - 1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, - 1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, - 1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, - 1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, - 1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, -}; - -#undef pow10 -#define pow10(x) fmtpow10(x) - -static double -pow10(int n) -{ - double d; - int neg; - - neg = 0; - if(n < 0){ - if(n < DBL_MIN_10_EXP){ - return 0.; - } - neg = 1; - n = -n; - }else if(n > DBL_MAX_10_EXP){ - return HUGE_VAL; - } - if(n < (int)(sizeof(pows10)/sizeof(pows10[0]))) - d = pows10[n]; - else{ - d = pows10[sizeof(pows10)/sizeof(pows10[0]) - 1]; - for(;;){ - n -= sizeof(pows10)/sizeof(pows10[0]) - 1; - if(n < (int)(sizeof(pows10)/sizeof(pows10[0]))){ - d *= pows10[n]; - break; - } - d *= pows10[sizeof(pows10)/sizeof(pows10[0]) - 1]; - } - } - if(neg){ - return 1./d; - } - return d; -} - -static int -xadd(char *a, int n, int v) -{ - char *b; - int c; - - if(n < 0 || n >= NSIGNIF) - return 0; - for(b = a+n; b >= a; b--) { - c = *b + v; - if(c <= '9') { - *b = c; - return 0; - } - *b = '0'; - v = 1; - } - *a = '1'; /* overflow adding */ - return 1; -} - -static int -xsub(char *a, int n, int v) -{ - char *b; - int c; - - for(b = a+n; b >= a; b--) { - c = *b - v; - if(c >= '0') { - *b = c; - return 0; - } - *b = '9'; - v = 1; - } - *a = '9'; /* underflow subtracting */ - return 1; -} - -static void -xdtoa(Fmt *fmt, char *s2, double f) -{ - char s1[NSIGNIF+10]; - double g, h; - int e, d, i, n; - int c1, c2, c3, c4, ucase, sign, chr, prec; - - prec = FDEFLT; - if(fmt->flags & FmtPrec) - prec = fmt->prec; - if(prec > FDIGIT) - prec = FDIGIT; - if(__isNaN(f)) { - strcpy(s2, "NaN"); - return; - } - if(__isInf(f, 1)) { - strcpy(s2, "+Inf"); - return; - } - if(__isInf(f, -1)) { - strcpy(s2, "-Inf"); - return; - } - sign = 0; - if(f < 0) { - f = -f; - sign++; - } - ucase = 0; - chr = fmt->r; - if(isupper(chr)) { - ucase = 1; - chr = tolower(chr); - } - - e = 0; - g = f; - if(g != 0) { - frexp(f, &e); - e = e * .301029995664; - if(e >= -150 && e <= +150) { - d = 0; - h = f; - } else { - d = e/2; - h = f * pow10(-d); - } - g = h * pow10(d-e); - while(g < 1) { - e--; - g = h * pow10(d-e); - } - while(g >= 10) { - e++; - g = h * pow10(d-e); - } - } - - /* - * convert NSIGNIF digits and convert - * back to get accuracy. - */ - for(i=0; i<NSIGNIF; i++) { - d = g; - s1[i] = d + '0'; - g = (g - d) * 10; - } - s1[i] = 0; - - /* - * try decimal rounding to eliminate 9s - */ - c2 = prec + 1; - if(chr == 'f') - c2 += e; - if(c2 >= NSIGNIF-2) { - strcpy(s2, s1); - d = e; - s1[NSIGNIF-2] = '0'; - s1[NSIGNIF-1] = '0'; - sprint(s1+NSIGNIF, "e%d", e-NSIGNIF+1); - g = strtod(s1, nil); - if(g == f) - goto found; - if(xadd(s1, NSIGNIF-3, 1)) { - e++; - sprint(s1+NSIGNIF, "e%d", e-NSIGNIF+1); - } - g = strtod(s1, nil); - if(g == f) - goto found; - strcpy(s1, s2); - e = d; - } - - /* - * convert back so s1 gets exact answer - */ - for(;;) { - sprint(s1+NSIGNIF, "e%d", e-NSIGNIF+1); - g = strtod(s1, nil); - if(f > g) { - if(xadd(s1, NSIGNIF-1, 1)) - e--; - continue; - } - if(f < g) { - if(xsub(s1, NSIGNIF-1, 1)) - e++; - continue; - } - break; - } - -found: - /* - * sign - */ - d = 0; - i = 0; - if(sign) - s2[d++] = '-'; - else if(fmt->flags & FmtSign) - s2[d++] = '+'; - else if(fmt->flags & FmtSpace) - s2[d++] = ' '; - - /* - * copy into final place - * c1 digits of leading '0' - * c2 digits from conversion - * c3 digits of trailing '0' - * c4 digits after '.' - */ - c1 = 0; - c2 = prec + 1; - c3 = 0; - c4 = prec; - switch(chr) { - default: - if(xadd(s1, c2, 5)) - e++; - break; - case 'g': - /* - * decide on 'e' of 'f' style convers - */ - if(xadd(s1, c2, 5)) - e++; - if(e >= -5 && e <= prec) { - c1 = -e - 1; - c4 = prec - e; - chr = 'h'; // flag for 'f' style - } - break; - case 'f': - if(xadd(s1, c2+e, 5)) - e++; - c1 = -e; - if(c1 > prec) - c1 = c2; - c2 += e; - break; - } - - /* - * clean up c1 c2 and c3 - */ - if(c1 < 0) - c1 = 0; - if(c2 < 0) - c2 = 0; - if(c2 > NSIGNIF) { - c3 = c2-NSIGNIF; - c2 = NSIGNIF; - } - - /* - * copy digits - */ - while(c1 > 0) { - if(c1+c2+c3 == c4) - s2[d++] = '.'; - s2[d++] = '0'; - c1--; - } - while(c2 > 0) { - if(c2+c3 == c4) - s2[d++] = '.'; - s2[d++] = s1[i++]; - c2--; - } - while(c3 > 0) { - if(c3 == c4) - s2[d++] = '.'; - s2[d++] = '0'; - c3--; - } - - /* - * strip trailing '0' on g conv - */ - if(fmt->flags & FmtSharp) { - if(0 == c4) - s2[d++] = '.'; - } else - if(chr == 'g' || chr == 'h') { - for(n=d-1; n>=0; n--) - if(s2[n] != '0') - break; - for(i=n; i>=0; i--) - if(s2[i] == '.') { - d = n; - if(i != n) - d++; - break; - } - } - if(chr == 'e' || chr == 'g') { - if(ucase) - s2[d++] = 'E'; - else - s2[d++] = 'e'; - c1 = e; - if(c1 < 0) { - s2[d++] = '-'; - c1 = -c1; - } else - s2[d++] = '+'; - if(c1 >= 100) { - s2[d++] = c1/100 + '0'; - c1 = c1%100; - } - s2[d++] = c1/10 + '0'; - s2[d++] = c1%10 + '0'; - } - s2[d] = 0; -} - -static int -floatfmt(Fmt *fmt, double f) -{ - char s[341]; /* precision+exponent+sign+'.'+null */ - - xdtoa(fmt, s, f); - fmt->flags &= FmtWidth|FmtLeft; - __fmtcpy(fmt, s, strlen(s), strlen(s)); - return 0; -} - -int -__efgfmt(Fmt *f) -{ - double d; - - d = va_arg(f->args, double); - return floatfmt(f, d); -} diff --git a/sys/src/cmd/unix/drawterm/libc/fmt.c b/sys/src/cmd/unix/drawterm/libc/fmt.c deleted file mode 100644 index 69503f370..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmt.c +++ /dev/null @@ -1,216 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -enum -{ - Maxfmt = 64 -}; - -typedef struct Convfmt Convfmt; -struct Convfmt -{ - int c; - volatile Fmts fmt; /* for spin lock in fmtfmt; avoids race due to write order */ -}; - -struct -{ - /* lock by calling __fmtlock, __fmtunlock */ - int nfmt; - Convfmt fmt[Maxfmt]; -} fmtalloc; - -static Convfmt knownfmt[] = { - ' ', __flagfmt, - '#', __flagfmt, - '%', __percentfmt, - '+', __flagfmt, - ',', __flagfmt, - '-', __flagfmt, - 'C', __runefmt, /* Plan 9 addition */ - 'E', __efgfmt, -#ifndef PLAN9PORT - 'F', __efgfmt, /* ANSI only */ -#endif - 'G', __efgfmt, -#ifndef PLAN9PORT - 'L', __flagfmt, /* ANSI only */ -#endif - 'S', __runesfmt, /* Plan 9 addition */ - 'X', __ifmt, - 'b', __ifmt, /* Plan 9 addition */ - 'c', __charfmt, - 'd', __ifmt, - 'e', __efgfmt, - 'f', __efgfmt, - 'g', __efgfmt, - 'h', __flagfmt, -#ifndef PLAN9PORT - 'i', __ifmt, /* ANSI only */ -#endif - 'l', __flagfmt, - 'n', __countfmt, - 'o', __ifmt, - 'p', __ifmt, - 'r', __errfmt, - 's', __strfmt, -#ifdef PLAN9PORT - 'u', __flagfmt, -#else - 'u', __ifmt, -#endif - 'x', __ifmt, - 0, 0, -}; - - -int (*fmtdoquote)(int); - -/* - * __fmtlock() must be set - */ -static int -__fmtinstall(int c, Fmts f) -{ - Convfmt *p, *ep; - - if(c<=0 || c>=65536) - return -1; - if(!f) - f = __badfmt; - - ep = &fmtalloc.fmt[fmtalloc.nfmt]; - for(p=fmtalloc.fmt; p<ep; p++) - if(p->c == c) - break; - - if(p == &fmtalloc.fmt[Maxfmt]) - return -1; - - p->fmt = f; - if(p == ep){ /* installing a new format character */ - fmtalloc.nfmt++; - p->c = c; - } - - return 0; -} - -int -fmtinstall(int c, int (*f)(Fmt*)) -{ - int ret; - - __fmtlock(); - ret = __fmtinstall(c, f); - __fmtunlock(); - return ret; -} - -static Fmts -fmtfmt(int c) -{ - Convfmt *p, *ep; - - ep = &fmtalloc.fmt[fmtalloc.nfmt]; - for(p=fmtalloc.fmt; p<ep; p++) - if(p->c == c){ - while(p->fmt == 0) /* loop until value is updated */ - ; - return p->fmt; - } - - /* is this a predefined format char? */ - __fmtlock(); - for(p=knownfmt; p->c; p++) - if(p->c == c){ - __fmtinstall(p->c, p->fmt); - __fmtunlock(); - return p->fmt; - } - __fmtunlock(); - - return __badfmt; -} - -void* -__fmtdispatch(Fmt *f, void *fmt, int isrunes) -{ - Rune rune, r; - int i, n; - - f->flags = 0; - f->width = f->prec = 0; - - for(;;){ - if(isrunes){ - r = *(Rune*)fmt; - fmt = (Rune*)fmt + 1; - }else{ - fmt = (char*)fmt + chartorune(&rune, (char*)fmt); - r = rune; - } - f->r = r; - switch(r){ - case '\0': - return nil; - case '.': - f->flags |= FmtWidth|FmtPrec; - continue; - case '0': - if(!(f->flags & FmtWidth)){ - f->flags |= FmtZero; - continue; - } - /* fall through */ - case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - i = 0; - while(r >= '0' && r <= '9'){ - i = i * 10 + r - '0'; - if(isrunes){ - r = *(Rune*)fmt; - fmt = (Rune*)fmt + 1; - }else{ - r = *(char*)fmt; - fmt = (char*)fmt + 1; - } - } - if(isrunes) - fmt = (Rune*)fmt - 1; - else - fmt = (char*)fmt - 1; - numflag: - if(f->flags & FmtWidth){ - f->flags |= FmtPrec; - f->prec = i; - }else{ - f->flags |= FmtWidth; - f->width = i; - } - continue; - case '*': - i = va_arg(f->args, int); - if(i < 0){ - /* - * negative precision => - * ignore the precision. - */ - if(f->flags & FmtPrec){ - f->flags &= ~FmtPrec; - f->prec = 0; - continue; - } - i = -i; - f->flags |= FmtLeft; - } - goto numflag; - } - n = (*fmtfmt(r))(f); - if(n < 0) - return nil; - if(n == 0) - return fmt; - } -} diff --git a/sys/src/cmd/unix/drawterm/libc/fmtdef.h b/sys/src/cmd/unix/drawterm/libc/fmtdef.h deleted file mode 100644 index 1cc74b566..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtdef.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * dofmt -- format to a buffer - * the number of characters formatted is returned, - * or -1 if there was an error. - * if the buffer is ever filled, flush is called. - * it should reset the buffer and return whether formatting should continue. - */ - -typedef int (*Fmts)(Fmt*); - -typedef struct Quoteinfo Quoteinfo; -struct Quoteinfo -{ - int quoted; /* if set, string must be quoted */ - int nrunesin; /* number of input runes that can be accepted */ - int nbytesin; /* number of input bytes that can be accepted */ - int nrunesout; /* number of runes that will be generated */ - int nbytesout; /* number of bytes that will be generated */ -}; - -/* Edit .+1,/^$/ |cfn |grep -v static | grep __ */ -double __Inf(int sign); -double __NaN(void); -int __badfmt(Fmt *f); -int __charfmt(Fmt *f); -int __countfmt(Fmt *f); -int __efgfmt(Fmt *fmt); -int __errfmt(Fmt *f); -int __flagfmt(Fmt *f); -int __fmtFdFlush(Fmt *f); -int __fmtcpy(Fmt *f, const void *vm, int n, int sz); -void* __fmtdispatch(Fmt *f, void *fmt, int isrunes); -void * __fmtflush(Fmt *f, void *t, int len); -void __fmtlock(void); -int __fmtpad(Fmt *f, int n); -double __fmtpow10(int n); -int __fmtrcpy(Fmt *f, const void *vm, int n); -void __fmtunlock(void); -int __ifmt(Fmt *f); -int __isInf(double d, int sign); -int __isNaN(double d); -int __needsquotes(char *s, int *quotelenp); -int __percentfmt(Fmt *f); -void __quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout); -int __quotestrfmt(int runesin, Fmt *f); -int __rfmtpad(Fmt *f, int n); -int __runefmt(Fmt *f); -int __runeneedsquotes(Rune *r, int *quotelenp); -int __runesfmt(Fmt *f); -int __strfmt(Fmt *f); - -#define FMTCHAR(f, t, s, c)\ - do{\ - if(t + 1 > (char*)s){\ - t = __fmtflush(f, t, 1);\ - if(t != nil)\ - s = f->stop;\ - else\ - return -1;\ - }\ - *t++ = c;\ - }while(0) - -#define FMTRCHAR(f, t, s, c)\ - do{\ - if(t + 1 > (Rune*)s){\ - t = __fmtflush(f, t, sizeof(Rune));\ - if(t != nil)\ - s = f->stop;\ - else\ - return -1;\ - }\ - *t++ = c;\ - }while(0) - -#define FMTRUNE(f, t, s, r)\ - do{\ - Rune _rune;\ - int _runelen;\ - if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\ - t = __fmtflush(f, t, _runelen);\ - if(t != nil)\ - s = f->stop;\ - else\ - return -1;\ - }\ - if(r < Runeself)\ - *t++ = r;\ - else{\ - _rune = r;\ - t += runetochar(t, &_rune);\ - }\ - }while(0) - -#ifdef va_copy -# define VA_COPY(a,b) va_copy(a,b) -# define VA_END(a) va_end(a) -#else -# define VA_COPY(a,b) (a) = (b) -# define VA_END(a) -#endif - -#define PLAN9PORT diff --git a/sys/src/cmd/unix/drawterm/libc/fmtfd.c b/sys/src/cmd/unix/drawterm/libc/fmtfd.c deleted file mode 100644 index 8ba9aa414..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtfd.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <inttypes.h> -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -/* - * public routine for final flush of a formatting buffer - * to a file descriptor; returns total char count. - */ -int -fmtfdflush(Fmt *f) -{ - if(__fmtFdFlush(f) <= 0) - return -1; - return f->nfmt; -} - -/* - * initialize an output buffer for buffered printing - */ -int -fmtfdinit(Fmt *f, int fd, char *buf, int size) -{ - f->runes = 0; - f->start = buf; - f->to = buf; - f->stop = buf + size; - f->flush = __fmtFdFlush; - f->farg = (void*)(uintptr_t)fd; - f->nfmt = 0; - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/fmtfdflush.c b/sys/src/cmd/unix/drawterm/libc/fmtfdflush.c deleted file mode 100644 index 9bed1859b..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtfdflush.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <inttypes.h> -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -/* - * generic routine for flushing a formatting buffer - * to a file descriptor - */ -int -__fmtFdFlush(Fmt *f) -{ - int n; - - n = (char*)f->to - (char*)f->start; - if(n && write((uintptr_t)f->farg, f->start, n) != n) - return 0; - f->to = f->start; - return 1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/fmtlock.c b/sys/src/cmd/unix/drawterm/libc/fmtlock.c deleted file mode 100644 index 60bce9756..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtlock.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <u.h> -#include <libc.h> - -static Lock fmtl; - -void -__fmtlock(void) -{ - lock(&fmtl); -} - -void -__fmtunlock(void) -{ - unlock(&fmtl); -} diff --git a/sys/src/cmd/unix/drawterm/libc/fmtprint.c b/sys/src/cmd/unix/drawterm/libc/fmtprint.c deleted file mode 100644 index 3070dfb35..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtprint.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -/* - * format a string into the output buffer - * designed for formats which themselves call fmt, - * but ignore any width flags - */ -int -fmtprint(Fmt *f, char *fmt, ...) -{ - va_list va; - int n; - - f->flags = 0; - f->width = 0; - f->prec = 0; - VA_COPY(va, f->args); - VA_END(f->args); - va_start(f->args, fmt); - n = dofmt(f, fmt); - va_end(f->args); - f->flags = 0; - f->width = 0; - f->prec = 0; - VA_COPY(f->args,va); - VA_END(va); - if(n >= 0) - return 0; - return n; -} - diff --git a/sys/src/cmd/unix/drawterm/libc/fmtquote.c b/sys/src/cmd/unix/drawterm/libc/fmtquote.c deleted file mode 100644 index 17a027d8e..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtquote.c +++ /dev/null @@ -1,249 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -/* - * How many bytes of output UTF will be produced by quoting (if necessary) this string? - * How many runes? How much of the input will be consumed? - * The parameter q is filled in by __quotesetup. - * The string may be UTF or Runes (s or r). - * Return count does not include NUL. - * Terminate the scan at the first of: - * NUL in input - * count exceeded in input - * count exceeded on output - * *ninp is set to number of input bytes accepted. - * nin may be <0 initially, to avoid checking input by count. - */ -void -__quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout) -{ - int w; - Rune c; - - q->quoted = 0; - q->nbytesout = 0; - q->nrunesout = 0; - q->nbytesin = 0; - q->nrunesin = 0; - if(sharp || nin==0 || (s && *s=='\0') || (r && *r=='\0')){ - if(nout < 2) - return; - q->quoted = 1; - q->nbytesout = 2; - q->nrunesout = 2; - } - for(; nin!=0; nin--){ - if(s) - w = chartorune(&c, s); - else{ - c = *r; - w = runelen(c); - } - - if(c == '\0') - break; - if(runesout){ - if(q->nrunesout+1 > nout) - break; - }else{ - if(q->nbytesout+w > nout) - break; - } - - if((c <= L' ') || (c == L'\'') || (fmtdoquote!=0 && fmtdoquote(c))){ - if(!q->quoted){ - if(runesout){ - if(1+q->nrunesout+1+1 > nout) /* no room for quotes */ - break; - }else{ - if(1+q->nbytesout+w+1 > nout) /* no room for quotes */ - break; - } - q->nrunesout += 2; /* include quotes */ - q->nbytesout += 2; /* include quotes */ - q->quoted = 1; - } - if(c == '\'') { - if(runesout){ - if(1+q->nrunesout+1 > nout) /* no room for quotes */ - break; - }else{ - if(1+q->nbytesout+w > nout) /* no room for quotes */ - break; - } - q->nbytesout++; - q->nrunesout++; /* quotes reproduce as two characters */ - } - } - - /* advance input */ - if(s) - s += w; - else - r++; - q->nbytesin += w; - q->nrunesin++; - - /* advance output */ - q->nbytesout += w; - q->nrunesout++; - } -} - -static int -qstrfmt(char *sin, Rune *rin, Quoteinfo *q, Fmt *f) -{ - Rune r, *rm, *rme; - char *t, *s, *m, *me; - Rune *rt, *rs; - ulong fl; - int nc, w; - - m = sin; - me = m + q->nbytesin; - rm = rin; - rme = rm + q->nrunesin; - - w = f->width; - fl = f->flags; - if(f->runes){ - if(!(fl & FmtLeft) && __rfmtpad(f, w - q->nrunesout) < 0) - return -1; - }else{ - if(!(fl & FmtLeft) && __fmtpad(f, w - q->nbytesout) < 0) - return -1; - } - t = (char*)f->to; - s = (char*)f->stop; - rt = (Rune*)f->to; - rs = (Rune*)f->stop; - if(f->runes) - FMTRCHAR(f, rt, rs, '\''); - else - FMTRUNE(f, t, s, '\''); - for(nc = q->nrunesin; nc > 0; nc--){ - if(sin){ - r = *(uchar*)m; - if(r < Runeself) - m++; - else if((me - m) >= UTFmax || fullrune(m, me-m)) - m += chartorune(&r, m); - else - break; - }else{ - if(rm >= rme) - break; - r = *(uchar*)rm++; - } - if(f->runes){ - FMTRCHAR(f, rt, rs, r); - if(r == '\'') - FMTRCHAR(f, rt, rs, r); - }else{ - FMTRUNE(f, t, s, r); - if(r == '\'') - FMTRUNE(f, t, s, r); - } - } - - if(f->runes){ - FMTRCHAR(f, rt, rs, '\''); - USED(rs); - f->nfmt += rt - (Rune *)f->to; - f->to = rt; - if(fl & FmtLeft && __rfmtpad(f, w - q->nrunesout) < 0) - return -1; - }else{ - FMTRUNE(f, t, s, '\''); - USED(s); - f->nfmt += t - (char *)f->to; - f->to = t; - if(fl & FmtLeft && __fmtpad(f, w - q->nbytesout) < 0) - return -1; - } - return 0; -} - -int -__quotestrfmt(int runesin, Fmt *f) -{ - int nin, outlen; - Rune *r; - char *s; - Quoteinfo q; - - nin = -1; - if(f->flags&FmtPrec) - nin = f->prec; - if(runesin){ - r = va_arg(f->args, Rune *); - s = nil; - }else{ - s = va_arg(f->args, char *); - r = nil; - } - if(!s && !r) - return __fmtcpy(f, (void*)"<nil>", 5, 5); - - if(f->flush) - outlen = 0x7FFFFFFF; /* if we can flush, no output limit */ - else if(f->runes) - outlen = (Rune*)f->stop - (Rune*)f->to; - else - outlen = (char*)f->stop - (char*)f->to; - - __quotesetup(s, r, nin, outlen, &q, f->flags&FmtSharp, f->runes); -//print("bytes in %d bytes out %d runes in %d runesout %d\n", q.nbytesin, q.nbytesout, q.nrunesin, q.nrunesout); - - if(runesin){ - if(!q.quoted) - return __fmtrcpy(f, r, q.nrunesin); - return qstrfmt(nil, r, &q, f); - } - - if(!q.quoted) - return __fmtcpy(f, s, q.nrunesin, q.nbytesin); - return qstrfmt(s, nil, &q, f); -} - -int -quotestrfmt(Fmt *f) -{ - return __quotestrfmt(0, f); -} - -int -quoterunestrfmt(Fmt *f) -{ - return __quotestrfmt(1, f); -} - -void -quotefmtinstall(void) -{ - fmtinstall('q', quotestrfmt); - fmtinstall('Q', quoterunestrfmt); -} - -int -__needsquotes(char *s, int *quotelenp) -{ - Quoteinfo q; - - __quotesetup(s, nil, -1, 0x7FFFFFFF, &q, 0, 0); - *quotelenp = q.nbytesout; - - return q.quoted; -} - -int -__runeneedsquotes(Rune *r, int *quotelenp) -{ - Quoteinfo q; - - __quotesetup(nil, r, -1, 0x7FFFFFFF, &q, 0, 0); - *quotelenp = q.nrunesout; - - return q.quoted; -} diff --git a/sys/src/cmd/unix/drawterm/libc/fmtrune.c b/sys/src/cmd/unix/drawterm/libc/fmtrune.c deleted file mode 100644 index cdb40cd58..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtrune.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -fmtrune(Fmt *f, int r) -{ - Rune *rt; - char *t; - int n; - - if(f->runes){ - rt = (Rune*)f->to; - FMTRCHAR(f, rt, f->stop, r); - f->to = rt; - n = 1; - }else{ - t = (char*)f->to; - FMTRUNE(f, t, f->stop, r); - n = t - (char*)f->to; - f->to = t; - } - f->nfmt += n; - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/fmtstr.c b/sys/src/cmd/unix/drawterm/libc/fmtstr.c deleted file mode 100644 index 4aa63c3b6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtstr.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -char* -fmtstrflush(Fmt *f) -{ - if(f->start == nil) - return nil; - *(char*)f->to = '\0'; - return (char*)f->start; -} diff --git a/sys/src/cmd/unix/drawterm/libc/fmtvprint.c b/sys/src/cmd/unix/drawterm/libc/fmtvprint.c deleted file mode 100644 index 313a55a19..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fmtvprint.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - - -/* - * format a string into the output buffer - * designed for formats which themselves call fmt, - * but ignore any width flags - */ -int -fmtvprint(Fmt *f, char *fmt, va_list args) -{ - va_list va; - int n; - - f->flags = 0; - f->width = 0; - f->prec = 0; - VA_COPY(va,f->args); - VA_END(f->args); - VA_COPY(f->args,args); - n = dofmt(f, fmt); - f->flags = 0; - f->width = 0; - f->prec = 0; - VA_END(f->args); - VA_COPY(f->args,va); - VA_END(va); - if(n >= 0) - return 0; - return n; -} - diff --git a/sys/src/cmd/unix/drawterm/libc/fprint.c b/sys/src/cmd/unix/drawterm/libc/fprint.c deleted file mode 100644 index 1a0fac216..000000000 --- a/sys/src/cmd/unix/drawterm/libc/fprint.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -fprint(int fd, char *fmt, ...) -{ - int n; - va_list args; - - va_start(args, fmt); - n = vfprint(fd, fmt, args); - va_end(args); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/frand.c b/sys/src/cmd/unix/drawterm/libc/frand.c deleted file mode 100644 index e13e1d860..000000000 --- a/sys/src/cmd/unix/drawterm/libc/frand.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <u.h> -#include <libc.h> - -#define MASK 0x7fffffffL -#define NORM (1.0/(1.0+MASK)) - -double -frand(void) -{ - double x; - - do { - x = lrand() * NORM; - x = (x + lrand()) * NORM; - } while(x >= 1); - return x; -} diff --git a/sys/src/cmd/unix/drawterm/libc/getfields.c b/sys/src/cmd/unix/drawterm/libc/getfields.c deleted file mode 100644 index b12c0cc2b..000000000 --- a/sys/src/cmd/unix/drawterm/libc/getfields.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -getfields(char *str, char **args, int max, int mflag, char *set) -{ - Rune r; - int nr, intok, narg; - - if(max <= 0) - return 0; - - narg = 0; - args[narg] = str; - if(!mflag) - narg++; - intok = 0; - for(;; str += nr) { - nr = chartorune(&r, str); - if(r == 0) - break; - if(utfrune(set, r)) { - if(narg >= max) - break; - *str = 0; - intok = 0; - args[narg] = str + nr; - if(!mflag) - narg++; - } else { - if(!intok && mflag) - narg++; - intok = 1; - } - } - return narg; -} diff --git a/sys/src/cmd/unix/drawterm/libc/getpid.c b/sys/src/cmd/unix/drawterm/libc/getpid.c deleted file mode 100644 index 9a9c86c13..000000000 --- a/sys/src/cmd/unix/drawterm/libc/getpid.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -getpid(void) -{ - char b[20]; - int f; - - memset(b, 0, sizeof(b)); - f = open("#c/pid", 0); - if(f >= 0) { - read(f, b, sizeof(b)); - close(f); - } - return atol(b); -} diff --git a/sys/src/cmd/unix/drawterm/libc/lnrand.c b/sys/src/cmd/unix/drawterm/libc/lnrand.c deleted file mode 100644 index 5b648d08c..000000000 --- a/sys/src/cmd/unix/drawterm/libc/lnrand.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <u.h> -#include <libc.h> - -#define MASK 0x7fffffffL - -long -lnrand(long n) -{ - long slop, v; - - if(n < 0) - return n; - slop = MASK % n; - do - v = lrand(); - while(v <= slop); - return v % n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/lock.c b/sys/src/cmd/unix/drawterm/libc/lock.c deleted file mode 100644 index 07d435256..000000000 --- a/sys/src/cmd/unix/drawterm/libc/lock.c +++ /dev/null @@ -1,120 +0,0 @@ -#include <u.h> -#include <libc.h> - -#ifdef PTHREAD - -static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER; - -static void -lockinit(Lock *lk) -{ - pthread_mutexattr_t attr; - - pthread_mutex_lock(&initmutex); - if(lk->init == 0){ - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); - pthread_mutex_init(&lk->mutex, &attr); - pthread_mutexattr_destroy(&attr); - lk->init = 1; - } - pthread_mutex_unlock(&initmutex); -} - -void -lock(Lock *lk) -{ - if(!lk->init) - lockinit(lk); - if(pthread_mutex_lock(&lk->mutex) != 0) - abort(); -} - -int -canlock(Lock *lk) -{ - int r; - - if(!lk->init) - lockinit(lk); - r = pthread_mutex_trylock(&lk->mutex); - if(r == 0) - return 1; - if(r == EBUSY) - return 0; - abort(); -} - -void -unlock(Lock *lk) -{ - if(pthread_mutex_unlock(&lk->mutex) != 0) - abort(); -} - -#else - -/* old, non-pthread systems */ - -int -canlock(Lock *lk) -{ - return !tas(&lk->key); -} - -void -lock(Lock *lk) -{ - int i; - - /* easy case */ - if(canlock(lk)) - return; - - /* for multi processor machines */ - for(i=0; i<100; i++) - if(canlock(lk)) - return; - - for(i=0; i<100; i++) { - osyield(); - if(canlock(lk)) - return; - } - - /* looking bad - make sure it is not a priority problem */ - for(i=0; i<12; i++) { - osmsleep(1<<i); - if(canlock(lk)) - return; - } - - /* we are in trouble */ - for(;;) { - if(canlock(lk)) - return; - iprint("lock loop %ld: val=%d &lock=%ux pc=%p\n", getpid(), lk->key, lk, getcallerpc(&lk)); - osmsleep(1000); - } -} - -void -unlock(Lock *lk) -{ - assert(lk->key); - lk->key = 0; -} - -#endif - -void -ilock(Lock *lk) -{ - lock(lk); -} - -void -iunlock(Lock *lk) -{ - unlock(lk); -} diff --git a/sys/src/cmd/unix/drawterm/libc/lrand.c b/sys/src/cmd/unix/drawterm/libc/lrand.c deleted file mode 100644 index 2ebb39622..000000000 --- a/sys/src/cmd/unix/drawterm/libc/lrand.c +++ /dev/null @@ -1,83 +0,0 @@ -#include <u.h> -#include <libc.h> - -/* - * algorithm by - * D. P. Mitchell & J. A. Reeds - */ - -#define LEN 607 -#define TAP 273 -#define MASK 0x7fffffffL -#define A 48271 -#define M 2147483647 -#define Q 44488 -#define R 3399 -#define NORM (1.0/(1.0+MASK)) - -static ulong rng_vec[LEN]; -static ulong* rng_tap = rng_vec; -static ulong* rng_feed = 0; -static Lock lk; - -static void -isrand(long seed) -{ - long lo, hi, x; - int i; - - rng_tap = rng_vec; - rng_feed = rng_vec+LEN-TAP; - seed = seed%M; - if(seed < 0) - seed += M; - if(seed == 0) - seed = 89482311; - x = seed; - /* - * Initialize by x[n+1] = 48271 * x[n] mod (2**31 - 1) - */ - for(i = -20; i < LEN; i++) { - hi = x / Q; - lo = x % Q; - x = A*lo - R*hi; - if(x < 0) - x += M; - if(i >= 0) - rng_vec[i] = x; - } -} - -void -srand(long seed) -{ - lock(&lk); - isrand(seed); - unlock(&lk); -} - -long -lrand(void) -{ - ulong x; - - lock(&lk); - - rng_tap--; - if(rng_tap < rng_vec) { - if(rng_feed == 0) { - isrand(1); - rng_tap--; - } - rng_tap += LEN; - } - rng_feed--; - if(rng_feed < rng_vec) - rng_feed += LEN; - x = (*rng_feed + *rng_tap) & MASK; - *rng_feed = x; - - unlock(&lk); - - return x; -} diff --git a/sys/src/cmd/unix/drawterm/libc/mallocz.c b/sys/src/cmd/unix/drawterm/libc/mallocz.c deleted file mode 100644 index 07247df58..000000000 --- a/sys/src/cmd/unix/drawterm/libc/mallocz.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <u.h> -#include <libc.h> - -void* -mallocz(ulong n, int clr) -{ - void *v; - - v = malloc(n); - if(v && clr) - memset(v, 0, n); - return v; -} diff --git a/sys/src/cmd/unix/drawterm/libc/nan.h b/sys/src/cmd/unix/drawterm/libc/nan.h deleted file mode 100644 index be78e14e5..000000000 --- a/sys/src/cmd/unix/drawterm/libc/nan.h +++ /dev/null @@ -1,4 +0,0 @@ -extern double __NaN(void); -extern double __Inf(int); -extern int __isNaN(double); -extern int __isInf(double, int); diff --git a/sys/src/cmd/unix/drawterm/libc/nan64.c b/sys/src/cmd/unix/drawterm/libc/nan64.c deleted file mode 100644 index c5e6eef17..000000000 --- a/sys/src/cmd/unix/drawterm/libc/nan64.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 64-bit IEEE not-a-number routines. - * This is big/little-endian portable assuming that - * the 64-bit doubles and 64-bit integers have the - * same byte ordering. - */ - -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -#if defined (__APPLE__) || (__powerpc__) -#define _NEEDLL -#endif - -static uvlong uvnan = ((uvlong)0x7FF00000<<32)|0x00000001; -static uvlong uvinf = ((uvlong)0x7FF00000<<32)|0x00000000; -static uvlong uvneginf = ((uvlong)0xFFF00000<<32)|0x00000000; - -double -__NaN(void) -{ - uvlong *p; - - /* gcc complains about "return *(double*)&uvnan;" */ - p = &uvnan; - return *(double*)p; -} - -int -__isNaN(double d) -{ - uvlong x; - double *p; - - p = &d; - x = *(uvlong*)p; - return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0); -} - -double -__Inf(int sign) -{ - uvlong *p; - - if(sign < 0) - p = &uvinf; - else - p = &uvneginf; - return *(double*)p; -} - -int -__isInf(double d, int sign) -{ - uvlong x; - double *p; - - p = &d; - x = *(uvlong*)p; - if(sign == 0) - return x==uvinf || x==uvneginf; - else if(sign > 0) - return x==uvinf; - else - return x==uvneginf; -} diff --git a/sys/src/cmd/unix/drawterm/libc/netmkaddr.c b/sys/src/cmd/unix/drawterm/libc/netmkaddr.c deleted file mode 100644 index fd53f4684..000000000 --- a/sys/src/cmd/unix/drawterm/libc/netmkaddr.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <ctype.h> - -/* - * make an address, add the defaults - */ -char * -netmkaddr(char *linear, char *defnet, char *defsrv) -{ - static char addr[256]; - char *cp; - - /* - * dump network name - */ - cp = strchr(linear, '!'); - if(cp == 0){ - if(defnet==0){ - if(defsrv) - snprint(addr, sizeof(addr), "net!%s!%s", - linear, defsrv); - else - snprint(addr, sizeof(addr), "net!%s", linear); - } - else { - if(defsrv) - snprint(addr, sizeof(addr), "%s!%s!%s", defnet, - linear, defsrv); - else - snprint(addr, sizeof(addr), "%s!%s", defnet, - linear); - } - return addr; - } - - /* - * if there is already a service, use it - */ - cp = strchr(cp+1, '!'); - if(cp) - return linear; - - /* - * add default service - */ - if(defsrv == 0) - return linear; - snprint(addr, sizeof(addr), "%s!%s", linear, defsrv); - - return addr; -} diff --git a/sys/src/cmd/unix/drawterm/libc/nrand.c b/sys/src/cmd/unix/drawterm/libc/nrand.c deleted file mode 100644 index 9888fb527..000000000 --- a/sys/src/cmd/unix/drawterm/libc/nrand.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <u.h> -#include <libc.h> - -#define MASK 0x7fffffffL - -int -nrand(int n) -{ - long slop, v; - - if(n < 0) - return n; - slop = MASK % n; - do - v = lrand(); - while(v <= slop); - return v % n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/nsec.c b/sys/src/cmd/unix/drawterm/libc/nsec.c deleted file mode 100644 index 0f78cefff..000000000 --- a/sys/src/cmd/unix/drawterm/libc/nsec.c +++ /dev/null @@ -1,65 +0,0 @@ -#include <u.h> -#include <libc.h> - -static uvlong order = (uvlong) 0x0001020304050607ULL; - -static void -be2vlong(vlong *to, uchar *f) -{ - uchar *t, *o; - int i; - - t = (uchar*)to; - o = (uchar*)ℴ - for(i = 0; i < 8; i++) - t[o[i]] = f[i]; -} - -/* - * After a fork with fd's copied, both fd's are pointing to - * the same Chan structure. Since the offset is kept in the Chan - * structure, the seek's and read's in the two processes can - * compete at moving the offset around. Hence the retry loop. - * - * Since the bintime version doesn't need a seek, it doesn't - * have the loop. - */ -vlong -nsec(void) -{ - char b[12+1]; - static int f = -1; - static int usebintime; - int retries; - vlong t; - - if(f < 0){ - usebintime = 1; - f = open("/dev/bintime", OREAD|OCEXEC); - if(f < 0){ - usebintime = 0; - f = open("/dev/nsec", OREAD|OCEXEC); - if(f < 0) - return 0; - } - } - - if(usebintime){ - if(read(f, b, sizeof(uvlong)) < 0) - goto error; - be2vlong(&t, (uchar*)b); - return t; - } else { - for(retries = 0; retries < 100; retries++){ - if(seek(f, 0, 0) >= 0 && read(f, b, sizeof(b)-1) >= 0){ - b[sizeof(b)-1] = 0; - return strtoll(b, 0, 0); - } - } - } - -error: - close(f); - f = -1; - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/pow10.c b/sys/src/cmd/unix/drawterm/libc/pow10.c deleted file mode 100644 index a2233ff4c..000000000 --- a/sys/src/cmd/unix/drawterm/libc/pow10.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -/* - * this table might overflow 127-bit exponent representations. - * in that case, truncate it after 1.0e38. - * it is important to get all one can from this - * routine since it is used in atof to scale numbers. - * the presumption is that C converts fp numbers better - * than multipication of lower powers of 10. - */ - -static -double tab[] = -{ - 1.0e0, 1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5, 1.0e6, 1.0e7, 1.0e8, 1.0e9, - 1.0e10,1.0e11,1.0e12,1.0e13,1.0e14,1.0e15,1.0e16,1.0e17,1.0e18,1.0e19, - 1.0e20,1.0e21,1.0e22,1.0e23,1.0e24,1.0e25,1.0e26,1.0e27,1.0e28,1.0e29, - 1.0e30,1.0e31,1.0e32,1.0e33,1.0e34,1.0e35,1.0e36,1.0e37,1.0e38,1.0e39, - 1.0e40,1.0e41,1.0e42,1.0e43,1.0e44,1.0e45,1.0e46,1.0e47,1.0e48,1.0e49, - 1.0e50,1.0e51,1.0e52,1.0e53,1.0e54,1.0e55,1.0e56,1.0e57,1.0e58,1.0e59, - 1.0e60,1.0e61,1.0e62,1.0e63,1.0e64,1.0e65,1.0e66,1.0e67,1.0e68,1.0e69, -}; - -double -__fmtpow10(int n) -{ - int m; - - if(n < 0) { - n = -n; - if(n < (int)(sizeof(tab)/sizeof(tab[0]))) - return 1/tab[n]; - m = n/2; - return __fmtpow10(-m) * __fmtpow10(m-n); - } - if(n < (int)(sizeof(tab)/sizeof(tab[0]))) - return tab[n]; - m = n/2; - return __fmtpow10(m) * __fmtpow10(n-m); -} diff --git a/sys/src/cmd/unix/drawterm/libc/print.c b/sys/src/cmd/unix/drawterm/libc/print.c deleted file mode 100644 index 90493f660..000000000 --- a/sys/src/cmd/unix/drawterm/libc/print.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -print(char *fmt, ...) -{ - int n; - va_list args; - - va_start(args, fmt); - n = vfprint(1, fmt, args); - va_end(args); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/pushssl.c b/sys/src/cmd/unix/drawterm/libc/pushssl.c deleted file mode 100644 index 8817dd1c3..000000000 --- a/sys/src/cmd/unix/drawterm/libc/pushssl.c +++ /dev/null @@ -1,44 +0,0 @@ -#include <u.h> -#include <libc.h> - -/* - * Since the SSL device uses decimal file descriptors to name channels, - * it is impossible for a user-level file server to stand in for the kernel device. - * Thus we hard-code #D rather than use /net/ssl. - */ - -int -pushssl(int fd, char *alg, char *secin, char *secout, int *cfd) -{ - char buf[8]; - char dname[64]; - int n, data, ctl; - - ctl = open("#D/ssl/clone", ORDWR); - if(ctl < 0) - return -1; - n = read(ctl, buf, sizeof(buf)-1); - if(n < 0) - goto error; - buf[n] = 0; - sprint(dname, "#D/ssl/%s/data", buf); - data = open(dname, ORDWR); - if(data < 0) - goto error; - if(fprint(ctl, "fd %d", fd) < 0 || - fprint(ctl, "secretin %s", secin) < 0 || - fprint(ctl, "secretout %s", secout) < 0 || - fprint(ctl, "alg %s", alg) < 0){ - close(data); - goto error; - } - close(fd); - if(cfd != 0) - *cfd = ctl; - else - close(ctl); - return data; -error: - close(ctl); - return -1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/pushtls.c b/sys/src/cmd/unix/drawterm/libc/pushtls.c deleted file mode 100644 index 038aad748..000000000 --- a/sys/src/cmd/unix/drawterm/libc/pushtls.c +++ /dev/null @@ -1,99 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <mp.h> -#include <libsec.h> - -enum { - TLSFinishedLen = 12, - HFinished = 20, -}; - -static int -finished(int hand, int isclient) -{ - int i, n; - uchar buf[500], buf2[500]; - - buf[0] = HFinished; - buf[1] = TLSFinishedLen>>16; - buf[2] = TLSFinishedLen>>8; - buf[3] = TLSFinishedLen; - n = TLSFinishedLen+4; - - for(i=0; i<2; i++){ - if(i==0) - memmove(buf+4, "client finished", TLSFinishedLen); - else - memmove(buf+4, "server finished", TLSFinishedLen); - if(isclient == 1-i){ - if(write(hand, buf, n) != n) - return -1; - }else{ - if(readn(hand, buf2, n) != n || memcmp(buf,buf2,n) != 0) - return -1; - } - } - return 1; -} - - -// given a plain fd and secrets established beforehand, return encrypted connection -int -pushtls(int fd, char *hashalg, char *encalg, int isclient, char *secret, char *dir) -{ - char buf[8]; - char dname[64]; - int n, data, ctl, hand; - - // open a new filter; get ctl fd - data = hand = -1; - // /net/tls uses decimal file descriptors to name channels, hence a - // user-level file server can't stand in for #a; may as well hard-code it. - ctl = open("#a/tls/clone", ORDWR); - if(ctl < 0) - goto error; - n = read(ctl, buf, sizeof(buf)-1); - if(n < 0) - goto error; - buf[n] = 0; - if(dir) - sprint(dir, "#a/tls/%s", buf); - - // get application fd - sprint(dname, "#a/tls/%s/data", buf); - data = open(dname, ORDWR); - if(data < 0) - goto error; - - // get handshake fd - sprint(dname, "#a/tls/%s/hand", buf); - hand = open(dname, ORDWR); - if(hand < 0) - goto error; - - // speak a minimal handshake - if(fprint(ctl, "fd %d 0x301", fd) < 0 || - fprint(ctl, "version 0x301") < 0 || - fprint(ctl, "secret %s %s %d %s", hashalg, encalg, isclient, secret) < 0 || - fprint(ctl, "changecipher") < 0 || - finished(hand, isclient) < 0 || - fprint(ctl, "opened") < 0){ - close(hand); - hand = -1; - goto error; - } - close(ctl); - close(hand); - close(fd); - return data; - -error: - if(data>=0) - close(data); - if(ctl>=0) - close(ctl); - if(hand>=0) - close(hand); - return -1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/rand.c b/sys/src/cmd/unix/drawterm/libc/rand.c deleted file mode 100644 index 366e9e967..000000000 --- a/sys/src/cmd/unix/drawterm/libc/rand.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -rand(void) -{ - return lrand() & 0x7fff; -} diff --git a/sys/src/cmd/unix/drawterm/libc/read9pmsg.c b/sys/src/cmd/unix/drawterm/libc/read9pmsg.c deleted file mode 100644 index 9e90ec5d6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/read9pmsg.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <fcall.h> - -int -read9pmsg(int fd, void *abuf, uint n) -{ - int m, len; - uchar *buf; - - buf = abuf; - - /* read count */ - m = readn(fd, buf, BIT32SZ); - if(m != BIT32SZ){ - if(m < 0) - return -1; - return 0; - } - - len = GBIT32(buf); - if(len <= BIT32SZ || len > n){ - werrstr("bad length in 9P2000 message header"); - return -1; - } - len -= BIT32SZ; - m = readn(fd, buf+BIT32SZ, len); - if(m < len) - return 0; - return BIT32SZ+m; -} diff --git a/sys/src/cmd/unix/drawterm/libc/readn.c b/sys/src/cmd/unix/drawterm/libc/readn.c deleted file mode 100644 index 629dfd9ed..000000000 --- a/sys/src/cmd/unix/drawterm/libc/readn.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <u.h> -#include <libc.h> - -long -readn(int f, void *av, long n) -{ - char *a; - long m, t; - - a = av; - t = 0; - while(t < n){ - m = read(f, a+t, n-t); - if(m <= 0){ - if(t == 0) - return m; - break; - } - t += m; - } - return t; -} diff --git a/sys/src/cmd/unix/drawterm/libc/rune.c b/sys/src/cmd/unix/drawterm/libc/rune.c deleted file mode 100644 index 0bb49a745..000000000 --- a/sys/src/cmd/unix/drawterm/libc/rune.c +++ /dev/null @@ -1,204 +0,0 @@ -#include <u.h> -#include <libc.h> - -enum -{ - Bit1 = 7, - Bitx = 6, - Bit2 = 5, - Bit3 = 4, - Bit4 = 3, - Bit5 = 2, - - T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */ - Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */ - T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */ - T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */ - T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */ - T5 = ((1<<(Bit5+1))-1) ^ 0xFF, /* 1111 1000 */ - - Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0000 0000 0111 1111 */ - Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0000 0000 0111 1111 1111 */ - Rune3 = (1<<(Bit3+2*Bitx))-1, /* 0000 0000 1111 1111 1111 1111 */ - Rune4 = (1<<(Bit4+3*Bitx))-1, /* 0011 1111 1111 1111 1111 1111 */ - - Maskx = (1<<Bitx)-1, /* 0011 1111 */ - Testx = Maskx ^ 0xFF, /* 1100 0000 */ - - Bad = Runeerror, -}; - -int -chartorune(Rune *rune, char *str) -{ - int c, c1, c2, c3; - long l; - - /* - * one character sequence - * 00000-0007F => T1 - */ - c = *(uchar*)str; - if(c < Tx) { - *rune = c; - return 1; - } - - /* - * two character sequence - * 0080-07FF => T2 Tx - */ - c1 = *(uchar*)(str+1) ^ Tx; - if(c1 & Testx) - goto bad; - if(c < T3) { - if(c < T2) - goto bad; - l = ((c << Bitx) | c1) & Rune2; - if(l <= Rune1) - goto bad; - *rune = l; - return 2; - } - - /* - * three character sequence - * 0800-FFFF => T3 Tx Tx - */ - c2 = *(uchar*)(str+2) ^ Tx; - if(c2 & Testx) - goto bad; - if(c < T4) { - l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3; - if(l <= Rune2) - goto bad; - *rune = l; - return 3; - } - - /* - * four character sequence - * 10000-10FFFF => T4 Tx Tx Tx - */ - if(UTFmax >= 4) { - c3 = *(uchar*)(str+3) ^ Tx; - if(c3 & Testx) - goto bad; - if(c < T5) { - l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4; - if(l <= Rune3) - goto bad; - if(l > Runemax) - goto bad; - *rune = l; - return 4; - } - } - - /* - * bad decoding - */ -bad: - *rune = Bad; - return 1; -} - -int -runetochar(char *str, Rune *rune) -{ - long c; - - c = *rune; - if(c > Runemax) - c = Runeerror; - - /* - * one character sequence - * 00000-0007F => 00-7F - */ - if(c <= Rune1) { - str[0] = c; - return 1; - } - - /* - * two character sequence - * 0080-07FF => T2 Tx - */ - if(c <= Rune2) { - str[0] = T2 | (c >> 1*Bitx); - str[1] = Tx | (c & Maskx); - return 2; - } - - /* - * three character sequence - * 0800-FFFF => T3 Tx Tx - */ - if(c <= Rune3) { - str[0] = T3 | (c >> 2*Bitx); - str[1] = Tx | ((c >> 1*Bitx) & Maskx); - str[2] = Tx | (c & Maskx); - return 3; - } - - /* - * four character sequence - * 10000-1FFFFF => T4 Tx Tx Tx - */ - str[0] = T4 | (c >> 3*Bitx); - str[1] = Tx | ((c >> 2*Bitx) & Maskx); - str[2] = Tx | ((c >> 1*Bitx) & Maskx); - str[3] = Tx | (c & Maskx); - return 4; -} - -int -runelen(long c) -{ - Rune rune; - char str[10]; - - rune = c; - return runetochar(str, &rune); -} - -int -runenlen(Rune *r, int nrune) -{ - int nb, c; - - nb = 0; - while(nrune--) { - c = *r++; - if(c <= Rune1) - nb++; - else - if(c <= Rune2) - nb += 2; - else - if(c <= Rune3 || c > Runemax) - nb += 3; - else - nb += 4; - } - return nb; -} - -int -fullrune(char *str, int n) -{ - int c; - - if(n <= 0) - return 0; - c = *(uchar*)str; - if(c < Tx) - return 1; - if(c < T3) - return n >= 2; - if(UTFmax == 3 || c < T4) - return n >= 3; - return n >= 4; -} - diff --git a/sys/src/cmd/unix/drawterm/libc/runefmtstr.c b/sys/src/cmd/unix/drawterm/libc/runefmtstr.c deleted file mode 100644 index ed39d278b..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runefmtstr.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -Rune* -runefmtstrflush(Fmt *f) -{ - if(f->start == nil) - return nil; - *(Rune*)f->to = '\0'; - return f->start; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runeseprint.c b/sys/src/cmd/unix/drawterm/libc/runeseprint.c deleted file mode 100644 index ec7d51741..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runeseprint.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -Rune* -runeseprint(Rune *buf, Rune *e, char *fmt, ...) -{ - Rune *p; - va_list args; - - va_start(args, fmt); - p = runevseprint(buf, e, fmt, args); - va_end(args); - return p; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runesmprint.c b/sys/src/cmd/unix/drawterm/libc/runesmprint.c deleted file mode 100644 index 35632ec8f..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runesmprint.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -Rune* -runesmprint(char *fmt, ...) -{ - va_list args; - Rune *p; - - va_start(args, fmt); - p = runevsmprint(fmt, args); - va_end(args); - return p; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runesnprint.c b/sys/src/cmd/unix/drawterm/libc/runesnprint.c deleted file mode 100644 index 1cb557522..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runesnprint.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -runesnprint(Rune *buf, int len, char *fmt, ...) -{ - int n; - va_list args; - - va_start(args, fmt); - n = runevsnprint(buf, len, fmt, args); - va_end(args); - return n; -} - diff --git a/sys/src/cmd/unix/drawterm/libc/runesprint.c b/sys/src/cmd/unix/drawterm/libc/runesprint.c deleted file mode 100644 index d82b2e387..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runesprint.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -runesprint(Rune *buf, char *fmt, ...) -{ - int n; - va_list args; - - va_start(args, fmt); - n = runevsnprint(buf, 256, fmt, args); - va_end(args); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrcat.c b/sys/src/cmd/unix/drawterm/libc/runestrcat.c deleted file mode 100644 index 4c8363067..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrcat.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <u.h> -#include <libc.h> - -Rune* -runestrcat(Rune *s1, Rune *s2) -{ - - runestrcpy(runestrchr(s1, 0), s2); - return s1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrchr.c b/sys/src/cmd/unix/drawterm/libc/runestrchr.c deleted file mode 100644 index af7fc4e88..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrchr.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <u.h> -#include <libc.h> - -Rune* -runestrchr(Rune *s, Rune c) -{ - Rune c0 = c; - Rune c1; - - if(c == 0) { - while(*s++) - ; - return s-1; - } - - while(c1 = *s++) - if(c1 == c0) - return s-1; - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrcmp.c b/sys/src/cmd/unix/drawterm/libc/runestrcmp.c deleted file mode 100644 index e3bda3738..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrcmp.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -runestrcmp(Rune *s1, Rune *s2) -{ - Rune c1, c2; - - for(;;) { - c1 = *s1++; - c2 = *s2++; - if(c1 != c2) { - if(c1 > c2) - return 1; - return -1; - } - if(c1 == 0) - return 0; - } -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrcpy.c b/sys/src/cmd/unix/drawterm/libc/runestrcpy.c deleted file mode 100644 index efddc0734..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrcpy.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <u.h> -#include <libc.h> - -Rune* -runestrcpy(Rune *s1, Rune *s2) -{ - Rune *os1; - - os1 = s1; - while(*s1++ = *s2++) - ; - return os1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrdup.c b/sys/src/cmd/unix/drawterm/libc/runestrdup.c deleted file mode 100644 index f66b430b6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrdup.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <u.h> -#include <libc.h> - -Rune* -runestrdup(Rune *s) -{ - Rune *ns; - - ns = malloc(sizeof(Rune)*(runestrlen(s) + 1)); - if(ns == 0) - return 0; - - return runestrcpy(ns, s); -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrecpy.c b/sys/src/cmd/unix/drawterm/libc/runestrecpy.c deleted file mode 100644 index d3ca81044..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrecpy.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <u.h> -#include <libc.h> - -Rune* -runestrecpy(Rune *s1, Rune *es1, Rune *s2) -{ - if(s1 >= es1) - return s1; - - while(*s1++ = *s2++){ - if(s1 == es1){ - *--s1 = '\0'; - break; - } - } - return s1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrlen.c b/sys/src/cmd/unix/drawterm/libc/runestrlen.c deleted file mode 100644 index 2bf4a4eb6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrlen.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <u.h> -#include <libc.h> - -long -runestrlen(Rune *s) -{ - - return runestrchr(s, 0) - s; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrncat.c b/sys/src/cmd/unix/drawterm/libc/runestrncat.c deleted file mode 100644 index 9d6ee46a6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrncat.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <u.h> -#include <libc.h> - -Rune* -runestrncat(Rune *s1, Rune *s2, long n) -{ - Rune *os1; - - os1 = s1; - s1 = runestrchr(s1, 0); - while(*s1++ = *s2++) - if(--n < 0) { - s1[-1] = 0; - break; - } - return os1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrncmp.c b/sys/src/cmd/unix/drawterm/libc/runestrncmp.c deleted file mode 100644 index 5e566fa0c..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrncmp.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -runestrncmp(Rune *s1, Rune *s2, long n) -{ - Rune c1, c2; - - while(n > 0) { - c1 = *s1++; - c2 = *s2++; - n--; - if(c1 != c2) { - if(c1 > c2) - return 1; - return -1; - } - if(c1 == 0) - break; - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrncpy.c b/sys/src/cmd/unix/drawterm/libc/runestrncpy.c deleted file mode 100644 index 7e84e33f7..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrncpy.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <u.h> -#include <libc.h> - -Rune* -runestrncpy(Rune *s1, Rune *s2, long n) -{ - int i; - Rune *os1; - - os1 = s1; - for(i = 0; i < n; i++) - if((*s1++ = *s2++) == 0) { - while(++i < n) - *s1++ = 0; - return os1; - } - return os1; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrrchr.c b/sys/src/cmd/unix/drawterm/libc/runestrrchr.c deleted file mode 100644 index 4c8074ba0..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrrchr.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <u.h> -#include <libc.h> - -Rune* -runestrrchr(Rune *s, Rune c) -{ - Rune *r; - - if(c == 0) - return runestrchr(s, 0); - r = 0; - while(s = runestrchr(s, c)) - r = s++; - return r; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runestrstr.c b/sys/src/cmd/unix/drawterm/libc/runestrstr.c deleted file mode 100644 index b7f6964b2..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runestrstr.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <u.h> -#include <libc.h> - -/* - * Return pointer to first occurrence of s2 in s1, - * 0 if none - */ -Rune* -runestrstr(Rune *s1, Rune *s2) -{ - Rune *p, *pa, *pb; - int c0, c; - - c0 = *s2; - if(c0 == 0) - return s1; - s2++; - for(p=runestrchr(s1, c0); p; p=runestrchr(p+1, c0)) { - pa = p; - for(pb=s2;; pb++) { - c = *pb; - if(c == 0) - return p; - if(c != *++pa) - break; - } - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runetype.c b/sys/src/cmd/unix/drawterm/libc/runetype.c deleted file mode 100644 index 57a2c6a38..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runetype.c +++ /dev/null @@ -1,1138 +0,0 @@ -#include <u.h> -#include <libc.h> - -/* - * alpha ranges - - * only covers ranges not in lower||upper - */ -static -Rune _alpha2[] = -{ - 0x00d8, 0x00f6, /* Ø - ö */ - 0x00f8, 0x01f5, /* ø - ǵ */ - 0x0250, 0x02a8, /* ɐ - ʨ */ - 0x038e, 0x03a1, /* Ύ - Ρ */ - 0x03a3, 0x03ce, /* Σ - ώ */ - 0x03d0, 0x03d6, /* ϐ - ϖ */ - 0x03e2, 0x03f3, /* Ϣ - ϳ */ - 0x0490, 0x04c4, /* Ґ - ӄ */ - 0x0561, 0x0587, /* ա - և */ - 0x05d0, 0x05ea, /* א - ת */ - 0x05f0, 0x05f2, /* װ - ײ */ - 0x0621, 0x063a, /* ء - غ */ - 0x0640, 0x064a, /* ـ - ي */ - 0x0671, 0x06b7, /* ٱ - ڷ */ - 0x06ba, 0x06be, /* ں - ھ */ - 0x06c0, 0x06ce, /* ۀ - ێ */ - 0x06d0, 0x06d3, /* ې - ۓ */ - 0x0905, 0x0939, /* अ - ह */ - 0x0958, 0x0961, /* क़ - ॡ */ - 0x0985, 0x098c, /* অ - ঌ */ - 0x098f, 0x0990, /* এ - ঐ */ - 0x0993, 0x09a8, /* ও - ন */ - 0x09aa, 0x09b0, /* প - র */ - 0x09b6, 0x09b9, /* শ - হ */ - 0x09dc, 0x09dd, /* ড় - ঢ় */ - 0x09df, 0x09e1, /* য় - ৡ */ - 0x09f0, 0x09f1, /* ৰ - ৱ */ - 0x0a05, 0x0a0a, /* ਅ - ਊ */ - 0x0a0f, 0x0a10, /* ਏ - ਐ */ - 0x0a13, 0x0a28, /* ਓ - ਨ */ - 0x0a2a, 0x0a30, /* ਪ - ਰ */ - 0x0a32, 0x0a33, /* ਲ - ਲ਼ */ - 0x0a35, 0x0a36, /* ਵ - ਸ਼ */ - 0x0a38, 0x0a39, /* ਸ - ਹ */ - 0x0a59, 0x0a5c, /* ਖ਼ - ੜ */ - 0x0a85, 0x0a8b, /* અ - ઋ */ - 0x0a8f, 0x0a91, /* એ - ઑ */ - 0x0a93, 0x0aa8, /* ઓ - ન */ - 0x0aaa, 0x0ab0, /* પ - ર */ - 0x0ab2, 0x0ab3, /* લ - ળ */ - 0x0ab5, 0x0ab9, /* વ - હ */ - 0x0b05, 0x0b0c, /* ଅ - ଌ */ - 0x0b0f, 0x0b10, /* ଏ - ଐ */ - 0x0b13, 0x0b28, /* ଓ - ନ */ - 0x0b2a, 0x0b30, /* ପ - ର */ - 0x0b32, 0x0b33, /* ଲ - ଳ */ - 0x0b36, 0x0b39, /* ଶ - ହ */ - 0x0b5c, 0x0b5d, /* ଡ଼ - ଢ଼ */ - 0x0b5f, 0x0b61, /* ୟ - ୡ */ - 0x0b85, 0x0b8a, /* அ - ஊ */ - 0x0b8e, 0x0b90, /* எ - ஐ */ - 0x0b92, 0x0b95, /* ஒ - க */ - 0x0b99, 0x0b9a, /* ங - ச */ - 0x0b9e, 0x0b9f, /* ஞ - ட */ - 0x0ba3, 0x0ba4, /* ண - த */ - 0x0ba8, 0x0baa, /* ந - ப */ - 0x0bae, 0x0bb5, /* ம - வ */ - 0x0bb7, 0x0bb9, /* ஷ - ஹ */ - 0x0c05, 0x0c0c, /* అ - ఌ */ - 0x0c0e, 0x0c10, /* ఎ - ఐ */ - 0x0c12, 0x0c28, /* ఒ - న */ - 0x0c2a, 0x0c33, /* ప - ళ */ - 0x0c35, 0x0c39, /* వ - హ */ - 0x0c60, 0x0c61, /* ౠ - ౡ */ - 0x0c85, 0x0c8c, /* ಅ - ಌ */ - 0x0c8e, 0x0c90, /* ಎ - ಐ */ - 0x0c92, 0x0ca8, /* ಒ - ನ */ - 0x0caa, 0x0cb3, /* ಪ - ಳ */ - 0x0cb5, 0x0cb9, /* ವ - ಹ */ - 0x0ce0, 0x0ce1, /* ೠ - ೡ */ - 0x0d05, 0x0d0c, /* അ - ഌ */ - 0x0d0e, 0x0d10, /* എ - ഐ */ - 0x0d12, 0x0d28, /* ഒ - ന */ - 0x0d2a, 0x0d39, /* പ - ഹ */ - 0x0d60, 0x0d61, /* ൠ - ൡ */ - 0x0e01, 0x0e30, /* ก - ะ */ - 0x0e32, 0x0e33, /* า - ำ */ - 0x0e40, 0x0e46, /* เ - ๆ */ - 0x0e5a, 0x0e5b, /* ๚ - ๛ */ - 0x0e81, 0x0e82, /* ກ - ຂ */ - 0x0e87, 0x0e88, /* ງ - ຈ */ - 0x0e94, 0x0e97, /* ດ - ທ */ - 0x0e99, 0x0e9f, /* ນ - ຟ */ - 0x0ea1, 0x0ea3, /* ມ - ຣ */ - 0x0eaa, 0x0eab, /* ສ - ຫ */ - 0x0ead, 0x0eae, /* ອ - ຮ */ - 0x0eb2, 0x0eb3, /* າ - ຳ */ - 0x0ec0, 0x0ec4, /* ເ - ໄ */ - 0x0edc, 0x0edd, /* ໜ - ໝ */ - 0x0f18, 0x0f19, /* ༘ - ༙ */ - 0x0f40, 0x0f47, /* ཀ - ཇ */ - 0x0f49, 0x0f69, /* ཉ - ཀྵ */ - 0x10d0, 0x10f6, /* ა - ჶ */ - 0x1100, 0x1159, /* ᄀ - ᅙ */ - 0x115f, 0x11a2, /* ᅟ - ᆢ */ - 0x11a8, 0x11f9, /* ᆨ - ᇹ */ - 0x1e00, 0x1e9b, /* Ḁ - ẛ */ - 0x1f50, 0x1f57, /* ὐ - ὗ */ - 0x1f80, 0x1fb4, /* ᾀ - ᾴ */ - 0x1fb6, 0x1fbc, /* ᾶ - ᾼ */ - 0x1fc2, 0x1fc4, /* ῂ - ῄ */ - 0x1fc6, 0x1fcc, /* ῆ - ῌ */ - 0x1fd0, 0x1fd3, /* ῐ - ΐ */ - 0x1fd6, 0x1fdb, /* ῖ - Ί */ - 0x1fe0, 0x1fec, /* ῠ - Ῥ */ - 0x1ff2, 0x1ff4, /* ῲ - ῴ */ - 0x1ff6, 0x1ffc, /* ῶ - ῼ */ - 0x210a, 0x2113, /* ℊ - ℓ */ - 0x2115, 0x211d, /* ℕ - ℝ */ - 0x2120, 0x2122, /* ℠ - ™ */ - 0x212a, 0x2131, /* K - ℱ */ - 0x2133, 0x2138, /* ℳ - ℸ */ - 0x3041, 0x3094, /* ぁ - ゔ */ - 0x30a1, 0x30fa, /* ァ - ヺ */ - 0x3105, 0x312c, /* ㄅ - ㄬ */ - 0x3131, 0x318e, /* ㄱ - ㆎ */ - 0x3192, 0x319f, /* ㆒ - ㆟ */ - 0x3260, 0x327b, /* ㉠ - ㉻ */ - 0x328a, 0x32b0, /* ㊊ - ㊰ */ - 0x32d0, 0x32fe, /* ㋐ - ㋾ */ - 0x3300, 0x3357, /* ㌀ - ㍗ */ - 0x3371, 0x3376, /* ㍱ - ㍶ */ - 0x337b, 0x3394, /* ㍻ - ㎔ */ - 0x3399, 0x339e, /* ㎙ - ㎞ */ - 0x33a9, 0x33ad, /* ㎩ - ㎭ */ - 0x33b0, 0x33c1, /* ㎰ - ㏁ */ - 0x33c3, 0x33c5, /* ㏃ - ㏅ */ - 0x33c7, 0x33d7, /* ㏇ - ㏗ */ - 0x33d9, 0x33dd, /* ㏙ - ㏝ */ - 0x4e00, 0x9fff, /* 一 - 鿿 */ - 0xac00, 0xd7a3, /* 가 - 힣 */ - 0xf900, 0xfb06, /* 豈 - st */ - 0xfb13, 0xfb17, /* ﬓ - ﬗ */ - 0xfb1f, 0xfb28, /* ײַ - ﬨ */ - 0xfb2a, 0xfb36, /* שׁ - זּ */ - 0xfb38, 0xfb3c, /* טּ - לּ */ - 0xfb40, 0xfb41, /* נּ - סּ */ - 0xfb43, 0xfb44, /* ףּ - פּ */ - 0xfb46, 0xfbb1, /* צּ - ﮱ */ - 0xfbd3, 0xfd3d, /* ﯓ - ﴽ */ - 0xfd50, 0xfd8f, /* ﵐ - ﶏ */ - 0xfd92, 0xfdc7, /* ﶒ - ﷇ */ - 0xfdf0, 0xfdf9, /* ﷰ - ﷹ */ - 0xfe70, 0xfe72, /* ﹰ - ﹲ */ - 0xfe76, 0xfefc, /* ﹶ - ﻼ */ - 0xff66, 0xff6f, /* ヲ - ッ */ - 0xff71, 0xff9d, /* ア - ン */ - 0xffa0, 0xffbe, /* ᅠ - ᄒ */ - 0xffc2, 0xffc7, /* ᅡ - ᅦ */ - 0xffca, 0xffcf, /* ᅧ - ᅬ */ - 0xffd2, 0xffd7, /* ᅭ - ᅲ */ - 0xffda, 0xffdc, /* ᅳ - ᅵ */ -}; - -/* - * alpha singlets - - * only covers ranges not in lower||upper - */ -static -Rune _alpha1[] = -{ - 0x00aa, /* ª */ - 0x00b5, /* µ */ - 0x00ba, /* º */ - 0x03da, /* Ϛ */ - 0x03dc, /* Ϝ */ - 0x03de, /* Ϟ */ - 0x03e0, /* Ϡ */ - 0x06d5, /* ە */ - 0x09b2, /* ল */ - 0x0a5e, /* ਫ਼ */ - 0x0a8d, /* ઍ */ - 0x0ae0, /* ૠ */ - 0x0b9c, /* ஜ */ - 0x0cde, /* ೞ */ - 0x0e4f, /* ๏ */ - 0x0e84, /* ຄ */ - 0x0e8a, /* ຊ */ - 0x0e8d, /* ຍ */ - 0x0ea5, /* ລ */ - 0x0ea7, /* ວ */ - 0x0eb0, /* ະ */ - 0x0ebd, /* ຽ */ - 0x1fbe, /* ι */ - 0x207f, /* ⁿ */ - 0x20a8, /* ₨ */ - 0x2102, /* ℂ */ - 0x2107, /* ℇ */ - 0x2124, /* ℤ */ - 0x2126, /* Ω */ - 0x2128, /* ℨ */ - 0xfb3e, /* מּ */ - 0xfe74, /* ﹴ */ -}; - -/* - * space ranges - */ -static -Rune _space2[] = -{ - 0x0009, 0x000a, /* tab and newline */ - 0x0020, 0x0020, /* space */ - 0x00a0, 0x00a0, /* */ - 0x2000, 0x200b, /* - */ - 0x2028, 0x2029, /*
-
*/ - 0x3000, 0x3000, /* */ - 0xfeff, 0xfeff, /* */ -}; - -/* - * lower case ranges - * 3rd col is conversion excess 500 - */ -static -Rune _toupper2[] = -{ - 0x0061, 0x007a, 468, /* a-z A-Z */ - 0x00e0, 0x00f6, 468, /* à-ö À-Ö */ - 0x00f8, 0x00fe, 468, /* ø-þ Ø-Þ */ - 0x0256, 0x0257, 295, /* ɖ-ɗ Ɖ-Ɗ */ - 0x0258, 0x0259, 298, /* ɘ-ə Ǝ-Ə */ - 0x028a, 0x028b, 283, /* ʊ-ʋ Ʊ-Ʋ */ - 0x03ad, 0x03af, 463, /* έ-ί Έ-Ί */ - 0x03b1, 0x03c1, 468, /* α-ρ Α-Ρ */ - 0x03c3, 0x03cb, 468, /* σ-ϋ Σ-Ϋ */ - 0x03cd, 0x03ce, 437, /* ύ-ώ Ύ-Ώ */ - 0x0430, 0x044f, 468, /* а-я А-Я */ - 0x0451, 0x045c, 420, /* ё-ќ Ё-Ќ */ - 0x045e, 0x045f, 420, /* ў-џ Ў-Џ */ - 0x0561, 0x0586, 452, /* ա-ֆ Ա-Ֆ */ - 0x1f00, 0x1f07, 508, /* ἀ-ἇ Ἀ-Ἇ */ - 0x1f10, 0x1f15, 508, /* ἐ-ἕ Ἐ-Ἕ */ - 0x1f20, 0x1f27, 508, /* ἠ-ἧ Ἠ-Ἧ */ - 0x1f30, 0x1f37, 508, /* ἰ-ἷ Ἰ-Ἷ */ - 0x1f40, 0x1f45, 508, /* ὀ-ὅ Ὀ-Ὅ */ - 0x1f60, 0x1f67, 508, /* ὠ-ὧ Ὠ-Ὧ */ - 0x1f70, 0x1f71, 574, /* ὰ-ά Ὰ-Ά */ - 0x1f72, 0x1f75, 586, /* ὲ-ή Ὲ-Ή */ - 0x1f76, 0x1f77, 600, /* ὶ-ί Ὶ-Ί */ - 0x1f78, 0x1f79, 628, /* ὸ-ό Ὸ-Ό */ - 0x1f7a, 0x1f7b, 612, /* ὺ-ύ Ὺ-Ύ */ - 0x1f7c, 0x1f7d, 626, /* ὼ-ώ Ὼ-Ώ */ - 0x1f80, 0x1f87, 508, /* ᾀ-ᾇ ᾈ-ᾏ */ - 0x1f90, 0x1f97, 508, /* ᾐ-ᾗ ᾘ-ᾟ */ - 0x1fa0, 0x1fa7, 508, /* ᾠ-ᾧ ᾨ-ᾯ */ - 0x1fb0, 0x1fb1, 508, /* ᾰ-ᾱ Ᾰ-Ᾱ */ - 0x1fd0, 0x1fd1, 508, /* ῐ-ῑ Ῐ-Ῑ */ - 0x1fe0, 0x1fe1, 508, /* ῠ-ῡ Ῠ-Ῡ */ - 0x2170, 0x217f, 484, /* ⅰ-ⅿ Ⅰ-Ⅿ */ - 0x24d0, 0x24e9, 474, /* ⓐ-ⓩ Ⓐ-Ⓩ */ - 0xff41, 0xff5a, 468, /* a-z A-Z */ -}; - -/* - * lower case singlets - * 2nd col is conversion excess 500 - */ -static -Rune _toupper1[] = -{ - 0x00ff, 621, /* ÿ Ÿ */ - 0x0101, 499, /* ā Ā */ - 0x0103, 499, /* ă Ă */ - 0x0105, 499, /* ą Ą */ - 0x0107, 499, /* ć Ć */ - 0x0109, 499, /* ĉ Ĉ */ - 0x010b, 499, /* ċ Ċ */ - 0x010d, 499, /* č Č */ - 0x010f, 499, /* ď Ď */ - 0x0111, 499, /* đ Đ */ - 0x0113, 499, /* ē Ē */ - 0x0115, 499, /* ĕ Ĕ */ - 0x0117, 499, /* ė Ė */ - 0x0119, 499, /* ę Ę */ - 0x011b, 499, /* ě Ě */ - 0x011d, 499, /* ĝ Ĝ */ - 0x011f, 499, /* ğ Ğ */ - 0x0121, 499, /* ġ Ġ */ - 0x0123, 499, /* ģ Ģ */ - 0x0125, 499, /* ĥ Ĥ */ - 0x0127, 499, /* ħ Ħ */ - 0x0129, 499, /* ĩ Ĩ */ - 0x012b, 499, /* ī Ī */ - 0x012d, 499, /* ĭ Ĭ */ - 0x012f, 499, /* į Į */ - 0x0131, 268, /* ı I */ - 0x0133, 499, /* ij IJ */ - 0x0135, 499, /* ĵ Ĵ */ - 0x0137, 499, /* ķ Ķ */ - 0x013a, 499, /* ĺ Ĺ */ - 0x013c, 499, /* ļ Ļ */ - 0x013e, 499, /* ľ Ľ */ - 0x0140, 499, /* ŀ Ŀ */ - 0x0142, 499, /* ł Ł */ - 0x0144, 499, /* ń Ń */ - 0x0146, 499, /* ņ Ņ */ - 0x0148, 499, /* ň Ň */ - 0x014b, 499, /* ŋ Ŋ */ - 0x014d, 499, /* ō Ō */ - 0x014f, 499, /* ŏ Ŏ */ - 0x0151, 499, /* ő Ő */ - 0x0153, 499, /* œ Œ */ - 0x0155, 499, /* ŕ Ŕ */ - 0x0157, 499, /* ŗ Ŗ */ - 0x0159, 499, /* ř Ř */ - 0x015b, 499, /* ś Ś */ - 0x015d, 499, /* ŝ Ŝ */ - 0x015f, 499, /* ş Ş */ - 0x0161, 499, /* š Š */ - 0x0163, 499, /* ţ Ţ */ - 0x0165, 499, /* ť Ť */ - 0x0167, 499, /* ŧ Ŧ */ - 0x0169, 499, /* ũ Ũ */ - 0x016b, 499, /* ū Ū */ - 0x016d, 499, /* ŭ Ŭ */ - 0x016f, 499, /* ů Ů */ - 0x0171, 499, /* ű Ű */ - 0x0173, 499, /* ų Ų */ - 0x0175, 499, /* ŵ Ŵ */ - 0x0177, 499, /* ŷ Ŷ */ - 0x017a, 499, /* ź Ź */ - 0x017c, 499, /* ż Ż */ - 0x017e, 499, /* ž Ž */ - 0x017f, 200, /* ſ S */ - 0x0183, 499, /* ƃ Ƃ */ - 0x0185, 499, /* ƅ Ƅ */ - 0x0188, 499, /* ƈ Ƈ */ - 0x018c, 499, /* ƌ Ƌ */ - 0x0192, 499, /* ƒ Ƒ */ - 0x0199, 499, /* ƙ Ƙ */ - 0x01a1, 499, /* ơ Ơ */ - 0x01a3, 499, /* ƣ Ƣ */ - 0x01a5, 499, /* ƥ Ƥ */ - 0x01a8, 499, /* ƨ Ƨ */ - 0x01ad, 499, /* ƭ Ƭ */ - 0x01b0, 499, /* ư Ư */ - 0x01b4, 499, /* ƴ Ƴ */ - 0x01b6, 499, /* ƶ Ƶ */ - 0x01b9, 499, /* ƹ Ƹ */ - 0x01bd, 499, /* ƽ Ƽ */ - 0x01c5, 499, /* Dž DŽ */ - 0x01c6, 498, /* dž DŽ */ - 0x01c8, 499, /* Lj LJ */ - 0x01c9, 498, /* lj LJ */ - 0x01cb, 499, /* Nj NJ */ - 0x01cc, 498, /* nj NJ */ - 0x01ce, 499, /* ǎ Ǎ */ - 0x01d0, 499, /* ǐ Ǐ */ - 0x01d2, 499, /* ǒ Ǒ */ - 0x01d4, 499, /* ǔ Ǔ */ - 0x01d6, 499, /* ǖ Ǖ */ - 0x01d8, 499, /* ǘ Ǘ */ - 0x01da, 499, /* ǚ Ǚ */ - 0x01dc, 499, /* ǜ Ǜ */ - 0x01df, 499, /* ǟ Ǟ */ - 0x01e1, 499, /* ǡ Ǡ */ - 0x01e3, 499, /* ǣ Ǣ */ - 0x01e5, 499, /* ǥ Ǥ */ - 0x01e7, 499, /* ǧ Ǧ */ - 0x01e9, 499, /* ǩ Ǩ */ - 0x01eb, 499, /* ǫ Ǫ */ - 0x01ed, 499, /* ǭ Ǭ */ - 0x01ef, 499, /* ǯ Ǯ */ - 0x01f2, 499, /* Dz DZ */ - 0x01f3, 498, /* dz DZ */ - 0x01f5, 499, /* ǵ Ǵ */ - 0x01fb, 499, /* ǻ Ǻ */ - 0x01fd, 499, /* ǽ Ǽ */ - 0x01ff, 499, /* ǿ Ǿ */ - 0x0201, 499, /* ȁ Ȁ */ - 0x0203, 499, /* ȃ Ȃ */ - 0x0205, 499, /* ȅ Ȅ */ - 0x0207, 499, /* ȇ Ȇ */ - 0x0209, 499, /* ȉ Ȉ */ - 0x020b, 499, /* ȋ Ȋ */ - 0x020d, 499, /* ȍ Ȍ */ - 0x020f, 499, /* ȏ Ȏ */ - 0x0211, 499, /* ȑ Ȑ */ - 0x0213, 499, /* ȓ Ȓ */ - 0x0215, 499, /* ȕ Ȕ */ - 0x0217, 499, /* ȗ Ȗ */ - 0x0253, 290, /* ɓ Ɓ */ - 0x0254, 294, /* ɔ Ɔ */ - 0x025b, 297, /* ɛ Ɛ */ - 0x0260, 295, /* ɠ Ɠ */ - 0x0263, 293, /* ɣ Ɣ */ - 0x0268, 291, /* ɨ Ɨ */ - 0x0269, 289, /* ɩ Ɩ */ - 0x026f, 289, /* ɯ Ɯ */ - 0x0272, 287, /* ɲ Ɲ */ - 0x0283, 282, /* ʃ Ʃ */ - 0x0288, 282, /* ʈ Ʈ */ - 0x0292, 281, /* ʒ Ʒ */ - 0x03ac, 462, /* ά Ά */ - 0x03cc, 436, /* ό Ό */ - 0x03d0, 438, /* ϐ Β */ - 0x03d1, 443, /* ϑ Θ */ - 0x03d5, 453, /* ϕ Φ */ - 0x03d6, 446, /* ϖ Π */ - 0x03e3, 499, /* ϣ Ϣ */ - 0x03e5, 499, /* ϥ Ϥ */ - 0x03e7, 499, /* ϧ Ϧ */ - 0x03e9, 499, /* ϩ Ϩ */ - 0x03eb, 499, /* ϫ Ϫ */ - 0x03ed, 499, /* ϭ Ϭ */ - 0x03ef, 499, /* ϯ Ϯ */ - 0x03f0, 414, /* ϰ Κ */ - 0x03f1, 420, /* ϱ Ρ */ - 0x0461, 499, /* ѡ Ѡ */ - 0x0463, 499, /* ѣ Ѣ */ - 0x0465, 499, /* ѥ Ѥ */ - 0x0467, 499, /* ѧ Ѧ */ - 0x0469, 499, /* ѩ Ѩ */ - 0x046b, 499, /* ѫ Ѫ */ - 0x046d, 499, /* ѭ Ѭ */ - 0x046f, 499, /* ѯ Ѯ */ - 0x0471, 499, /* ѱ Ѱ */ - 0x0473, 499, /* ѳ Ѳ */ - 0x0475, 499, /* ѵ Ѵ */ - 0x0477, 499, /* ѷ Ѷ */ - 0x0479, 499, /* ѹ Ѹ */ - 0x047b, 499, /* ѻ Ѻ */ - 0x047d, 499, /* ѽ Ѽ */ - 0x047f, 499, /* ѿ Ѿ */ - 0x0481, 499, /* ҁ Ҁ */ - 0x0491, 499, /* ґ Ґ */ - 0x0493, 499, /* ғ Ғ */ - 0x0495, 499, /* ҕ Ҕ */ - 0x0497, 499, /* җ Җ */ - 0x0499, 499, /* ҙ Ҙ */ - 0x049b, 499, /* қ Қ */ - 0x049d, 499, /* ҝ Ҝ */ - 0x049f, 499, /* ҟ Ҟ */ - 0x04a1, 499, /* ҡ Ҡ */ - 0x04a3, 499, /* ң Ң */ - 0x04a5, 499, /* ҥ Ҥ */ - 0x04a7, 499, /* ҧ Ҧ */ - 0x04a9, 499, /* ҩ Ҩ */ - 0x04ab, 499, /* ҫ Ҫ */ - 0x04ad, 499, /* ҭ Ҭ */ - 0x04af, 499, /* ү Ү */ - 0x04b1, 499, /* ұ Ұ */ - 0x04b3, 499, /* ҳ Ҳ */ - 0x04b5, 499, /* ҵ Ҵ */ - 0x04b7, 499, /* ҷ Ҷ */ - 0x04b9, 499, /* ҹ Ҹ */ - 0x04bb, 499, /* һ Һ */ - 0x04bd, 499, /* ҽ Ҽ */ - 0x04bf, 499, /* ҿ Ҿ */ - 0x04c2, 499, /* ӂ Ӂ */ - 0x04c4, 499, /* ӄ Ӄ */ - 0x04c8, 499, /* ӈ Ӈ */ - 0x04cc, 499, /* ӌ Ӌ */ - 0x04d1, 499, /* ӑ Ӑ */ - 0x04d3, 499, /* ӓ Ӓ */ - 0x04d5, 499, /* ӕ Ӕ */ - 0x04d7, 499, /* ӗ Ӗ */ - 0x04d9, 499, /* ә Ә */ - 0x04db, 499, /* ӛ Ӛ */ - 0x04dd, 499, /* ӝ Ӝ */ - 0x04df, 499, /* ӟ Ӟ */ - 0x04e1, 499, /* ӡ Ӡ */ - 0x04e3, 499, /* ӣ Ӣ */ - 0x04e5, 499, /* ӥ Ӥ */ - 0x04e7, 499, /* ӧ Ӧ */ - 0x04e9, 499, /* ө Ө */ - 0x04eb, 499, /* ӫ Ӫ */ - 0x04ef, 499, /* ӯ Ӯ */ - 0x04f1, 499, /* ӱ Ӱ */ - 0x04f3, 499, /* ӳ Ӳ */ - 0x04f5, 499, /* ӵ Ӵ */ - 0x04f9, 499, /* ӹ Ӹ */ - 0x1e01, 499, /* ḁ Ḁ */ - 0x1e03, 499, /* ḃ Ḃ */ - 0x1e05, 499, /* ḅ Ḅ */ - 0x1e07, 499, /* ḇ Ḇ */ - 0x1e09, 499, /* ḉ Ḉ */ - 0x1e0b, 499, /* ḋ Ḋ */ - 0x1e0d, 499, /* ḍ Ḍ */ - 0x1e0f, 499, /* ḏ Ḏ */ - 0x1e11, 499, /* ḑ Ḑ */ - 0x1e13, 499, /* ḓ Ḓ */ - 0x1e15, 499, /* ḕ Ḕ */ - 0x1e17, 499, /* ḗ Ḗ */ - 0x1e19, 499, /* ḙ Ḙ */ - 0x1e1b, 499, /* ḛ Ḛ */ - 0x1e1d, 499, /* ḝ Ḝ */ - 0x1e1f, 499, /* ḟ Ḟ */ - 0x1e21, 499, /* ḡ Ḡ */ - 0x1e23, 499, /* ḣ Ḣ */ - 0x1e25, 499, /* ḥ Ḥ */ - 0x1e27, 499, /* ḧ Ḧ */ - 0x1e29, 499, /* ḩ Ḩ */ - 0x1e2b, 499, /* ḫ Ḫ */ - 0x1e2d, 499, /* ḭ Ḭ */ - 0x1e2f, 499, /* ḯ Ḯ */ - 0x1e31, 499, /* ḱ Ḱ */ - 0x1e33, 499, /* ḳ Ḳ */ - 0x1e35, 499, /* ḵ Ḵ */ - 0x1e37, 499, /* ḷ Ḷ */ - 0x1e39, 499, /* ḹ Ḹ */ - 0x1e3b, 499, /* ḻ Ḻ */ - 0x1e3d, 499, /* ḽ Ḽ */ - 0x1e3f, 499, /* ḿ Ḿ */ - 0x1e41, 499, /* ṁ Ṁ */ - 0x1e43, 499, /* ṃ Ṃ */ - 0x1e45, 499, /* ṅ Ṅ */ - 0x1e47, 499, /* ṇ Ṇ */ - 0x1e49, 499, /* ṉ Ṉ */ - 0x1e4b, 499, /* ṋ Ṋ */ - 0x1e4d, 499, /* ṍ Ṍ */ - 0x1e4f, 499, /* ṏ Ṏ */ - 0x1e51, 499, /* ṑ Ṑ */ - 0x1e53, 499, /* ṓ Ṓ */ - 0x1e55, 499, /* ṕ Ṕ */ - 0x1e57, 499, /* ṗ Ṗ */ - 0x1e59, 499, /* ṙ Ṙ */ - 0x1e5b, 499, /* ṛ Ṛ */ - 0x1e5d, 499, /* ṝ Ṝ */ - 0x1e5f, 499, /* ṟ Ṟ */ - 0x1e61, 499, /* ṡ Ṡ */ - 0x1e63, 499, /* ṣ Ṣ */ - 0x1e65, 499, /* ṥ Ṥ */ - 0x1e67, 499, /* ṧ Ṧ */ - 0x1e69, 499, /* ṩ Ṩ */ - 0x1e6b, 499, /* ṫ Ṫ */ - 0x1e6d, 499, /* ṭ Ṭ */ - 0x1e6f, 499, /* ṯ Ṯ */ - 0x1e71, 499, /* ṱ Ṱ */ - 0x1e73, 499, /* ṳ Ṳ */ - 0x1e75, 499, /* ṵ Ṵ */ - 0x1e77, 499, /* ṷ Ṷ */ - 0x1e79, 499, /* ṹ Ṹ */ - 0x1e7b, 499, /* ṻ Ṻ */ - 0x1e7d, 499, /* ṽ Ṽ */ - 0x1e7f, 499, /* ṿ Ṿ */ - 0x1e81, 499, /* ẁ Ẁ */ - 0x1e83, 499, /* ẃ Ẃ */ - 0x1e85, 499, /* ẅ Ẅ */ - 0x1e87, 499, /* ẇ Ẇ */ - 0x1e89, 499, /* ẉ Ẉ */ - 0x1e8b, 499, /* ẋ Ẋ */ - 0x1e8d, 499, /* ẍ Ẍ */ - 0x1e8f, 499, /* ẏ Ẏ */ - 0x1e91, 499, /* ẑ Ẑ */ - 0x1e93, 499, /* ẓ Ẓ */ - 0x1e95, 499, /* ẕ Ẕ */ - 0x1ea1, 499, /* ạ Ạ */ - 0x1ea3, 499, /* ả Ả */ - 0x1ea5, 499, /* ấ Ấ */ - 0x1ea7, 499, /* ầ Ầ */ - 0x1ea9, 499, /* ẩ Ẩ */ - 0x1eab, 499, /* ẫ Ẫ */ - 0x1ead, 499, /* ậ Ậ */ - 0x1eaf, 499, /* ắ Ắ */ - 0x1eb1, 499, /* ằ Ằ */ - 0x1eb3, 499, /* ẳ Ẳ */ - 0x1eb5, 499, /* ẵ Ẵ */ - 0x1eb7, 499, /* ặ Ặ */ - 0x1eb9, 499, /* ẹ Ẹ */ - 0x1ebb, 499, /* ẻ Ẻ */ - 0x1ebd, 499, /* ẽ Ẽ */ - 0x1ebf, 499, /* ế Ế */ - 0x1ec1, 499, /* ề Ề */ - 0x1ec3, 499, /* ể Ể */ - 0x1ec5, 499, /* ễ Ễ */ - 0x1ec7, 499, /* ệ Ệ */ - 0x1ec9, 499, /* ỉ Ỉ */ - 0x1ecb, 499, /* ị Ị */ - 0x1ecd, 499, /* ọ Ọ */ - 0x1ecf, 499, /* ỏ Ỏ */ - 0x1ed1, 499, /* ố Ố */ - 0x1ed3, 499, /* ồ Ồ */ - 0x1ed5, 499, /* ổ Ổ */ - 0x1ed7, 499, /* ỗ Ỗ */ - 0x1ed9, 499, /* ộ Ộ */ - 0x1edb, 499, /* ớ Ớ */ - 0x1edd, 499, /* ờ Ờ */ - 0x1edf, 499, /* ở Ở */ - 0x1ee1, 499, /* ỡ Ỡ */ - 0x1ee3, 499, /* ợ Ợ */ - 0x1ee5, 499, /* ụ Ụ */ - 0x1ee7, 499, /* ủ Ủ */ - 0x1ee9, 499, /* ứ Ứ */ - 0x1eeb, 499, /* ừ Ừ */ - 0x1eed, 499, /* ử Ử */ - 0x1eef, 499, /* ữ Ữ */ - 0x1ef1, 499, /* ự Ự */ - 0x1ef3, 499, /* ỳ Ỳ */ - 0x1ef5, 499, /* ỵ Ỵ */ - 0x1ef7, 499, /* ỷ Ỷ */ - 0x1ef9, 499, /* ỹ Ỹ */ - 0x1f51, 508, /* ὑ Ὑ */ - 0x1f53, 508, /* ὓ Ὓ */ - 0x1f55, 508, /* ὕ Ὕ */ - 0x1f57, 508, /* ὗ Ὗ */ - 0x1fb3, 509, /* ᾳ ᾼ */ - 0x1fc3, 509, /* ῃ ῌ */ - 0x1fe5, 507, /* ῥ Ῥ */ - 0x1ff3, 509, /* ῳ ῼ */ -}; - -/* - * upper case ranges - * 3rd col is conversion excess 500 - */ -static -Rune _tolower2[] = -{ - 0x0041, 0x005a, 532, /* A-Z a-z */ - 0x00c0, 0x00d6, 532, /* À-Ö à-ö */ - 0x00d8, 0x00de, 532, /* Ø-Þ ø-þ */ - 0x0189, 0x018a, 705, /* Ɖ-Ɗ ɖ-ɗ */ - 0x018e, 0x018f, 702, /* Ǝ-Ə ɘ-ə */ - 0x01b1, 0x01b2, 717, /* Ʊ-Ʋ ʊ-ʋ */ - 0x0388, 0x038a, 537, /* Έ-Ί έ-ί */ - 0x038e, 0x038f, 563, /* Ύ-Ώ ύ-ώ */ - 0x0391, 0x03a1, 532, /* Α-Ρ α-ρ */ - 0x03a3, 0x03ab, 532, /* Σ-Ϋ σ-ϋ */ - 0x0401, 0x040c, 580, /* Ё-Ќ ё-ќ */ - 0x040e, 0x040f, 580, /* Ў-Џ ў-џ */ - 0x0410, 0x042f, 532, /* А-Я а-я */ - 0x0531, 0x0556, 548, /* Ա-Ֆ ա-ֆ */ - 0x10a0, 0x10c5, 548, /* Ⴀ-Ⴥ ა-ჵ */ - 0x1f08, 0x1f0f, 492, /* Ἀ-Ἇ ἀ-ἇ */ - 0x1f18, 0x1f1d, 492, /* Ἐ-Ἕ ἐ-ἕ */ - 0x1f28, 0x1f2f, 492, /* Ἠ-Ἧ ἠ-ἧ */ - 0x1f38, 0x1f3f, 492, /* Ἰ-Ἷ ἰ-ἷ */ - 0x1f48, 0x1f4d, 492, /* Ὀ-Ὅ ὀ-ὅ */ - 0x1f68, 0x1f6f, 492, /* Ὠ-Ὧ ὠ-ὧ */ - 0x1f88, 0x1f8f, 492, /* ᾈ-ᾏ ᾀ-ᾇ */ - 0x1f98, 0x1f9f, 492, /* ᾘ-ᾟ ᾐ-ᾗ */ - 0x1fa8, 0x1faf, 492, /* ᾨ-ᾯ ᾠ-ᾧ */ - 0x1fb8, 0x1fb9, 492, /* Ᾰ-Ᾱ ᾰ-ᾱ */ - 0x1fba, 0x1fbb, 426, /* Ὰ-Ά ὰ-ά */ - 0x1fc8, 0x1fcb, 414, /* Ὲ-Ή ὲ-ή */ - 0x1fd8, 0x1fd9, 492, /* Ῐ-Ῑ ῐ-ῑ */ - 0x1fda, 0x1fdb, 400, /* Ὶ-Ί ὶ-ί */ - 0x1fe8, 0x1fe9, 492, /* Ῠ-Ῡ ῠ-ῡ */ - 0x1fea, 0x1feb, 388, /* Ὺ-Ύ ὺ-ύ */ - 0x1ff8, 0x1ff9, 372, /* Ὸ-Ό ὸ-ό */ - 0x1ffa, 0x1ffb, 374, /* Ὼ-Ώ ὼ-ώ */ - 0x2160, 0x216f, 516, /* Ⅰ-Ⅿ ⅰ-ⅿ */ - 0x24b6, 0x24cf, 526, /* Ⓐ-Ⓩ ⓐ-ⓩ */ - 0xff21, 0xff3a, 532, /* A-Z a-z */ -}; - -/* - * upper case singlets - * 2nd col is conversion excess 500 - */ -static -Rune _tolower1[] = -{ - 0x0100, 501, /* Ā ā */ - 0x0102, 501, /* Ă ă */ - 0x0104, 501, /* Ą ą */ - 0x0106, 501, /* Ć ć */ - 0x0108, 501, /* Ĉ ĉ */ - 0x010a, 501, /* Ċ ċ */ - 0x010c, 501, /* Č č */ - 0x010e, 501, /* Ď ď */ - 0x0110, 501, /* Đ đ */ - 0x0112, 501, /* Ē ē */ - 0x0114, 501, /* Ĕ ĕ */ - 0x0116, 501, /* Ė ė */ - 0x0118, 501, /* Ę ę */ - 0x011a, 501, /* Ě ě */ - 0x011c, 501, /* Ĝ ĝ */ - 0x011e, 501, /* Ğ ğ */ - 0x0120, 501, /* Ġ ġ */ - 0x0122, 501, /* Ģ ģ */ - 0x0124, 501, /* Ĥ ĥ */ - 0x0126, 501, /* Ħ ħ */ - 0x0128, 501, /* Ĩ ĩ */ - 0x012a, 501, /* Ī ī */ - 0x012c, 501, /* Ĭ ĭ */ - 0x012e, 501, /* Į į */ - 0x0130, 301, /* İ i */ - 0x0132, 501, /* IJ ij */ - 0x0134, 501, /* Ĵ ĵ */ - 0x0136, 501, /* Ķ ķ */ - 0x0139, 501, /* Ĺ ĺ */ - 0x013b, 501, /* Ļ ļ */ - 0x013d, 501, /* Ľ ľ */ - 0x013f, 501, /* Ŀ ŀ */ - 0x0141, 501, /* Ł ł */ - 0x0143, 501, /* Ń ń */ - 0x0145, 501, /* Ņ ņ */ - 0x0147, 501, /* Ň ň */ - 0x014a, 501, /* Ŋ ŋ */ - 0x014c, 501, /* Ō ō */ - 0x014e, 501, /* Ŏ ŏ */ - 0x0150, 501, /* Ő ő */ - 0x0152, 501, /* Œ œ */ - 0x0154, 501, /* Ŕ ŕ */ - 0x0156, 501, /* Ŗ ŗ */ - 0x0158, 501, /* Ř ř */ - 0x015a, 501, /* Ś ś */ - 0x015c, 501, /* Ŝ ŝ */ - 0x015e, 501, /* Ş ş */ - 0x0160, 501, /* Š š */ - 0x0162, 501, /* Ţ ţ */ - 0x0164, 501, /* Ť ť */ - 0x0166, 501, /* Ŧ ŧ */ - 0x0168, 501, /* Ũ ũ */ - 0x016a, 501, /* Ū ū */ - 0x016c, 501, /* Ŭ ŭ */ - 0x016e, 501, /* Ů ů */ - 0x0170, 501, /* Ű ű */ - 0x0172, 501, /* Ų ų */ - 0x0174, 501, /* Ŵ ŵ */ - 0x0176, 501, /* Ŷ ŷ */ - 0x0178, 379, /* Ÿ ÿ */ - 0x0179, 501, /* Ź ź */ - 0x017b, 501, /* Ż ż */ - 0x017d, 501, /* Ž ž */ - 0x0181, 710, /* Ɓ ɓ */ - 0x0182, 501, /* Ƃ ƃ */ - 0x0184, 501, /* Ƅ ƅ */ - 0x0186, 706, /* Ɔ ɔ */ - 0x0187, 501, /* Ƈ ƈ */ - 0x018b, 501, /* Ƌ ƌ */ - 0x0190, 703, /* Ɛ ɛ */ - 0x0191, 501, /* Ƒ ƒ */ - 0x0193, 705, /* Ɠ ɠ */ - 0x0194, 707, /* Ɣ ɣ */ - 0x0196, 711, /* Ɩ ɩ */ - 0x0197, 709, /* Ɨ ɨ */ - 0x0198, 501, /* Ƙ ƙ */ - 0x019c, 711, /* Ɯ ɯ */ - 0x019d, 713, /* Ɲ ɲ */ - 0x01a0, 501, /* Ơ ơ */ - 0x01a2, 501, /* Ƣ ƣ */ - 0x01a4, 501, /* Ƥ ƥ */ - 0x01a7, 501, /* Ƨ ƨ */ - 0x01a9, 718, /* Ʃ ʃ */ - 0x01ac, 501, /* Ƭ ƭ */ - 0x01ae, 718, /* Ʈ ʈ */ - 0x01af, 501, /* Ư ư */ - 0x01b3, 501, /* Ƴ ƴ */ - 0x01b5, 501, /* Ƶ ƶ */ - 0x01b7, 719, /* Ʒ ʒ */ - 0x01b8, 501, /* Ƹ ƹ */ - 0x01bc, 501, /* Ƽ ƽ */ - 0x01c4, 502, /* DŽ dž */ - 0x01c5, 501, /* Dž dž */ - 0x01c7, 502, /* LJ lj */ - 0x01c8, 501, /* Lj lj */ - 0x01ca, 502, /* NJ nj */ - 0x01cb, 501, /* Nj nj */ - 0x01cd, 501, /* Ǎ ǎ */ - 0x01cf, 501, /* Ǐ ǐ */ - 0x01d1, 501, /* Ǒ ǒ */ - 0x01d3, 501, /* Ǔ ǔ */ - 0x01d5, 501, /* Ǖ ǖ */ - 0x01d7, 501, /* Ǘ ǘ */ - 0x01d9, 501, /* Ǚ ǚ */ - 0x01db, 501, /* Ǜ ǜ */ - 0x01de, 501, /* Ǟ ǟ */ - 0x01e0, 501, /* Ǡ ǡ */ - 0x01e2, 501, /* Ǣ ǣ */ - 0x01e4, 501, /* Ǥ ǥ */ - 0x01e6, 501, /* Ǧ ǧ */ - 0x01e8, 501, /* Ǩ ǩ */ - 0x01ea, 501, /* Ǫ ǫ */ - 0x01ec, 501, /* Ǭ ǭ */ - 0x01ee, 501, /* Ǯ ǯ */ - 0x01f1, 502, /* DZ dz */ - 0x01f2, 501, /* Dz dz */ - 0x01f4, 501, /* Ǵ ǵ */ - 0x01fa, 501, /* Ǻ ǻ */ - 0x01fc, 501, /* Ǽ ǽ */ - 0x01fe, 501, /* Ǿ ǿ */ - 0x0200, 501, /* Ȁ ȁ */ - 0x0202, 501, /* Ȃ ȃ */ - 0x0204, 501, /* Ȅ ȅ */ - 0x0206, 501, /* Ȇ ȇ */ - 0x0208, 501, /* Ȉ ȉ */ - 0x020a, 501, /* Ȋ ȋ */ - 0x020c, 501, /* Ȍ ȍ */ - 0x020e, 501, /* Ȏ ȏ */ - 0x0210, 501, /* Ȑ ȑ */ - 0x0212, 501, /* Ȓ ȓ */ - 0x0214, 501, /* Ȕ ȕ */ - 0x0216, 501, /* Ȗ ȗ */ - 0x0386, 538, /* Ά ά */ - 0x038c, 564, /* Ό ό */ - 0x03e2, 501, /* Ϣ ϣ */ - 0x03e4, 501, /* Ϥ ϥ */ - 0x03e6, 501, /* Ϧ ϧ */ - 0x03e8, 501, /* Ϩ ϩ */ - 0x03ea, 501, /* Ϫ ϫ */ - 0x03ec, 501, /* Ϭ ϭ */ - 0x03ee, 501, /* Ϯ ϯ */ - 0x0460, 501, /* Ѡ ѡ */ - 0x0462, 501, /* Ѣ ѣ */ - 0x0464, 501, /* Ѥ ѥ */ - 0x0466, 501, /* Ѧ ѧ */ - 0x0468, 501, /* Ѩ ѩ */ - 0x046a, 501, /* Ѫ ѫ */ - 0x046c, 501, /* Ѭ ѭ */ - 0x046e, 501, /* Ѯ ѯ */ - 0x0470, 501, /* Ѱ ѱ */ - 0x0472, 501, /* Ѳ ѳ */ - 0x0474, 501, /* Ѵ ѵ */ - 0x0476, 501, /* Ѷ ѷ */ - 0x0478, 501, /* Ѹ ѹ */ - 0x047a, 501, /* Ѻ ѻ */ - 0x047c, 501, /* Ѽ ѽ */ - 0x047e, 501, /* Ѿ ѿ */ - 0x0480, 501, /* Ҁ ҁ */ - 0x0490, 501, /* Ґ ґ */ - 0x0492, 501, /* Ғ ғ */ - 0x0494, 501, /* Ҕ ҕ */ - 0x0496, 501, /* Җ җ */ - 0x0498, 501, /* Ҙ ҙ */ - 0x049a, 501, /* Қ қ */ - 0x049c, 501, /* Ҝ ҝ */ - 0x049e, 501, /* Ҟ ҟ */ - 0x04a0, 501, /* Ҡ ҡ */ - 0x04a2, 501, /* Ң ң */ - 0x04a4, 501, /* Ҥ ҥ */ - 0x04a6, 501, /* Ҧ ҧ */ - 0x04a8, 501, /* Ҩ ҩ */ - 0x04aa, 501, /* Ҫ ҫ */ - 0x04ac, 501, /* Ҭ ҭ */ - 0x04ae, 501, /* Ү ү */ - 0x04b0, 501, /* Ұ ұ */ - 0x04b2, 501, /* Ҳ ҳ */ - 0x04b4, 501, /* Ҵ ҵ */ - 0x04b6, 501, /* Ҷ ҷ */ - 0x04b8, 501, /* Ҹ ҹ */ - 0x04ba, 501, /* Һ һ */ - 0x04bc, 501, /* Ҽ ҽ */ - 0x04be, 501, /* Ҿ ҿ */ - 0x04c1, 501, /* Ӂ ӂ */ - 0x04c3, 501, /* Ӄ ӄ */ - 0x04c7, 501, /* Ӈ ӈ */ - 0x04cb, 501, /* Ӌ ӌ */ - 0x04d0, 501, /* Ӑ ӑ */ - 0x04d2, 501, /* Ӓ ӓ */ - 0x04d4, 501, /* Ӕ ӕ */ - 0x04d6, 501, /* Ӗ ӗ */ - 0x04d8, 501, /* Ә ә */ - 0x04da, 501, /* Ӛ ӛ */ - 0x04dc, 501, /* Ӝ ӝ */ - 0x04de, 501, /* Ӟ ӟ */ - 0x04e0, 501, /* Ӡ ӡ */ - 0x04e2, 501, /* Ӣ ӣ */ - 0x04e4, 501, /* Ӥ ӥ */ - 0x04e6, 501, /* Ӧ ӧ */ - 0x04e8, 501, /* Ө ө */ - 0x04ea, 501, /* Ӫ ӫ */ - 0x04ee, 501, /* Ӯ ӯ */ - 0x04f0, 501, /* Ӱ ӱ */ - 0x04f2, 501, /* Ӳ ӳ */ - 0x04f4, 501, /* Ӵ ӵ */ - 0x04f8, 501, /* Ӹ ӹ */ - 0x1e00, 501, /* Ḁ ḁ */ - 0x1e02, 501, /* Ḃ ḃ */ - 0x1e04, 501, /* Ḅ ḅ */ - 0x1e06, 501, /* Ḇ ḇ */ - 0x1e08, 501, /* Ḉ ḉ */ - 0x1e0a, 501, /* Ḋ ḋ */ - 0x1e0c, 501, /* Ḍ ḍ */ - 0x1e0e, 501, /* Ḏ ḏ */ - 0x1e10, 501, /* Ḑ ḑ */ - 0x1e12, 501, /* Ḓ ḓ */ - 0x1e14, 501, /* Ḕ ḕ */ - 0x1e16, 501, /* Ḗ ḗ */ - 0x1e18, 501, /* Ḙ ḙ */ - 0x1e1a, 501, /* Ḛ ḛ */ - 0x1e1c, 501, /* Ḝ ḝ */ - 0x1e1e, 501, /* Ḟ ḟ */ - 0x1e20, 501, /* Ḡ ḡ */ - 0x1e22, 501, /* Ḣ ḣ */ - 0x1e24, 501, /* Ḥ ḥ */ - 0x1e26, 501, /* Ḧ ḧ */ - 0x1e28, 501, /* Ḩ ḩ */ - 0x1e2a, 501, /* Ḫ ḫ */ - 0x1e2c, 501, /* Ḭ ḭ */ - 0x1e2e, 501, /* Ḯ ḯ */ - 0x1e30, 501, /* Ḱ ḱ */ - 0x1e32, 501, /* Ḳ ḳ */ - 0x1e34, 501, /* Ḵ ḵ */ - 0x1e36, 501, /* Ḷ ḷ */ - 0x1e38, 501, /* Ḹ ḹ */ - 0x1e3a, 501, /* Ḻ ḻ */ - 0x1e3c, 501, /* Ḽ ḽ */ - 0x1e3e, 501, /* Ḿ ḿ */ - 0x1e40, 501, /* Ṁ ṁ */ - 0x1e42, 501, /* Ṃ ṃ */ - 0x1e44, 501, /* Ṅ ṅ */ - 0x1e46, 501, /* Ṇ ṇ */ - 0x1e48, 501, /* Ṉ ṉ */ - 0x1e4a, 501, /* Ṋ ṋ */ - 0x1e4c, 501, /* Ṍ ṍ */ - 0x1e4e, 501, /* Ṏ ṏ */ - 0x1e50, 501, /* Ṑ ṑ */ - 0x1e52, 501, /* Ṓ ṓ */ - 0x1e54, 501, /* Ṕ ṕ */ - 0x1e56, 501, /* Ṗ ṗ */ - 0x1e58, 501, /* Ṙ ṙ */ - 0x1e5a, 501, /* Ṛ ṛ */ - 0x1e5c, 501, /* Ṝ ṝ */ - 0x1e5e, 501, /* Ṟ ṟ */ - 0x1e60, 501, /* Ṡ ṡ */ - 0x1e62, 501, /* Ṣ ṣ */ - 0x1e64, 501, /* Ṥ ṥ */ - 0x1e66, 501, /* Ṧ ṧ */ - 0x1e68, 501, /* Ṩ ṩ */ - 0x1e6a, 501, /* Ṫ ṫ */ - 0x1e6c, 501, /* Ṭ ṭ */ - 0x1e6e, 501, /* Ṯ ṯ */ - 0x1e70, 501, /* Ṱ ṱ */ - 0x1e72, 501, /* Ṳ ṳ */ - 0x1e74, 501, /* Ṵ ṵ */ - 0x1e76, 501, /* Ṷ ṷ */ - 0x1e78, 501, /* Ṹ ṹ */ - 0x1e7a, 501, /* Ṻ ṻ */ - 0x1e7c, 501, /* Ṽ ṽ */ - 0x1e7e, 501, /* Ṿ ṿ */ - 0x1e80, 501, /* Ẁ ẁ */ - 0x1e82, 501, /* Ẃ ẃ */ - 0x1e84, 501, /* Ẅ ẅ */ - 0x1e86, 501, /* Ẇ ẇ */ - 0x1e88, 501, /* Ẉ ẉ */ - 0x1e8a, 501, /* Ẋ ẋ */ - 0x1e8c, 501, /* Ẍ ẍ */ - 0x1e8e, 501, /* Ẏ ẏ */ - 0x1e90, 501, /* Ẑ ẑ */ - 0x1e92, 501, /* Ẓ ẓ */ - 0x1e94, 501, /* Ẕ ẕ */ - 0x1ea0, 501, /* Ạ ạ */ - 0x1ea2, 501, /* Ả ả */ - 0x1ea4, 501, /* Ấ ấ */ - 0x1ea6, 501, /* Ầ ầ */ - 0x1ea8, 501, /* Ẩ ẩ */ - 0x1eaa, 501, /* Ẫ ẫ */ - 0x1eac, 501, /* Ậ ậ */ - 0x1eae, 501, /* Ắ ắ */ - 0x1eb0, 501, /* Ằ ằ */ - 0x1eb2, 501, /* Ẳ ẳ */ - 0x1eb4, 501, /* Ẵ ẵ */ - 0x1eb6, 501, /* Ặ ặ */ - 0x1eb8, 501, /* Ẹ ẹ */ - 0x1eba, 501, /* Ẻ ẻ */ - 0x1ebc, 501, /* Ẽ ẽ */ - 0x1ebe, 501, /* Ế ế */ - 0x1ec0, 501, /* Ề ề */ - 0x1ec2, 501, /* Ể ể */ - 0x1ec4, 501, /* Ễ ễ */ - 0x1ec6, 501, /* Ệ ệ */ - 0x1ec8, 501, /* Ỉ ỉ */ - 0x1eca, 501, /* Ị ị */ - 0x1ecc, 501, /* Ọ ọ */ - 0x1ece, 501, /* Ỏ ỏ */ - 0x1ed0, 501, /* Ố ố */ - 0x1ed2, 501, /* Ồ ồ */ - 0x1ed4, 501, /* Ổ ổ */ - 0x1ed6, 501, /* Ỗ ỗ */ - 0x1ed8, 501, /* Ộ ộ */ - 0x1eda, 501, /* Ớ ớ */ - 0x1edc, 501, /* Ờ ờ */ - 0x1ede, 501, /* Ở ở */ - 0x1ee0, 501, /* Ỡ ỡ */ - 0x1ee2, 501, /* Ợ ợ */ - 0x1ee4, 501, /* Ụ ụ */ - 0x1ee6, 501, /* Ủ ủ */ - 0x1ee8, 501, /* Ứ ứ */ - 0x1eea, 501, /* Ừ ừ */ - 0x1eec, 501, /* Ử ử */ - 0x1eee, 501, /* Ữ ữ */ - 0x1ef0, 501, /* Ự ự */ - 0x1ef2, 501, /* Ỳ ỳ */ - 0x1ef4, 501, /* Ỵ ỵ */ - 0x1ef6, 501, /* Ỷ ỷ */ - 0x1ef8, 501, /* Ỹ ỹ */ - 0x1f59, 492, /* Ὑ ὑ */ - 0x1f5b, 492, /* Ὓ ὓ */ - 0x1f5d, 492, /* Ὕ ὕ */ - 0x1f5f, 492, /* Ὗ ὗ */ - 0x1fbc, 491, /* ᾼ ᾳ */ - 0x1fcc, 491, /* ῌ ῃ */ - 0x1fec, 493, /* Ῥ ῥ */ - 0x1ffc, 491, /* ῼ ῳ */ -}; - -/* - * title characters are those between - * upper and lower case. ie DZ Dz dz - */ -static -Rune _totitle1[] = -{ - 0x01c4, 501, /* DŽ Dž */ - 0x01c6, 499, /* dž Dž */ - 0x01c7, 501, /* LJ Lj */ - 0x01c9, 499, /* lj Lj */ - 0x01ca, 501, /* NJ Nj */ - 0x01cc, 499, /* nj Nj */ - 0x01f1, 501, /* DZ Dz */ - 0x01f3, 499, /* dz Dz */ -}; - -#define bsearch xbsearch -static -Rune* -bsearch(Rune c, Rune *t, int n, int ne) -{ - Rune *p; - int m; - - while(n > 1) { - m = n/2; - p = t + m*ne; - if(c >= p[0]) { - t = p; - n = n-m; - } else - n = m; - } - if(n && c >= t[0]) - return t; - return 0; -} - -Rune -tolowerrune(Rune c) -{ - Rune *p; - - p = bsearch(c, _tolower2, nelem(_tolower2)/3, 3); - if(p && c >= p[0] && c <= p[1]) - return c + p[2] - 500; - p = bsearch(c, _tolower1, nelem(_tolower1)/2, 2); - if(p && c == p[0]) - return c + p[1] - 500; - return c; -} - -Rune -toupperrune(Rune c) -{ - Rune *p; - - p = bsearch(c, _toupper2, nelem(_toupper2)/3, 3); - if(p && c >= p[0] && c <= p[1]) - return c + p[2] - 500; - p = bsearch(c, _toupper1, nelem(_toupper1)/2, 2); - if(p && c == p[0]) - return c + p[1] - 500; - return c; -} - -Rune -totitlerune(Rune c) -{ - Rune *p; - - p = bsearch(c, _totitle1, nelem(_totitle1)/2, 2); - if(p && c == p[0]) - return c + p[1] - 500; - return c; -} - -int -islowerrune(Rune c) -{ - Rune *p; - - p = bsearch(c, _toupper2, nelem(_toupper2)/3, 3); - if(p && c >= p[0] && c <= p[1]) - return 1; - p = bsearch(c, _toupper1, nelem(_toupper1)/2, 2); - if(p && c == p[0]) - return 1; - return 0; -} - -int -isupperrune(Rune c) -{ - Rune *p; - - p = bsearch(c, _tolower2, nelem(_tolower2)/3, 3); - if(p && c >= p[0] && c <= p[1]) - return 1; - p = bsearch(c, _tolower1, nelem(_tolower1)/2, 2); - if(p && c == p[0]) - return 1; - return 0; -} - -int -isalpharune(Rune c) -{ - Rune *p; - - if(isupperrune(c) || islowerrune(c)) - return 1; - p = bsearch(c, _alpha2, nelem(_alpha2)/2, 2); - if(p && c >= p[0] && c <= p[1]) - return 1; - p = bsearch(c, _alpha1, nelem(_alpha1), 1); - if(p && c == p[0]) - return 1; - return 0; -} - -int -istitlerune(Rune c) -{ - return isupperrune(c) && islowerrune(c); -} - -int -isspacerune(Rune c) -{ - Rune *p; - - p = bsearch(c, _space2, nelem(_space2)/2, 2); - if(p && c >= p[0] && c <= p[1]) - return 1; - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runevseprint.c b/sys/src/cmd/unix/drawterm/libc/runevseprint.c deleted file mode 100644 index 144a357e4..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runevseprint.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -Rune* -runevseprint(Rune *buf, Rune *e, char *fmt, va_list args) -{ - Fmt f; - - if(e <= buf) - return nil; - f.runes = 1; - f.start = buf; - f.to = buf; - f.stop = e - 1; - f.flush = 0; - f.farg = nil; - f.nfmt = 0; - VA_COPY(f.args,args); - dofmt(&f, fmt); - VA_END(f.args); - *(Rune*)f.to = '\0'; - return (Rune*)f.to; -} - diff --git a/sys/src/cmd/unix/drawterm/libc/runevsmprint.c b/sys/src/cmd/unix/drawterm/libc/runevsmprint.c deleted file mode 100644 index 6d391e2f6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runevsmprint.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -static int -runeFmtStrFlush(Fmt *f) -{ - Rune *s; - int n; - - if(f->start == nil) - return 0; - n = (uintptr)f->farg; - n *= 2; - s = (Rune*)f->start; - f->start = realloc(s, sizeof(Rune)*n); - if(f->start == nil){ - f->farg = nil; - f->to = nil; - f->stop = nil; - free(s); - return 0; - } - f->farg = (void*)(uintptr)n; - f->to = (Rune*)f->start + ((Rune*)f->to - s); - f->stop = (Rune*)f->start + n - 1; - return 1; -} - -int -runefmtstrinit(Fmt *f) -{ - int n; - - memset(f, 0, sizeof *f); - f->runes = 1; - n = 32; - f->start = malloc(sizeof(Rune)*n); - if(f->start == nil) - return -1; - f->to = f->start; - f->stop = (Rune*)f->start + n - 1; - f->flush = runeFmtStrFlush; - f->farg = (void*)(uintptr)n; - f->nfmt = 0; - return 0; -} - -/* - * print into an allocated string buffer - */ -Rune* -runevsmprint(char *fmt, va_list args) -{ - Fmt f; - int n; - - if(runefmtstrinit(&f) < 0) - return nil; - VA_COPY(f.args,args); - n = dofmt(&f, fmt); - VA_END(f.args); - if(f.start == nil) - return nil; - if(n < 0){ - free(f.start); - return nil; - } - *(Rune*)f.to = '\0'; - return (Rune*)f.start; -} diff --git a/sys/src/cmd/unix/drawterm/libc/runevsnprint.c b/sys/src/cmd/unix/drawterm/libc/runevsnprint.c deleted file mode 100644 index 0a5681a93..000000000 --- a/sys/src/cmd/unix/drawterm/libc/runevsnprint.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -runevsnprint(Rune *buf, int len, char *fmt, va_list args) -{ - Fmt f; - - if(len <= 0) - return -1; - f.runes = 1; - f.start = buf; - f.to = buf; - f.stop = buf + len - 1; - f.flush = 0; - f.farg = nil; - f.nfmt = 0; - VA_COPY(f.args,args); - dofmt(&f, fmt); - VA_END(f.args); - *(Rune*)f.to = '\0'; - return (Rune*)f.to - buf; -} diff --git a/sys/src/cmd/unix/drawterm/libc/seprint.c b/sys/src/cmd/unix/drawterm/libc/seprint.c deleted file mode 100644 index e97209bb5..000000000 --- a/sys/src/cmd/unix/drawterm/libc/seprint.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -char* -seprint(char *buf, char *e, char *fmt, ...) -{ - char *p; - va_list args; - - va_start(args, fmt); - p = vseprint(buf, e, fmt, args); - va_end(args); - return p; -} diff --git a/sys/src/cmd/unix/drawterm/libc/smprint.c b/sys/src/cmd/unix/drawterm/libc/smprint.c deleted file mode 100644 index cfdf92cd6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/smprint.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -char* -smprint(char *fmt, ...) -{ - va_list args; - char *p; - - va_start(args, fmt); - p = vsmprint(fmt, args); - va_end(args); - return p; -} diff --git a/sys/src/cmd/unix/drawterm/libc/snprint.c b/sys/src/cmd/unix/drawterm/libc/snprint.c deleted file mode 100644 index fafa11752..000000000 --- a/sys/src/cmd/unix/drawterm/libc/snprint.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -snprint(char *buf, int len, char *fmt, ...) -{ - int n; - va_list args; - - va_start(args, fmt); - n = vsnprint(buf, len, fmt, args); - va_end(args); - return n; -} - diff --git a/sys/src/cmd/unix/drawterm/libc/sprint.c b/sys/src/cmd/unix/drawterm/libc/sprint.c deleted file mode 100644 index 3c3c68791..000000000 --- a/sys/src/cmd/unix/drawterm/libc/sprint.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -sprint(char *buf, char *fmt, ...) -{ - int n; - uint len; - va_list args; - - len = 1<<30; /* big number, but sprint is deprecated anyway */ - /* - * on PowerPC, the stack is near the top of memory, so - * we must be sure not to overflow a 32-bit pointer. - */ - if((uintptr)buf+len < (uintptr)buf) - len = -(uintptr)buf-1; - - va_start(args, fmt); - n = vsnprint(buf, len, fmt, args); - va_end(args); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/strecpy.c b/sys/src/cmd/unix/drawterm/libc/strecpy.c deleted file mode 100644 index a44dffdd8..000000000 --- a/sys/src/cmd/unix/drawterm/libc/strecpy.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <u.h> -#include <libc.h> - -char* -strecpy(char *to, char *e, char *from) -{ - if(to >= e) - return to; - to = memccpy(to, from, '\0', e - to); - if(to == nil){ - to = e - 1; - *to = '\0'; - }else{ - to--; - } - return to; -} diff --git a/sys/src/cmd/unix/drawterm/libc/strtod.c b/sys/src/cmd/unix/drawterm/libc/strtod.c deleted file mode 100644 index a48abe5e4..000000000 --- a/sys/src/cmd/unix/drawterm/libc/strtod.c +++ /dev/null @@ -1,517 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -static ulong -umuldiv(ulong a, ulong b, ulong c) -{ - double d; - - d = ((double)a * (double)b) / (double)c; - if(d >= 4294967295.) - d = 4294967295.; - return (ulong)d; -} - -/* - * This routine will convert to arbitrary precision - * floating point entirely in multi-precision fixed. - * The answer is the closest floating point number to - * the given decimal number. Exactly half way are - * rounded ala ieee rules. - * Method is to scale input decimal between .500 and .999... - * with external power of 2, then binary search for the - * closest mantissa to this decimal number. - * Nmant is is the required precision. (53 for ieee dp) - * Nbits is the max number of bits/word. (must be <= 28) - * Prec is calculated - the number of words of fixed mantissa. - */ -enum -{ - Nbits = 28, /* bits safely represented in a ulong */ - Nmant = 53, /* bits of precision required */ - Prec = (Nmant+Nbits+1)/Nbits, /* words of Nbits each to represent mantissa */ - Sigbit = 1<<(Prec*Nbits-Nmant), /* first significant bit of Prec-th word */ - Ndig = 1500, - One = (ulong)(1<<Nbits), - Half = (ulong)(One>>1), - Maxe = 310, - - Fsign = 1<<0, /* found - */ - Fesign = 1<<1, /* found e- */ - Fdpoint = 1<<2, /* found . */ - - S0 = 0, /* _ _S0 +S1 #S2 .S3 */ - S1, /* _+ #S2 .S3 */ - S2, /* _+# #S2 .S4 eS5 */ - S3, /* _+. #S4 */ - S4, /* _+#.# #S4 eS5 */ - S5, /* _+#.#e +S6 #S7 */ - S6, /* _+#.#e+ #S7 */ - S7, /* _+#.#e+# #S7 */ -}; - -static int xcmp(char*, char*); -static int fpcmp(char*, ulong*); -static void frnorm(ulong*); -static void divascii(char*, int*, int*, int*); -static void mulascii(char*, int*, int*, int*); - -typedef struct Tab Tab; -struct Tab -{ - int bp; - int siz; - char* cmp; -}; - -#ifndef ERANGE -#define ERANGE 12345 -#endif - -double -fmtstrtod(const char *as, char **aas) -{ - int na, ex, dp, bp, c, i, flag, state; - ulong low[Prec], hig[Prec], mid[Prec]; - double d; - char *s, a[Ndig]; - - flag = 0; /* Fsign, Fesign, Fdpoint */ - na = 0; /* number of digits of a[] */ - dp = 0; /* na of decimal point */ - ex = 0; /* exonent */ - - state = S0; - for(s=(char*)as;; s++) { - c = *s; - if(c >= '0' && c <= '9') { - switch(state) { - case S0: - case S1: - case S2: - state = S2; - break; - case S3: - case S4: - state = S4; - break; - - case S5: - case S6: - case S7: - state = S7; - ex = ex*10 + (c-'0'); - continue; - } - if(na == 0 && c == '0') { - dp--; - continue; - } - if(na < Ndig-50) - a[na++] = c; - continue; - } - switch(c) { - case '\t': - case '\n': - case '\v': - case '\f': - case '\r': - case ' ': - if(state == S0) - continue; - break; - case '-': - if(state == S0) - flag |= Fsign; - else - flag |= Fesign; - case '+': - if(state == S0) - state = S1; - else - if(state == S5) - state = S6; - else - break; /* syntax */ - continue; - case '.': - flag |= Fdpoint; - dp = na; - if(state == S0 || state == S1) { - state = S3; - continue; - } - if(state == S2) { - state = S4; - continue; - } - break; - case 'e': - case 'E': - if(state == S2 || state == S4) { - state = S5; - continue; - } - break; - } - break; - } - - /* - * clean up return char-pointer - */ - switch(state) { - case S0: - if(xcmp(s, "nan") == 0) { - if(aas != nil) - *aas = s+3; - goto retnan; - } - case S1: - if(xcmp(s, "infinity") == 0) { - if(aas != nil) - *aas = s+8; - goto retinf; - } - if(xcmp(s, "inf") == 0) { - if(aas != nil) - *aas = s+3; - goto retinf; - } - case S3: - if(aas != nil) - *aas = (char*)as; - goto ret0; /* no digits found */ - case S6: - s--; /* back over +- */ - case S5: - s--; /* back over e */ - break; - } - if(aas != nil) - *aas = s; - - if(flag & Fdpoint) - while(na > 0 && a[na-1] == '0') - na--; - if(na == 0) - goto ret0; /* zero */ - a[na] = 0; - if(!(flag & Fdpoint)) - dp = na; - if(flag & Fesign) - ex = -ex; - dp += ex; - if(dp < -Maxe){ - errno = ERANGE; - goto ret0; /* underflow by exp */ - } else - if(dp > +Maxe) - goto retinf; /* overflow by exp */ - - /* - * normalize the decimal ascii number - * to range .[5-9][0-9]* e0 - */ - bp = 0; /* binary exponent */ - while(dp > 0) - divascii(a, &na, &dp, &bp); - while(dp < 0 || a[0] < '5') - mulascii(a, &na, &dp, &bp); - - /* close approx by naive conversion */ - mid[0] = 0; - mid[1] = 1; - for(i=0; (c=a[i]); i++) { - mid[0] = mid[0]*10 + (c-'0'); - mid[1] = mid[1]*10; - if(i >= 8) - break; - } - low[0] = umuldiv(mid[0], One, mid[1]); - hig[0] = umuldiv(mid[0]+1, One, mid[1]); - for(i=1; i<Prec; i++) { - low[i] = 0; - hig[i] = One-1; - } - - /* binary search for closest mantissa */ - for(;;) { - /* mid = (hig + low) / 2 */ - c = 0; - for(i=0; i<Prec; i++) { - mid[i] = hig[i] + low[i]; - if(c) - mid[i] += One; - c = mid[i] & 1; - mid[i] >>= 1; - } - frnorm(mid); - - /* compare */ - c = fpcmp(a, mid); - if(c > 0) { - c = 1; - for(i=0; i<Prec; i++) - if(low[i] != mid[i]) { - c = 0; - low[i] = mid[i]; - } - if(c) - break; /* between mid and hig */ - continue; - } - if(c < 0) { - for(i=0; i<Prec; i++) - hig[i] = mid[i]; - continue; - } - - /* only hard part is if even/odd roundings wants to go up */ - c = mid[Prec-1] & (Sigbit-1); - if(c == Sigbit/2 && (mid[Prec-1]&Sigbit) == 0) - mid[Prec-1] -= c; - break; /* exactly mid */ - } - - /* normal rounding applies */ - c = mid[Prec-1] & (Sigbit-1); - mid[Prec-1] -= c; - if(c >= Sigbit/2) { - mid[Prec-1] += Sigbit; - frnorm(mid); - } - goto out; - -ret0: - return 0; - -retnan: - return __NaN(); - -retinf: - /* - * Unix strtod requires these. Plan 9 would return Inf(0) or Inf(-1). */ - errno = ERANGE; - if(flag & Fsign) - return -HUGE_VAL; - return HUGE_VAL; - -out: - d = 0; - for(i=0; i<Prec; i++) - d = d*One + mid[i]; - if(flag & Fsign) - d = -d; - d = ldexp(d, bp - Prec*Nbits); - if(d == 0){ /* underflow */ - errno = ERANGE; - } - return d; -} - -static void -frnorm(ulong *f) -{ - int i, c; - - c = 0; - for(i=Prec-1; i>0; i--) { - f[i] += c; - c = f[i] >> Nbits; - f[i] &= One-1; - } - f[0] += c; -} - -static int -fpcmp(char *a, ulong* f) -{ - ulong tf[Prec]; - int i, d, c; - - for(i=0; i<Prec; i++) - tf[i] = f[i]; - - for(;;) { - /* tf *= 10 */ - for(i=0; i<Prec; i++) - tf[i] = tf[i]*10; - frnorm(tf); - d = (tf[0] >> Nbits) + '0'; - tf[0] &= One-1; - - /* compare next digit */ - c = *a; - if(c == 0) { - if('0' < d) - return -1; - if(tf[0] != 0) - goto cont; - for(i=1; i<Prec; i++) - if(tf[i] != 0) - goto cont; - return 0; - } - if(c > d) - return +1; - if(c < d) - return -1; - a++; - cont:; - } -} - -static void -divby(char *a, int *na, int b) -{ - int n, c; - char *p; - - p = a; - n = 0; - while(n>>b == 0) { - c = *a++; - if(c == 0) { - while(n) { - c = n*10; - if(c>>b) - break; - n = c; - } - goto xx; - } - n = n*10 + c-'0'; - (*na)--; - } - for(;;) { - c = n>>b; - n -= c<<b; - *p++ = c + '0'; - c = *a++; - if(c == 0) - break; - n = n*10 + c-'0'; - } - (*na)++; -xx: - while(n) { - n = n*10; - c = n>>b; - n -= c<<b; - *p++ = c + '0'; - (*na)++; - } - *p = 0; -} - -static Tab tab1[] = -{ - 1, 0, "", - 3, 1, "7", - 6, 2, "63", - 9, 3, "511", - 13, 4, "8191", - 16, 5, "65535", - 19, 6, "524287", - 23, 7, "8388607", - 26, 8, "67108863", - 27, 9, "134217727", -}; - -static void -divascii(char *a, int *na, int *dp, int *bp) -{ - int b, d; - Tab *t; - - d = *dp; - if(d >= (int)(nelem(tab1))) - d = (int)(nelem(tab1))-1; - t = tab1 + d; - b = t->bp; - if(memcmp(a, t->cmp, t->siz) > 0) - d--; - *dp -= d; - *bp += b; - divby(a, na, b); -} - -static void -mulby(char *a, char *p, char *q, int b) -{ - int n, c; - - n = 0; - *p = 0; - for(;;) { - q--; - if(q < a) - break; - c = *q - '0'; - c = (c<<b) + n; - n = c/10; - c -= n*10; - p--; - *p = c + '0'; - } - while(n) { - c = n; - n = c/10; - c -= n*10; - p--; - *p = c + '0'; - } -} - -static Tab tab2[] = -{ - 1, 1, "", /* dp = 0-0 */ - 3, 3, "125", - 6, 5, "15625", - 9, 7, "1953125", - 13, 10, "1220703125", - 16, 12, "152587890625", - 19, 14, "19073486328125", - 23, 17, "11920928955078125", - 26, 19, "1490116119384765625", - 27, 19, "7450580596923828125", /* dp 8-9 */ -}; - -static void -mulascii(char *a, int *na, int *dp, int *bp) -{ - char *p; - int d, b; - Tab *t; - - d = -*dp; - if(d >= (int)(nelem(tab2))) - d = (int)(nelem(tab2))-1; - t = tab2 + d; - b = t->bp; - if(memcmp(a, t->cmp, t->siz) < 0) - d--; - p = a + *na; - *bp -= b; - *dp += d; - *na += d; - mulby(a, p+d, p, b); -} - -static int -xcmp(char *a, char *b) -{ - int c1, c2; - - while((c1 = *b++)) { - c2 = *a++; - if(isupper(c2)) - c2 = tolower(c2); - if(c1 != c2) - return 1; - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/strtod.h b/sys/src/cmd/unix/drawterm/libc/strtod.h deleted file mode 100644 index 82c3d46eb..000000000 --- a/sys/src/cmd/unix/drawterm/libc/strtod.h +++ /dev/null @@ -1,4 +0,0 @@ -extern double __NaN(void); -extern double __Inf(int); -extern double __isNaN(double); -extern double __isInf(double, int); diff --git a/sys/src/cmd/unix/drawterm/libc/strtoll.c b/sys/src/cmd/unix/drawterm/libc/strtoll.c deleted file mode 100644 index 77e9372b6..000000000 --- a/sys/src/cmd/unix/drawterm/libc/strtoll.c +++ /dev/null @@ -1,93 +0,0 @@ -#include <u.h> -#include <libc.h> -#define VLONG_MAX ((vlong)~(((uvlong)1)<<63)) -#define VLONG_MIN ((vlong)(((uvlong)1)<<63)) -vlong -strtoll(const char *nptr, char **endptr, int base) -{ - char *p; - vlong n, nn, m; - int c, ovfl, v, neg, ndig; - p = (char*)nptr; - neg = 0; - n = 0; - ndig = 0; - ovfl = 0; - /* - * White space - */ - for(;; p++) { - switch(*p) { - case ' ': - case '\t': - case '\n': - case '\f': - case '\r': - case '\v': - continue; - } - break; - } - /* - * Sign - */ - if(*p=='-' || *p=='+') - if(*p++ == '-') - neg = 1; - /* - * Base - */ - if(base==0){ - base = 10; - if(*p == '0') { - base = 8; - if(p[1]=='x' || p[1]=='X') { - p += 2; - base = 16; - } - } - } else - if(base==16 && *p=='0') { - if(p[1]=='x' || p[1]=='X') - p += 2; - } else - if(base<0 || 36<base) - goto Return; - /* - * Non-empty sequence of digits - */ - m = VLONG_MAX/base; - for(;; p++,ndig++) { - c = *p; - v = base; - if('0'<=c && c<='9') - v = c - '0'; - else - if('a'<=c && c<='z') - v = c - 'a' + 10; - else - if('A'<=c && c<='Z') - v = c - 'A' + 10; - if(v >= base) - break; - if(n > m) - ovfl = 1; - nn = n*base + v; - if(nn < n) - ovfl = 1; - n = nn; - } -Return: - if(ndig == 0) - p = (char*)nptr; - if(endptr) - *endptr = p; - if(ovfl){ - if(neg) - return VLONG_MIN; - return VLONG_MAX; - } - if(neg) - return -n; - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/sysfatal.c b/sys/src/cmd/unix/drawterm/libc/sysfatal.c deleted file mode 100644 index f5caee999..000000000 --- a/sys/src/cmd/unix/drawterm/libc/sysfatal.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <u.h> -#include <libc.h> - -static void -_sysfatalimpl(char *fmt, va_list arg) -{ - char buf[1024]; - - vseprint(buf, buf+sizeof(buf), fmt, arg); - if(argv0) - fprint(2, "%s: %s\n", argv0, buf); - else - fprint(2, "%s\n", buf); -#undef write -write(2, buf, strlen(buf)); -write(2, "\n", 1); - panic("sysfatal"); -} - -void (*_sysfatal)(char *fmt, va_list arg) = _sysfatalimpl; - -void -sysfatal(char *fmt, ...) -{ - va_list arg; - - va_start(arg, fmt); - (*_sysfatal)(fmt, arg); - va_end(arg); -} diff --git a/sys/src/cmd/unix/drawterm/libc/time.c b/sys/src/cmd/unix/drawterm/libc/time.c deleted file mode 100644 index 5b584e2b5..000000000 --- a/sys/src/cmd/unix/drawterm/libc/time.c +++ /dev/null @@ -1,51 +0,0 @@ -#include <u.h> -#include <libc.h> - - -/* - * After a fork with fd's copied, both fd's are pointing to - * the same Chan structure. Since the offset is kept in the Chan - * structure, the seek's and read's in the two processes can - * compete at moving the offset around. Hence the unusual loop - * in the middle of this routine. - */ -static long -oldtime(long *tp) -{ - char b[20]; - static int f = -1; - int i, retries; - long t; - - memset(b, 0, sizeof(b)); - for(retries = 0; retries < 100; retries++){ - if(f < 0) - f = open("/dev/time", OREAD|OCEXEC); - if(f < 0) - break; - if(seek(f, 0, 0) < 0 || (i = read(f, b, sizeof(b))) < 0){ - close(f); - f = -1; - } else { - if(i != 0) - break; - } - } - t = atol(b); - if(tp) - *tp = t; - return t; -} - -long -time(long *tp) -{ - vlong t; - - t = nsec()/((vlong)1000000000); - if(t == 0) - t = oldtime(0); - if(tp != nil) - *tp = t; - return t; -} diff --git a/sys/src/cmd/unix/drawterm/libc/tokenize.c b/sys/src/cmd/unix/drawterm/libc/tokenize.c deleted file mode 100644 index de234d440..000000000 --- a/sys/src/cmd/unix/drawterm/libc/tokenize.c +++ /dev/null @@ -1,107 +0,0 @@ -#include <u.h> -#include <libc.h> - -static char qsep[] = " \t\r\n"; - -static char* -qtoken(char *s, char *sep) -{ - int quoting; - char *t; - - quoting = 0; - t = s; /* s is output string, t is input string */ - while(*t!='\0' && (quoting || utfrune(sep, *t)==nil)){ - if(*t != '\''){ - *s++ = *t++; - continue; - } - /* *t is a quote */ - if(!quoting){ - quoting = 1; - t++; - continue; - } - /* quoting and we're on a quote */ - if(t[1] != '\''){ - /* end of quoted section; absorb closing quote */ - t++; - quoting = 0; - continue; - } - /* doubled quote; fold one quote into two */ - t++; - *s++ = *t++; - } - if(*s != '\0'){ - *s = '\0'; - if(t == s) - t++; - } - return t; -} - -static char* -etoken(char *t, char *sep) -{ - int quoting; - - /* move to end of next token */ - quoting = 0; - while(*t!='\0' && (quoting || utfrune(sep, *t)==nil)){ - if(*t != '\''){ - t++; - continue; - } - /* *t is a quote */ - if(!quoting){ - quoting = 1; - t++; - continue; - } - /* quoting and we're on a quote */ - if(t[1] != '\''){ - /* end of quoted section; absorb closing quote */ - t++; - quoting = 0; - continue; - } - /* doubled quote; fold one quote into two */ - t += 2; - } - return t; -} - -int -gettokens(char *s, char **args, int maxargs, char *sep) -{ - int nargs; - - for(nargs=0; nargs<maxargs; nargs++){ - while(*s!='\0' && utfrune(sep, *s)!=nil) - *s++ = '\0'; - if(*s == '\0') - break; - args[nargs] = s; - s = etoken(s, sep); - } - - return nargs; -} - -int -tokenize(char *s, char **args, int maxargs) -{ - int nargs; - - for(nargs=0; nargs<maxargs; nargs++){ - while(*s!='\0' && utfrune(qsep, *s)!=nil) - s++; - if(*s == '\0') - break; - args[nargs] = s; - s = qtoken(s, qsep); - } - - return nargs; -} diff --git a/sys/src/cmd/unix/drawterm/libc/truerand.c b/sys/src/cmd/unix/drawterm/libc/truerand.c deleted file mode 100644 index 10a0f14de..000000000 --- a/sys/src/cmd/unix/drawterm/libc/truerand.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <u.h> -#include <libc.h> - -ulong -truerand(void) -{ - ulong x; - static int randfd = -1; - - if(randfd < 0) - randfd = open("/dev/random", OREAD|OCEXEC); - if(randfd < 0) - sysfatal("can't open /dev/random"); - if(read(randfd, &x, sizeof(x)) != sizeof(x)) - sysfatal("can't read /dev/random"); - return x; -} diff --git a/sys/src/cmd/unix/drawterm/libc/u16.c b/sys/src/cmd/unix/drawterm/libc/u16.c deleted file mode 100644 index 4e1637120..000000000 --- a/sys/src/cmd/unix/drawterm/libc/u16.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <u.h> -#include <libc.h> -static char t16e[] = "0123456789ABCDEF"; - -int -dec16(uchar *out, int lim, char *in, int n) -{ - int c, w = 0, i = 0; - uchar *start = out; - uchar *eout = out + lim; - - while(n-- > 0){ - c = *in++; - if('0' <= c && c <= '9') - c = c - '0'; - else if('a' <= c && c <= 'z') - c = c - 'a' + 10; - else if('A' <= c && c <= 'Z') - c = c - 'A' + 10; - else - continue; - w = (w<<4) + c; - i++; - if(i == 2){ - if(out + 1 > eout) - goto exhausted; - *out++ = w; - w = 0; - i = 0; - } - } -exhausted: - return out - start; -} - -int -enc16(char *out, int lim, uchar *in, int n) -{ - uint c; - char *eout = out + lim; - char *start = out; - - while(n-- > 0){ - c = *in++; - if(out + 2 >= eout) - goto exhausted; - *out++ = t16e[c>>4]; - *out++ = t16e[c&0xf]; - } -exhausted: - *out = 0; - return out - start; -} diff --git a/sys/src/cmd/unix/drawterm/libc/u32.c b/sys/src/cmd/unix/drawterm/libc/u32.c deleted file mode 100644 index 7423984a2..000000000 --- a/sys/src/cmd/unix/drawterm/libc/u32.c +++ /dev/null @@ -1,110 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -dec32(uchar *dest, int ndest, char *src, int nsrc) -{ - char *s, *tab; - uchar *start; - int i, u[8]; - - if(ndest+1 < (5*nsrc+7)/8) - return -1; - start = dest; - tab = "23456789abcdefghijkmnpqrstuvwxyz"; - while(nsrc>=8){ - for(i=0; i<8; i++){ - s = strchr(tab,(int)src[i]); - u[i] = s ? s-tab : 0; - } - *dest++ = (u[0]<<3) | (0x7 & (u[1]>>2)); - *dest++ = ((0x3 & u[1])<<6) | (u[2]<<1) | (0x1 & (u[3]>>4)); - *dest++ = ((0xf & u[3])<<4) | (0xf & (u[4]>>1)); - *dest++ = ((0x1 & u[4])<<7) | (u[5]<<2) | (0x3 & (u[6]>>3)); - *dest++ = ((0x7 & u[6])<<5) | u[7]; - src += 8; - nsrc -= 8; - } - if(nsrc > 0){ - if(nsrc == 1 || nsrc == 3 || nsrc == 6) - return -1; - for(i=0; i<nsrc; i++){ - s = strchr(tab,(int)src[i]); - u[i] = s ? s-tab : 0; - } - *dest++ = (u[0]<<3) | (0x7 & (u[1]>>2)); - if(nsrc == 2) - goto out; - *dest++ = ((0x3 & u[1])<<6) | (u[2]<<1) | (0x1 & (u[3]>>4)); - if(nsrc == 4) - goto out; - *dest++ = ((0xf & u[3])<<4) | (0xf & (u[4]>>1)); - if(nsrc == 5) - goto out; - *dest++ = ((0x1 & u[4])<<7) | (u[5]<<2) | (0x3 & (u[6]>>3)); - } -out: - return dest-start; -} - -int -enc32(char *dest, int ndest, uchar *src, int nsrc) -{ - char *tab, *start; - int j; - - if(ndest <= (8*nsrc+4)/5 ) - return -1; - start = dest; - tab = "23456789abcdefghijkmnpqrstuvwxyz"; - while(nsrc>=5){ - j = (0x1f & (src[0]>>3)); - *dest++ = tab[j]; - j = (0x1c & (src[0]<<2)) | (0x03 & (src[1]>>6)); - *dest++ = tab[j]; - j = (0x1f & (src[1]>>1)); - *dest++ = tab[j]; - j = (0x10 & (src[1]<<4)) | (0x0f & (src[2]>>4)); - *dest++ = tab[j]; - j = (0x1e & (src[2]<<1)) | (0x01 & (src[3]>>7)); - *dest++ = tab[j]; - j = (0x1f & (src[3]>>2)); - *dest++ = tab[j]; - j = (0x18 & (src[3]<<3)) | (0x07 & (src[4]>>5)); - *dest++ = tab[j]; - j = (0x1f & (src[4])); - *dest++ = tab[j]; - src += 5; - nsrc -= 5; - } - if(nsrc){ - j = (0x1f & (src[0]>>3)); - *dest++ = tab[j]; - j = (0x1c & (src[0]<<2)); - if(nsrc == 1) - goto out; - j |= (0x03 & (src[1]>>6)); - *dest++ = tab[j]; - j = (0x1f & (src[1]>>1)); - if(nsrc == 2) - goto out; - *dest++ = tab[j]; - j = (0x10 & (src[1]<<4)); - if(nsrc == 3) - goto out; - j |= (0x0f & (src[2]>>4)); - *dest++ = tab[j]; - j = (0x1e & (src[2]<<1)); - if(nsrc == 4) - goto out; - j |= (0x01 & (src[3]>>7)); - *dest++ = tab[j]; - j = (0x1f & (src[3]>>2)); - *dest++ = tab[j]; - j = (0x18 & (src[3]<<3)); -out: - *dest++ = tab[j]; - } - *dest = 0; - return dest-start; -} diff --git a/sys/src/cmd/unix/drawterm/libc/u64.c b/sys/src/cmd/unix/drawterm/libc/u64.c deleted file mode 100644 index bf86c634c..000000000 --- a/sys/src/cmd/unix/drawterm/libc/u64.c +++ /dev/null @@ -1,127 +0,0 @@ -#include <u.h> -#include <libc.h> - -enum { - INVAL= 255 -}; - -static uchar t64d[256] = { - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, 62,INVAL,INVAL,INVAL, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, - INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL -}; -static char t64e[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -int -dec64(uchar *out, int lim, char *in, int n) -{ - ulong b24; - uchar *start = out; - uchar *e = out + lim; - int i, c; - - b24 = 0; - i = 0; - while(n-- > 0){ - - c = t64d[*(uchar*)in++]; - if(c == INVAL) - continue; - switch(i){ - case 0: - b24 = c<<18; - break; - case 1: - b24 |= c<<12; - break; - case 2: - b24 |= c<<6; - break; - case 3: - if(out + 3 > e) - goto exhausted; - - b24 |= c; - *out++ = b24>>16; - *out++ = b24>>8; - *out++ = b24; - i = -1; - break; - } - i++; - } - switch(i){ - case 2: - if(out + 1 > e) - goto exhausted; - *out++ = b24>>16; - break; - case 3: - if(out + 2 > e) - goto exhausted; - *out++ = b24>>16; - *out++ = b24>>8; - break; - } -exhausted: - return out - start; -} - -int -enc64(char *out, int lim, uchar *in, int n) -{ - int i; - ulong b24; - char *start = out; - char *e = out + lim; - - for(i = n/3; i > 0; i--){ - b24 = (*in++)<<16; - b24 |= (*in++)<<8; - b24 |= *in++; - if(out + 4 >= e) - goto exhausted; - *out++ = t64e[(b24>>18)]; - *out++ = t64e[(b24>>12)&0x3f]; - *out++ = t64e[(b24>>6)&0x3f]; - *out++ = t64e[(b24)&0x3f]; - } - - switch(n%3){ - case 2: - b24 = (*in++)<<16; - b24 |= (*in)<<8; - if(out + 4 >= e) - goto exhausted; - *out++ = t64e[(b24>>18)]; - *out++ = t64e[(b24>>12)&0x3f]; - *out++ = t64e[(b24>>6)&0x3f]; - *out++ = '='; - break; - case 1: - b24 = (*in)<<16; - if(out + 4 >= e) - goto exhausted; - *out++ = t64e[(b24>>18)]; - *out++ = t64e[(b24>>12)&0x3f]; - *out++ = '='; - *out++ = '='; - break; - } -exhausted: - *out = 0; - return out - start; -} diff --git a/sys/src/cmd/unix/drawterm/libc/utf.h b/sys/src/cmd/unix/drawterm/libc/utf.h deleted file mode 100644 index f7c3ebd83..000000000 --- a/sys/src/cmd/unix/drawterm/libc/utf.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _UTFH_ -#define _UTFH_ 1 - -typedef unsigned short Rune; /* 16 bits */ - -enum -{ - UTFmax = 3, /* maximum bytes per rune */ - Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ - Runeself = 0x80, /* rune and UTF sequences are the same (<) */ - Runeerror = 0xFFFD, /* decoding error in UTF */ - Runemax = 0xFFFF, /* 16 bit rune */ -}; - -/* - * rune routines - */ -extern int runetochar(char*, Rune*); -extern int chartorune(Rune*, char*); -extern int runelen(long); -extern int runenlen(Rune*, int); -extern int fullrune(char*, int); -extern int utflen(char*); -extern int utfnlen(char*, long); -extern char* utfrune(char*, long); -extern char* utfrrune(char*, long); -extern char* utfutf(char*, char*); -extern char* utfecpy(char*, char*, char*); - -extern Rune* runestrcat(Rune*, Rune*); -extern Rune* runestrchr(Rune*, Rune); -extern int runestrcmp(Rune*, Rune*); -extern Rune* runestrcpy(Rune*, Rune*); -extern Rune* runestrncpy(Rune*, Rune*, long); -extern Rune* runestrecpy(Rune*, Rune*, Rune*); -extern Rune* runestrdup(Rune*); -extern Rune* runestrncat(Rune*, Rune*, long); -extern int runestrncmp(Rune*, Rune*, long); -extern Rune* runestrrchr(Rune*, Rune); -extern long runestrlen(Rune*); -extern Rune* runestrstr(Rune*, Rune*); - -extern Rune tolowerrune(Rune); -extern Rune totitlerune(Rune); -extern Rune toupperrune(Rune); -extern int isalpharune(Rune); -extern int islowerrune(Rune); -extern int isspacerune(Rune); -extern int istitlerune(Rune); -extern int isupperrune(Rune); - -#endif diff --git a/sys/src/cmd/unix/drawterm/libc/utfdef.h b/sys/src/cmd/unix/drawterm/libc/utfdef.h deleted file mode 100644 index 4b58ae87e..000000000 --- a/sys/src/cmd/unix/drawterm/libc/utfdef.h +++ /dev/null @@ -1,14 +0,0 @@ -#define uchar _utfuchar -#define ushort _utfushort -#define uint _utfuint -#define ulong _utfulong -#define vlong _utfvlong -#define uvlong _utfuvlong - -typedef unsigned char uchar; -typedef unsigned short ushort; -typedef unsigned int uint; -typedef unsigned long ulong; - -#define nelem(x) (sizeof(x)/sizeof((x)[0])) -#define nil ((void*)0) diff --git a/sys/src/cmd/unix/drawterm/libc/utfecpy.c b/sys/src/cmd/unix/drawterm/libc/utfecpy.c deleted file mode 100644 index bc451c083..000000000 --- a/sys/src/cmd/unix/drawterm/libc/utfecpy.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <u.h> -#include <libc.h> - -char* -utfecpy(char *to, char *e, char *from) -{ - char *end; - - if(to >= e) - return to; - end = memccpy(to, from, '\0', e - to); - if(end == nil){ - end = e-1; - while(end>to && (*--end&0xC0)==0x80) - ; - *end = '\0'; - }else{ - end--; - } - return end; -} diff --git a/sys/src/cmd/unix/drawterm/libc/utflen.c b/sys/src/cmd/unix/drawterm/libc/utflen.c deleted file mode 100644 index 7273a6979..000000000 --- a/sys/src/cmd/unix/drawterm/libc/utflen.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -utflen(char *s) -{ - int c; - long n; - Rune rune; - - n = 0; - for(;;) { - c = *(uchar*)s; - if(c < Runeself) { - if(c == 0) - return n; - s++; - } else - s += chartorune(&rune, s); - n++; - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/utfnlen.c b/sys/src/cmd/unix/drawterm/libc/utfnlen.c deleted file mode 100644 index 43e9c4aae..000000000 --- a/sys/src/cmd/unix/drawterm/libc/utfnlen.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <u.h> -#include <libc.h> - -int -utfnlen(char *s, long m) -{ - int c; - long n; - Rune rune; - char *es; - - es = s + m; - for(n = 0; s < es; n++) { - c = *(uchar*)s; - if(c < Runeself){ - if(c == '\0') - break; - s++; - continue; - } - if(!fullrune(s, es-s)) - break; - s += chartorune(&rune, s); - } - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/utfrrune.c b/sys/src/cmd/unix/drawterm/libc/utfrrune.c deleted file mode 100644 index 900e5bca1..000000000 --- a/sys/src/cmd/unix/drawterm/libc/utfrrune.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <u.h> -#include <libc.h> - -char* -utfrrune(char *s, long c) -{ - long c1; - Rune r; - char *s1; - - if(c < Runesync) /* not part of utf sequence */ - return strrchr(s, c); - - s1 = 0; - for(;;) { - c1 = *(uchar*)s; - if(c1 < Runeself) { /* one byte rune */ - if(c1 == 0) - return s1; - if(c1 == c) - s1 = s; - s++; - continue; - } - c1 = chartorune(&r, s); - if(r == c) - s1 = s; - s += c1; - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/utfrune.c b/sys/src/cmd/unix/drawterm/libc/utfrune.c deleted file mode 100644 index 2373db2c5..000000000 --- a/sys/src/cmd/unix/drawterm/libc/utfrune.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <u.h> -#include <libc.h> - -char* -utfrune(char *s, long c) -{ - long c1; - Rune r; - int n; - - if(c < Runesync) /* not part of utf sequence */ - return strchr(s, c); - - for(;;) { - c1 = *(uchar*)s; - if(c1 < Runeself) { /* one byte rune */ - if(c1 == 0) - return 0; - if(c1 == c) - return s; - s++; - continue; - } - n = chartorune(&r, s); - if(r == c) - return s; - s += n; - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/utfutf.c b/sys/src/cmd/unix/drawterm/libc/utfutf.c deleted file mode 100644 index f3b95da17..000000000 --- a/sys/src/cmd/unix/drawterm/libc/utfutf.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <u.h> -#include <libc.h> - - -/* - * Return pointer to first occurrence of s2 in s1, - * 0 if none - */ -char* -utfutf(char *s1, char *s2) -{ - char *p; - long f, n1, n2; - Rune r; - - n1 = chartorune(&r, s2); - f = r; - if(f <= Runesync) /* represents self */ - return strstr(s1, s2); - - n2 = strlen(s2); - for(p=s1; (p=utfrune(p, f)); p+=n1) - if(strncmp(p, s2, n2) == 0) - return p; - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libc/vfprint.c b/sys/src/cmd/unix/drawterm/libc/vfprint.c deleted file mode 100644 index 106fece07..000000000 --- a/sys/src/cmd/unix/drawterm/libc/vfprint.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -vfprint(int fd, char *fmt, va_list args) -{ - Fmt f; - char buf[256]; - int n; - - fmtfdinit(&f, fd, buf, sizeof(buf)); - VA_COPY(f.args,args); - n = dofmt(&f, fmt); - VA_END(f.args); - if(n > 0 && __fmtFdFlush(&f) == 0) - return -1; - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libc/vseprint.c b/sys/src/cmd/unix/drawterm/libc/vseprint.c deleted file mode 100644 index cdc13d42b..000000000 --- a/sys/src/cmd/unix/drawterm/libc/vseprint.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -char* -vseprint(char *buf, char *e, char *fmt, va_list args) -{ - Fmt f; - - if(e <= buf) - return nil; - f.runes = 0; - f.start = buf; - f.to = buf; - f.stop = e - 1; - f.flush = 0; - f.farg = nil; - f.nfmt = 0; - VA_COPY(f.args,args); - dofmt(&f, fmt); - VA_END(f.args); - *(char*)f.to = '\0'; - return (char*)f.to; -} - diff --git a/sys/src/cmd/unix/drawterm/libc/vsmprint.c b/sys/src/cmd/unix/drawterm/libc/vsmprint.c deleted file mode 100644 index df5abe4da..000000000 --- a/sys/src/cmd/unix/drawterm/libc/vsmprint.c +++ /dev/null @@ -1,68 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -static int -fmtStrFlush(Fmt *f) -{ - char *s; - int n; - - if(f->start == nil) - return 0; - n = (uintptr)f->farg; - n *= 2; - s = (char*)f->start; - f->start = realloc(s, n); - if(f->start == nil){ - f->farg = nil; - f->to = nil; - f->stop = nil; - free(s); - return 0; - } - f->farg = (void*)(uintptr)n; - f->to = (char*)f->start + ((char*)f->to - s); - f->stop = (char*)f->start + n - 1; - return 1; -} - -int -fmtstrinit(Fmt *f) -{ - int n; - - memset(f, 0, sizeof *f); - f->runes = 0; - n = 32; - f->start = malloc(n); - if(f->start == nil) - return -1; - f->to = f->start; - f->stop = (char*)f->start + n - 1; - f->flush = fmtStrFlush; - f->farg = (void*)(uintptr)n; - f->nfmt = 0; - return 0; -} - -/* - * print into an allocated string buffer - */ -char* -vsmprint(char *fmt, va_list args) -{ - Fmt f; - int n; - - if(fmtstrinit(&f) < 0) - return nil; - VA_COPY(f.args,args); - n = dofmt(&f, fmt); - VA_END(f.args); - if(n < 0){ - free(f.start); - return nil; - } - return fmtstrflush(&f); -} diff --git a/sys/src/cmd/unix/drawterm/libc/vsnprint.c b/sys/src/cmd/unix/drawterm/libc/vsnprint.c deleted file mode 100644 index 4aade98fe..000000000 --- a/sys/src/cmd/unix/drawterm/libc/vsnprint.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "fmtdef.h" - -int -vsnprint(char *buf, int len, char *fmt, va_list args) -{ - Fmt f; - - if(len <= 0) - return -1; - f.runes = 0; - f.start = buf; - f.to = buf; - f.stop = buf + len - 1; - f.flush = 0; - f.farg = nil; - f.nfmt = 0; - VA_COPY(f.args,args); - dofmt(&f, fmt); - VA_END(f.args); - *(char*)f.to = '\0'; - return (char*)f.to - buf; -} diff --git a/sys/src/cmd/unix/drawterm/libdraw/Makefile b/sys/src/cmd/unix/drawterm/libdraw/Makefile deleted file mode 100644 index 16370ff05..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libdraw.a - -OFILES=\ - alloc.$O\ - arith.$O\ - bytesperline.$O\ - chan.$O\ - defont.$O\ - drawrepl.$O\ - icossin.$O\ - icossin2.$O\ - rectclip.$O\ - rgb.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/libdraw/alloc.c b/sys/src/cmd/unix/drawterm/libdraw/alloc.c deleted file mode 100644 index bc7a7d732..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/alloc.c +++ /dev/null @@ -1,237 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -Image* -allocimage(Display *d, Rectangle r, ulong chan, int repl, ulong val) -{ - return _allocimage(nil, d, r, chan, repl, val, 0, 0); -} - -Image* -_allocimage(Image *ai, Display *d, Rectangle r, ulong chan, int repl, ulong val, int screenid, int refresh) -{ - uchar *a; - char *err; - Image *i; - Rectangle clipr; - int id; - int depth; - - err = 0; - i = 0; - - if(chan == 0){ - werrstr("bad channel descriptor"); - return nil; - } - - depth = chantodepth(chan); - if(depth == 0){ - err = "bad channel descriptor"; - Error: - if(err) - werrstr("allocimage: %s", err); - else - werrstr("allocimage: %r"); - free(i); - return 0; - } - - /* flush pending data so we don't get error allocating the image */ - flushimage(d, 0); - a = bufimage(d, 1+4+4+1+4+1+4*4+4*4+4); - if(a == 0) - goto Error; - d->imageid++; - id = d->imageid; - a[0] = 'b'; - BPLONG(a+1, id); - BPLONG(a+5, screenid); - a[9] = refresh; - BPLONG(a+10, chan); - a[14] = repl; - BPLONG(a+15, r.min.x); - BPLONG(a+19, r.min.y); - BPLONG(a+23, r.max.x); - BPLONG(a+27, r.max.y); - if(repl) - /* huge but not infinite, so various offsets will leave it huge, not overflow */ - clipr = Rect(-0x3FFFFFFF, -0x3FFFFFFF, 0x3FFFFFFF, 0x3FFFFFFF); - else - clipr = r; - BPLONG(a+31, clipr.min.x); - BPLONG(a+35, clipr.min.y); - BPLONG(a+39, clipr.max.x); - BPLONG(a+43, clipr.max.y); - BPLONG(a+47, val); - if(flushimage(d, 0) < 0) - goto Error; - - if(ai) - i = ai; - else{ - i = malloc(sizeof(Image)); - if(i == nil){ - a = bufimage(d, 1+4); - if(a){ - a[0] = 'f'; - BPLONG(a+1, id); - flushimage(d, 0); - } - goto Error; - } - } - i->display = d; - i->id = id; - i->depth = depth; - i->chan = chan; - i->r = r; - i->clipr = clipr; - i->repl = repl; - i->screen = 0; - i->next = 0; - return i; -} - -Image* -namedimage(Display *d, char *name) -{ - uchar *a; - char *err, buf[12*12+1]; - Image *i; - int id, n; - ulong chan; - - err = 0; - i = 0; - - n = strlen(name); - if(n >= 256){ - err = "name too long"; - Error: - if(err) - werrstr("namedimage: %s", err); - else - werrstr("namedimage: %r"); - if(i) - free(i); - return 0; - } - /* flush pending data so we don't get error allocating the image */ - flushimage(d, 0); - a = bufimage(d, 1+4+1+n); - if(a == 0) - goto Error; - d->imageid++; - id = d->imageid; - a[0] = 'n'; - BPLONG(a+1, id); - a[5] = n; - memmove(a+6, name, n); - if(flushimage(d, 0) < 0) - goto Error; - - if(pread(d->ctlfd, buf, sizeof buf, 0) < 12*12) - goto Error; - buf[12*12] = '\0'; - - i = malloc(sizeof(Image)); - if(i == nil){ - Error1: - a = bufimage(d, 1+4); - if(a){ - a[0] = 'f'; - BPLONG(a+1, id); - flushimage(d, 0); - } - goto Error; - } - i->display = d; - i->id = id; - if((chan=strtochan(buf+2*12))==0){ - werrstr("bad channel '%.12s' from devdraw", buf+2*12); - goto Error1; - } - i->chan = chan; - i->depth = chantodepth(chan); - i->repl = atoi(buf+3*12); - i->r.min.x = atoi(buf+4*12); - i->r.min.y = atoi(buf+5*12); - i->r.max.x = atoi(buf+6*12); - i->r.max.y = atoi(buf+7*12); - i->clipr.min.x = atoi(buf+8*12); - i->clipr.min.y = atoi(buf+9*12); - i->clipr.max.x = atoi(buf+10*12); - i->clipr.max.y = atoi(buf+11*12); - i->screen = 0; - i->next = 0; - return i; -} - -int -nameimage(Image *i, char *name, int in) -{ - uchar *a; - int n; - - n = strlen(name); - a = bufimage(i->display, 1+4+1+1+n); - if(a == 0) - return 0; - a[0] = 'N'; - BPLONG(a+1, i->id); - a[5] = in; - a[6] = n; - memmove(a+7, name, n); - if(flushimage(i->display, 0) < 0) - return 0; - return 1; -} - -int -_freeimage1(Image *i) -{ - uchar *a; - Display *d; - Image *w; - - if(i == 0) - return 0; - /* make sure no refresh events occur on this if we block in the write */ - d = i->display; - /* flush pending data so we don't get error deleting the image */ - flushimage(d, 0); - a = bufimage(d, 1+4); - if(a == 0) - return -1; - a[0] = 'f'; - BPLONG(a+1, i->id); - if(i->screen){ - w = d->windows; - if(w == i) - d->windows = i->next; - else - while(w){ - if(w->next == i){ - w->next = i->next; - break; - } - w = w->next; - } - } - if(flushimage(d, i->screen!=0) < 0) - return -1; - - return 0; -} - -int -freeimage(Image *i) -{ - int ret; - - ret = _freeimage1(i); - free(i); - return ret; -} diff --git a/sys/src/cmd/unix/drawterm/libdraw/arith.c b/sys/src/cmd/unix/drawterm/libdraw/arith.c deleted file mode 100644 index 885b3c7fd..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/arith.c +++ /dev/null @@ -1,206 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -Point -Pt(int x, int y) -{ - Point p; - - p.x = x; - p.y = y; - return p; -} - -Rectangle -Rect(int x, int y, int bx, int by) -{ - Rectangle r; - - r.min.x = x; - r.min.y = y; - r.max.x = bx; - r.max.y = by; - return r; -} - -Rectangle -Rpt(Point min, Point max) -{ - Rectangle r; - - r.min = min; - r.max = max; - return r; -} - -Point -addpt(Point a, Point b) -{ - a.x += b.x; - a.y += b.y; - return a; -} - -Point -subpt(Point a, Point b) -{ - a.x -= b.x; - a.y -= b.y; - return a; -} - -Rectangle -insetrect(Rectangle r, int n) -{ - r.min.x += n; - r.min.y += n; - r.max.x -= n; - r.max.y -= n; - return r; -} - -Point -divpt(Point a, int b) -{ - a.x /= b; - a.y /= b; - return a; -} - -Point -mulpt(Point a, int b) -{ - a.x *= b; - a.y *= b; - return a; -} - -Rectangle -rectsubpt(Rectangle r, Point p) -{ - r.min.x -= p.x; - r.min.y -= p.y; - r.max.x -= p.x; - r.max.y -= p.y; - return r; -} - -Rectangle -rectaddpt(Rectangle r, Point p) -{ - r.min.x += p.x; - r.min.y += p.y; - r.max.x += p.x; - r.max.y += p.y; - return r; -} - -int -eqpt(Point p, Point q) -{ - return p.x==q.x && p.y==q.y; -} - -int -eqrect(Rectangle r, Rectangle s) -{ - return r.min.x==s.min.x && r.max.x==s.max.x && - r.min.y==s.min.y && r.max.y==s.max.y; -} - -int -rectXrect(Rectangle r, Rectangle s) -{ - return r.min.x<s.max.x && s.min.x<r.max.x && - r.min.y<s.max.y && s.min.y<r.max.y; -} - -int -rectinrect(Rectangle r, Rectangle s) -{ - return s.min.x<=r.min.x && r.max.x<=s.max.x && s.min.y<=r.min.y && r.max.y<=s.max.y; -} - -int -ptinrect(Point p, Rectangle r) -{ - return p.x>=r.min.x && p.x<r.max.x && - p.y>=r.min.y && p.y<r.max.y; -} - -Rectangle -canonrect(Rectangle r) -{ - int t; - if (r.max.x < r.min.x) { - t = r.min.x; - r.min.x = r.max.x; - r.max.x = t; - } - if (r.max.y < r.min.y) { - t = r.min.y; - r.min.y = r.max.y; - r.max.y = t; - } - return r; -} - -void -combinerect(Rectangle *r1, Rectangle r2) -{ - if(r1->min.x > r2.min.x) - r1->min.x = r2.min.x; - if(r1->min.y > r2.min.y) - r1->min.y = r2.min.y; - if(r1->max.x < r2.max.x) - r1->max.x = r2.max.x; - if(r1->max.y < r2.max.y) - r1->max.y = r2.max.y; -} - -ulong -drawld2chan[] = { - GREY1, - GREY2, - GREY4, - CMAP8, -}; - -int log2[] = { -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, 4 /* BUG */, -1, -1, -1, -1, -1, -1, -1, 5 }; - -ulong -setalpha(ulong color, uchar alpha) -{ - int red, green, blue; - - red = (color >> 3*8) & 0xFF; - green = (color >> 2*8) & 0xFF; - blue = (color >> 1*8) & 0xFF; - /* ignore incoming alpha */ - red = (red * alpha)/255; - green = (green * alpha)/255; - blue = (blue * alpha)/255; - return (red<<3*8) | (green<<2*8) | (blue<<1*8) | (alpha<<0*8); -} - -Point ZP; -Rectangle ZR; -int -Rfmt(Fmt *f) -{ - Rectangle r; - - r = va_arg(f->args, Rectangle); - return fmtprint(f, "%P %P", r.min, r.max); -} - -int -Pfmt(Fmt *f) -{ - Point p; - - p = va_arg(f->args, Point); - return fmtprint(f, "[%d %d]", p.x, p.y); -} - diff --git a/sys/src/cmd/unix/drawterm/libdraw/bytesperline.c b/sys/src/cmd/unix/drawterm/libdraw/bytesperline.c deleted file mode 100644 index 08ff7d7fe..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/bytesperline.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -static -int -unitsperline(Rectangle r, int d, int bitsperunit) -{ - ulong l, t; - - if(d <= 0 || d > 32) /* being called wrong. d is image depth. */ - abort(); - - if(r.min.x >= 0){ - l = (r.max.x*d+bitsperunit-1)/bitsperunit; - l -= (r.min.x*d)/bitsperunit; - }else{ /* make positive before divide */ - t = (-r.min.x*d+bitsperunit-1)/bitsperunit; - l = t+(r.max.x*d+bitsperunit-1)/bitsperunit; - } - return l; -} - -int -wordsperline(Rectangle r, int d) -{ - return unitsperline(r, d, 8*sizeof(ulong)); -} - -int -bytesperline(Rectangle r, int d) -{ - return unitsperline(r, d, 8); -} diff --git a/sys/src/cmd/unix/drawterm/libdraw/chan.c b/sys/src/cmd/unix/drawterm/libdraw/chan.c deleted file mode 100644 index 8bace1543..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/chan.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -static char channames[] = "rgbkamx"; -char* -chantostr(char *buf, ulong cc) -{ - ulong c, rc; - char *p; - - if(chantodepth(cc) == 0) - return nil; - - /* reverse the channel descriptor so we can easily generate the string in the right order */ - rc = 0; - for(c=cc; c; c>>=8){ - rc <<= 8; - rc |= c&0xFF; - } - - p = buf; - for(c=rc; c; c>>=8) { - *p++ = channames[TYPE(c)]; - *p++ = '0'+NBITS(c); - } - *p = 0; - - return buf; -} - -/* avoid pulling in ctype when using with drawterm etc. */ -static int -xisspace(char c) -{ - return c==' ' || c== '\t' || c=='\r' || c=='\n'; -} - -ulong -strtochan(char *s) -{ - char *p, *q; - ulong c; - int t, n; - - c = 0; - p=s; - while(*p && xisspace(*p)) - p++; - - while(*p && !xisspace(*p)){ - if((q = strchr(channames, p[0])) == nil) - return 0; - t = q-channames; - if(p[1] < '0' || p[1] > '9') - return 0; - n = p[1]-'0'; - c = (c<<8) | __DC(t, n); - p += 2; - } - return c; -} - -int -chantodepth(ulong c) -{ - int n; - - for(n=0; c; c>>=8){ - if(TYPE(c) >= NChan || NBITS(c) > 8 || NBITS(c) <= 0) - return 0; - n += NBITS(c); - } - if(n==0 || (n>8 && n%8) || (n<8 && 8%n)) - return 0; - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libdraw/defont.c b/sys/src/cmd/unix/drawterm/libdraw/defont.c deleted file mode 100644 index b0c85e1dc..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/defont.c +++ /dev/null @@ -1,402 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -/* - * lucm/latin1.9, in uncompressed form - */ -uchar -defontdata[] = -{ -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x32,0x33,0x30,0x34,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x35,0x20,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, -0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x30,0x06,0x06,0x03,0x42,0x40,0x00,0x00,0x00,0x18,0x03,0x03, -0x02,0x43,0x00,0x60,0x60,0x48,0x00,0x0d,0x0c,0x01,0x81,0x80,0xd0,0x90,0x00,0x00, -0x18,0x01,0x81,0x81,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x7f,0x9c,0x1c, -0x0e,0x07,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x70, -0x38,0x1c,0x0e,0x04,0x81,0xc1,0xc0,0x70,0x00,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x80,0xc0,0x63,0xe3, -0xf1,0xf8,0xfe,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x7f,0xff,0xff,0x1f,0x8f, -0xc7,0xe3,0xf1,0xfb,0x7e,0x3e,0x3f,0x8f,0xff,0xe3,0xe3,0xff,0xff,0xff,0xff,0xff, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x0c,0x18,0x09,0x05,0x82,0x40,0xc0,0x00,0x00,0x06,0x0c,0x04, -0x82,0x40,0xc1,0x80,0x90,0x48,0x00,0x16,0x03,0x06,0x02,0x41,0x60,0x90,0x00,0x00, -0x06,0x06,0x02,0x41,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x7f,0xa0,0x10, -0x08,0x04,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x48, -0x24,0x12,0x09,0x06,0x82,0x01,0x00,0x90,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x04,0x80,0x00,0x40,0x00,0x00,0x38,0x06,0x18,0x00,0x00,0x00,0x00,0x00, -0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x07,0xc6,0x01,0xf0,0x00,0x00,0x0c,0x00,0x18,0x00,0x00,0x30,0x00,0x3c, -0x00,0x60,0x06,0x01,0x8c,0x07,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0xc3,0xc0,0x01,0x54,0x9c,0xc0,0x5f,0xef, -0xf7,0xfb,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0x7f,0xff,0xff,0x6f,0xb7, -0xdb,0xed,0xf6,0xf9,0x7d,0xfe,0xff,0x6f,0xff,0xdf,0xef,0xff,0xff,0xff,0xff,0xff, -0xff,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x30,0x06,0x06,0x06,0x82,0x80,0xc0,0x00, -0x00,0x18,0x03,0x03,0x02,0x41,0x80,0x30,0x30,0x24,0x76,0x0d,0x0c,0x00,0xc0,0xc0, -0xd0,0x50,0x00,0x00,0x18,0x01,0x81,0x81,0x40,0x30,0x00,0x28,0x0f,0x7f,0xbc,0x1c, -0x0e,0x07,0x03,0xc0,0x10,0x70,0x24,0x10,0x09,0x07,0x03,0x80,0xe0,0x70,0x90,0x48, -0x24,0x12,0x09,0x05,0x81,0x81,0xc0,0x80,0x70,0x18,0x1c,0x07,0x01,0xc1,0xc0,0x90, -0x00,0x0c,0x04,0x84,0x83,0xe1,0xc0,0xe0,0x38,0x0c,0x0c,0x02,0x00,0x00,0x00,0x00, -0x00,0x06,0x1c,0x06,0x0f,0x87,0xc0,0x63,0xf8,0x78,0xfe,0x3e,0x0e,0x00,0x00,0x00, -0x00,0x00,0x00,0x7c,0x1c,0x0c,0x1f,0x03,0xc7,0xc3,0xf1,0xf8,0x3c,0x63,0x3f,0x0f, -0x8c,0x66,0x06,0x19,0x84,0x78,0x7e,0x1e,0x1f,0x07,0xcf,0xf3,0x1b,0x0d,0x86,0x63, -0x61,0x9f,0xc6,0x06,0x00,0x30,0x00,0x00,0x10,0x00,0x18,0x00,0x00,0x30,0x00,0x60, -0x00,0x60,0x06,0x01,0x8c,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80, -0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xc0,0x60,0x00,0xaa,0xb6,0xc0,0x43,0xe3, -0xf1,0xf8,0xfc,0x3f,0xef,0x8f,0xdb,0xef,0xf6,0xf8,0xfb,0xff,0x1f,0x8f,0x6f,0xb7, -0xdb,0xed,0xf6,0xfa,0x7e,0x7e,0x3f,0x7f,0x8f,0xe7,0xe3,0xf8,0xfe,0x3e,0x3f,0x6f, -0x00,0x00,0x01,0x01,0xc8,0x0b,0x0c,0x30,0x7c,0x14,0x0f,0x0f,0x00,0x00,0x00,0x00, -0x78,0x00,0x1c,0x00,0x0f,0x07,0x81,0x80,0x00,0x7c,0x00,0x00,0x1c,0x0f,0x80,0x04, -0x42,0x23,0x90,0x00,0x18,0x0c,0x06,0x03,0x01,0x80,0xc0,0x3c,0x3c,0x3f,0x1f,0x8f, -0xc7,0xe7,0xe3,0xf1,0xf8,0xfc,0x7c,0x30,0x8f,0x07,0x83,0xc1,0xe0,0xf0,0x00,0x3d, -0x31,0x98,0xcc,0x66,0x36,0x19,0x80,0xcc,0x0c,0x18,0x09,0x0b,0x02,0x81,0x20,0x00, -0x00,0x06,0x0c,0x04,0x82,0x40,0x60,0xc0,0x48,0x24,0x18,0x16,0x03,0x03,0x01,0x21, -0x60,0x50,0x00,0x00,0x06,0x06,0x02,0x41,0x40,0xc1,0x80,0x28,0x87,0x7f,0x84,0x10, -0x08,0x04,0x02,0x40,0x38,0x48,0x24,0x10,0x09,0x04,0x04,0x81,0x00,0x80,0x90,0x48, -0x24,0x12,0x09,0x04,0x80,0x41,0x00,0x80,0x40,0x04,0x10,0x04,0x02,0x01,0x20,0x90, -0x00,0x0c,0x04,0x84,0x86,0x53,0x65,0xb0,0x08,0x18,0x06,0x0a,0x80,0x00,0x00,0x00, -0x00,0x0c,0x36,0x0e,0x19,0xcc,0xe0,0xe3,0xf8,0xcc,0xfe,0x63,0x1b,0x00,0x00,0x00, -0x00,0x00,0x00,0xc6,0x62,0x0c,0x19,0x86,0x66,0x63,0x01,0x80,0x66,0x63,0x0c,0x01, -0x8c,0xc6,0x06,0x19,0xc4,0xcc,0x63,0x33,0x19,0x8c,0x61,0x83,0x1b,0x0d,0x86,0x63, -0x61,0x80,0xc6,0x03,0x00,0x30,0x30,0x00,0x1c,0x00,0x18,0x00,0x00,0x30,0x00,0x60, -0x00,0x60,0x00,0x00,0x0c,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80, -0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xc0,0x60,0x01,0x54,0x86,0xc0,0x7b,0xef, -0xf7,0xfb,0xfd,0xbf,0xc7,0xb7,0xdb,0xef,0xf6,0xfb,0xfb,0x7e,0xff,0x7f,0x6f,0xb7, -0xdb,0xed,0xf6,0xfb,0x7f,0xbe,0xff,0x7f,0xbf,0xfb,0xef,0xfb,0xfd,0xfe,0xdf,0x6f, -0xff,0x00,0x07,0x83,0x24,0x13,0x0c,0x30,0xc6,0x00,0x10,0x81,0x80,0x00,0x00,0x00, -0x84,0x00,0x22,0x00,0x01,0x80,0xc0,0x00,0x00,0xf4,0x00,0x00,0x2c,0x18,0xc0,0x0c, -0x46,0x20,0x90,0x00,0x18,0x0c,0x06,0x03,0x01,0x80,0xc0,0x70,0x66,0x30,0x18,0x0c, -0x06,0x01,0x80,0xc0,0x60,0x30,0x66,0x38,0x99,0x8c,0xc6,0x63,0x31,0x98,0x00,0x66, -0x31,0x98,0xcc,0x66,0x36,0x19,0x80,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0xff,0x7f,0xb8,0x1c, -0x0e,0x07,0x02,0x40,0x7c,0x70,0x3c,0x10,0x09,0x07,0x04,0x00,0xc0,0x60,0xe0,0x70, -0x38,0x1c,0x0e,0x04,0x83,0x81,0xc0,0x70,0x70,0x38,0x1c,0x07,0x02,0xc1,0xc0,0x90, -0x00,0x0c,0x00,0x04,0x86,0x43,0x69,0xb0,0x30,0x18,0x06,0x07,0x01,0x00,0x00,0x00, -0x00,0x0c,0x63,0x16,0x00,0xc0,0x61,0x62,0x01,0x80,0x06,0x63,0x31,0x80,0x00,0x00, -0x60,0x00,0xc0,0x06,0x43,0x16,0x19,0x8c,0x06,0x33,0x01,0x80,0xc0,0x63,0x0c,0x01, -0x8c,0x86,0x07,0x39,0xc5,0x86,0x63,0x61,0x99,0x8c,0x01,0x83,0x1b,0x0d,0xb6,0x63, -0x31,0x01,0x86,0x03,0x00,0x30,0x30,0x00,0x1c,0x3e,0x1b,0x03,0xc1,0xf0,0xf0,0x60, -0x3e,0x6e,0x3e,0x0f,0x8c,0x60,0xc5,0xb1,0xb8,0x38,0x6c,0x0f,0x8c,0xc7,0xc1,0x83, -0x19,0x8d,0x82,0x63,0x31,0x9f,0xc1,0x80,0xc0,0xc0,0x00,0xaa,0x86,0xc0,0x47,0xe3, -0xf1,0xf8,0xfd,0xbf,0x83,0x8f,0xc3,0xef,0xf6,0xf8,0xfc,0xff,0x3f,0x9f,0x1f,0x8f, -0xc7,0xe3,0xf1,0xfb,0x7c,0x7e,0x3f,0x8f,0x8f,0xc7,0xe3,0xf8,0xfd,0x3e,0x3f,0x6f, -0x00,0x0c,0x0d,0x43,0x03,0xe1,0x88,0x30,0xc0,0x00,0x27,0x41,0x80,0x00,0x00,0x01, -0x72,0x00,0x22,0x04,0x01,0x80,0xc0,0x03,0x18,0xf4,0x00,0x00,0x0c,0x18,0xc0,0x04, -0x82,0x43,0x20,0x18,0x2c,0x16,0x0b,0x05,0x82,0xc1,0x60,0xb0,0xc0,0x30,0x18,0x0c, -0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x38,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x00,0xc7, -0x31,0x98,0xcc,0x66,0x33,0x11,0xf8,0xc8,0x7c,0x3e,0x1f,0x0f,0x87,0xc3,0xe1,0xd8, -0x3c,0x1e,0x0f,0x07,0x83,0xc7,0xc3,0xe1,0xf0,0xf8,0x06,0x37,0x07,0x03,0x81,0xc0, -0xe0,0x70,0x10,0x1d,0x31,0x98,0xcc,0x66,0x33,0x19,0xb0,0xc6,0x8f,0x7f,0x87,0x03, -0x81,0x80,0x90,0x30,0x6c,0x48,0x24,0x10,0x06,0x04,0x04,0x80,0x20,0x10,0x10,0x0e, -0x07,0x03,0x81,0xc0,0x60,0x88,0x38,0x0c,0x40,0x09,0x03,0x84,0x02,0x41,0x40,0x90, -0x00,0x0c,0x00,0x1f,0xe7,0x41,0xd1,0xa0,0x00,0x30,0x03,0x0a,0x81,0x00,0x00,0x00, -0x00,0x18,0x63,0x06,0x00,0xc0,0xc2,0x62,0x01,0xb0,0x0c,0x72,0x31,0x86,0x03,0x00, -0xc0,0x00,0x60,0x06,0x8f,0x16,0x19,0x0c,0x06,0x33,0x01,0x80,0xc0,0x63,0x0c,0x01, -0x8d,0x06,0x07,0x39,0x65,0x86,0x63,0x61,0x99,0x0e,0x01,0x83,0x19,0x89,0xb6,0x32, -0x33,0x03,0x06,0x01,0x80,0x30,0x78,0x00,0x00,0x03,0x1d,0x86,0x23,0x31,0x99,0xfc, -0x66,0x77,0x06,0x01,0x8c,0x40,0xc6,0xd9,0xdc,0x6c,0x76,0x19,0x8d,0xcc,0x27,0xf3, -0x19,0x8d,0x82,0x63,0x31,0x80,0xc0,0x80,0xc0,0x80,0x01,0x54,0x8c,0xc0,0x78,0xfc, -0x7e,0x7f,0x6f,0xcf,0x93,0xb7,0xdb,0xef,0xf9,0xfb,0xff,0xff,0xdf,0xef,0xef,0xf1, -0xf8,0xfc,0x7e,0x3f,0x9f,0x77,0xc7,0xf3,0xbf,0xf6,0xfc,0x7b,0xfd,0xbe,0xbf,0x6f, -0xff,0x0c,0x19,0x03,0x03,0x61,0x98,0x30,0x78,0x00,0x28,0x4f,0x83,0x30,0x00,0x01, -0x4a,0x00,0x1c,0x04,0x03,0x03,0x80,0x03,0x18,0xf4,0x00,0x00,0x0c,0x18,0xd9,0x84, -0x82,0x40,0xa0,0x18,0x2c,0x16,0x0b,0x05,0x82,0xc1,0x60,0xb0,0xc0,0x30,0x18,0x0c, -0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x2c,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x64,0xcb, -0x31,0x98,0xcc,0x66,0x33,0x31,0x8c,0xd8,0x06,0x03,0x01,0x80,0xc0,0x60,0x30,0x6c, -0x62,0x33,0x19,0x8c,0xc6,0x60,0xc0,0x60,0x30,0x18,0x1e,0x3b,0x8d,0x86,0xc3,0x61, -0xb0,0xd8,0x10,0x36,0x31,0x98,0xcc,0x66,0x33,0x19,0xd8,0xc6,0x0f,0x7f,0x82,0x01, -0x02,0x40,0xd0,0x40,0x6c,0x70,0x24,0x1c,0x06,0x04,0x03,0x01,0xc0,0xe0,0x10,0x12, -0x09,0x04,0x82,0x40,0x90,0x50,0x10,0x12,0x70,0x09,0x04,0x04,0x01,0xc1,0x20,0x60, -0x00,0x0c,0x00,0x04,0x83,0xc0,0x20,0xcc,0x00,0x30,0x03,0x02,0x01,0x00,0x00,0x00, -0x00,0x18,0x63,0x06,0x01,0x83,0x84,0x63,0xf1,0xd8,0x18,0x3c,0x31,0x86,0x03,0x01, -0x83,0xf8,0x30,0x1c,0x9b,0x33,0x1e,0x0c,0x06,0x33,0xe1,0x80,0xc0,0x7f,0x0c,0x01, -0x8f,0x06,0x07,0x79,0x65,0x86,0x66,0x61,0x9e,0x07,0x81,0x83,0x19,0x89,0xb6,0x1c, -0x1a,0x03,0x06,0x01,0x80,0x30,0x48,0x00,0x00,0x03,0x18,0xcc,0x06,0x33,0x18,0x60, -0xc6,0x63,0x06,0x01,0x8c,0x80,0xc6,0xd9,0x8c,0xc6,0x63,0x31,0x8e,0x4c,0x01,0x83, -0x19,0x8d,0x92,0x32,0x31,0x81,0x87,0x00,0xc0,0x70,0xe4,0xaa,0x98,0xc0,0x7d,0xfe, -0xfd,0xbf,0x2f,0xbf,0x93,0x8f,0xdb,0xe3,0xf9,0xfb,0xff,0x1e,0x3f,0x1f,0xef,0xed, -0xf6,0xfb,0x7d,0xbf,0x6f,0xaf,0xef,0xed,0x8f,0xf6,0xfb,0xfb,0xfe,0x3e,0xdf,0x9f, -0x00,0x00,0x19,0x0f,0xc6,0x30,0xd0,0x00,0xcc,0x00,0x28,0x59,0x86,0x67,0xf0,0x01, -0x72,0x00,0x00,0x3f,0x86,0x00,0xc0,0x03,0x18,0xf4,0x00,0x00,0x0c,0x18,0xcc,0xc5, -0x32,0x83,0x4c,0x00,0x66,0x33,0x19,0x8c,0xc6,0x63,0x31,0xbc,0xc0,0x3e,0x1f,0x0f, -0x87,0xc1,0x80,0xc0,0x60,0x30,0xfb,0x2c,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x38,0xcb, -0x31,0x98,0xcc,0x66,0x31,0xa1,0x8c,0xcc,0x06,0x03,0x01,0x80,0xc0,0x60,0x30,0x6c, -0xc0,0x63,0x31,0x98,0xcc,0x60,0xc0,0x60,0x30,0x18,0x37,0x31,0x98,0xcc,0x66,0x33, -0x19,0x8c,0x00,0x67,0x31,0x98,0xcc,0x66,0x33,0x19,0x8c,0xc6,0x1f,0x7f,0x82,0x01, -0x02,0x40,0xb0,0x40,0x6c,0x07,0x03,0x83,0x80,0xe0,0xe0,0x00,0x18,0x0e,0x10,0x10, -0x08,0x04,0x02,0x00,0xf0,0x20,0x10,0x1e,0x08,0x89,0x03,0x00,0xe0,0x38,0x1c,0x0e, -0x00,0x0c,0x00,0x04,0x81,0xe0,0x41,0x6c,0x00,0x30,0x03,0x00,0x0f,0xe0,0x03,0xf8, -0x00,0x30,0x63,0x06,0x03,0x00,0xc7,0xf0,0x39,0x8c,0x30,0x3e,0x1b,0x80,0x00,0x03, -0x00,0x00,0x18,0x30,0x9b,0x23,0x19,0x0c,0x06,0x33,0x01,0xf8,0xc6,0x63,0x0c,0x01, -0x8d,0x86,0x05,0xd9,0x35,0x86,0x7c,0x61,0x9b,0x01,0xc1,0x83,0x19,0x99,0xb4,0x1c, -0x0c,0x06,0x06,0x00,0xc0,0x30,0xcc,0x00,0x00,0x3f,0x18,0xcc,0x06,0x33,0xf8,0x60, -0xc6,0x63,0x06,0x01,0x8f,0x00,0xc6,0xd9,0x8c,0xc6,0x63,0x31,0x8c,0x0f,0x81,0x83, -0x18,0xd9,0xba,0x1c,0x1b,0x03,0x00,0x80,0xc0,0x81,0x75,0x54,0x98,0xc0,0x7d,0xfe, -0xfd,0xbf,0x4f,0xbf,0x93,0xf8,0xfc,0x7c,0x7f,0x1f,0x1f,0x6f,0xe7,0xf1,0xef,0xef, -0xf7,0xfb,0xfd,0xff,0x0f,0xdf,0xef,0xe1,0xf7,0x76,0xfc,0xff,0x1f,0xc7,0xe3,0xf1, -0xff,0x08,0x19,0x03,0x06,0x31,0xf8,0x00,0xc6,0x00,0x28,0x5b,0x8c,0xc0,0x11,0xf1, -0x4a,0x00,0x00,0x04,0x0c,0x00,0xc0,0x03,0x18,0x74,0x38,0x00,0x0c,0x18,0xc6,0x65, -0x52,0xb8,0x54,0x18,0x46,0x23,0x11,0x88,0xc4,0x62,0x31,0x30,0xc0,0x30,0x18,0x0c, -0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x26,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x10,0xd3, -0x31,0x98,0xcc,0x66,0x30,0xc1,0x8c,0xc6,0x7e,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xfc, -0xc0,0x7f,0x3f,0x9f,0xcf,0xe0,0xc0,0x60,0x30,0x18,0x63,0x31,0x98,0xcc,0x66,0x33, -0x19,0x8c,0xfe,0x6b,0x31,0x98,0xcc,0x66,0x31,0xb1,0x8c,0x6c,0x0e,0x7f,0x82,0x01, -0x01,0x80,0x90,0x30,0xc6,0x08,0x01,0x02,0x00,0x40,0x80,0xe0,0x24,0x04,0x1c,0x10, -0x08,0x04,0x02,0x00,0x90,0x20,0x10,0x12,0x0d,0x86,0x00,0x81,0x00,0x40,0x20,0x10, -0x00,0x04,0x00,0x1f,0xe1,0x70,0xbb,0x28,0x00,0x30,0x03,0x00,0x01,0x00,0x00,0x00, -0x00,0x30,0x63,0x06,0x06,0x00,0x67,0xf0,0x19,0x8c,0x30,0x67,0x0d,0x80,0x00,0x01, -0x83,0xf8,0x30,0x30,0x9b,0x7f,0x19,0x8c,0x06,0x33,0x01,0x80,0xc6,0x63,0x0c,0x01, -0x8c,0xc6,0x05,0xd9,0x35,0x86,0x60,0x61,0x99,0x80,0xe1,0x83,0x18,0xd0,0xdc,0x26, -0x0c,0x0c,0x06,0x00,0xc0,0x30,0x84,0x00,0x00,0x63,0x18,0xcc,0x06,0x33,0x00,0x60, -0xc6,0x63,0x06,0x01,0x8d,0x80,0xc6,0xd9,0x8c,0xc6,0x63,0x31,0x8c,0x03,0xe1,0x83, -0x18,0xd9,0xba,0x1c,0x1b,0x06,0x01,0x80,0xc0,0xc1,0x38,0xaa,0x80,0xc0,0x7d,0xfe, -0xfe,0x7f,0x6f,0xcf,0x39,0xf7,0xfe,0xfd,0xff,0xbf,0x7f,0x0f,0xdb,0xfb,0xe3,0xef, -0xf7,0xfb,0xfd,0xff,0x6f,0xdf,0xef,0xed,0xf2,0x79,0xff,0x7e,0xff,0xbf,0xdf,0xef, -0x00,0x0c,0x19,0x03,0x03,0x60,0x60,0x30,0x66,0x00,0x28,0x4d,0xc6,0x60,0x10,0x00, -0x84,0x00,0x00,0x04,0x0f,0x87,0x80,0x03,0x18,0x14,0x38,0x00,0x3f,0x0f,0x8c,0xc2, -0x90,0x84,0xa4,0x18,0xfe,0x7f,0x3f,0x9f,0xcf,0xe7,0xf1,0xf0,0xc0,0x30,0x18,0x0c, -0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x26,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x38,0xd3, -0x31,0x98,0xcc,0x66,0x30,0xc1,0x98,0xc6,0xc6,0x63,0x31,0x98,0xcc,0x66,0x33,0x60, -0xc0,0x60,0x30,0x18,0x0c,0x00,0xc0,0x60,0x30,0x18,0x63,0x31,0x98,0xcc,0x66,0x33, -0x19,0x8c,0x00,0x6b,0x31,0x98,0xcc,0x66,0x31,0xb1,0x8c,0x6c,0x1c,0x7f,0x81,0x20, -0x90,0x38,0x18,0x0b,0x83,0x06,0x01,0x03,0x80,0x40,0xe0,0x90,0x24,0x04,0x03,0x8e, -0x86,0xc3,0x61,0x90,0x24,0x12,0x0e,0x04,0x8a,0x81,0xc7,0x70,0xc0,0x30,0x18,0x0c, -0x00,0x00,0x00,0x04,0x81,0x31,0x6f,0x30,0x00,0x18,0x06,0x00,0x01,0x00,0x00,0x00, -0x00,0x60,0x63,0x06,0x0c,0x00,0x60,0x60,0x19,0x8c,0x60,0x63,0x01,0x80,0x00,0x00, -0xc0,0x00,0x60,0x00,0x4d,0xe1,0x99,0x8c,0x06,0x33,0x01,0x80,0xc6,0x63,0x0c,0x01, -0x8c,0xc6,0x04,0x99,0x1d,0x86,0x60,0x61,0x99,0x80,0x61,0x83,0x18,0xd0,0xdc,0x63, -0x0c,0x0c,0x06,0x00,0x60,0x30,0x84,0x00,0x00,0x63,0x18,0xcc,0x06,0x33,0x00,0x60, -0x6e,0x63,0x06,0x01,0x8c,0xc0,0xc6,0xd9,0x8c,0xc6,0x63,0x31,0x8c,0x00,0x61,0x83, -0x18,0xd0,0xcc,0x26,0x0e,0x0c,0x03,0x00,0xc0,0x60,0x01,0x54,0x98,0xc0,0x7e,0xdf, -0x6f,0xc7,0xe7,0xf4,0x7c,0xf9,0xfe,0xfc,0x7f,0xbf,0x1f,0x5f,0xdb,0xfb,0xfc,0x71, -0x79,0x3c,0x9e,0x6f,0xdb,0xed,0xf1,0xfb,0x75,0x7e,0x38,0x8f,0x3f,0xcf,0xe7,0xf3, -0xff,0x0c,0x0d,0x03,0x03,0xe1,0xf8,0x30,0x3c,0x00,0x27,0x40,0x03,0x30,0x00,0x00, -0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x14,0x00,0x00,0x00,0x00,0x19,0x82, -0xf8,0x98,0xbe,0x70,0xc3,0x61,0xb0,0xd8,0x6c,0x36,0x1b,0x30,0xc0,0x30,0x18,0x0c, -0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x23,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x4c,0xe3, -0x31,0x98,0xcc,0x66,0x30,0xc1,0xf0,0xc6,0xc6,0x63,0x31,0x98,0xcc,0x66,0x33,0x60, -0xc0,0x60,0x30,0x18,0x0c,0x00,0xc0,0x60,0x30,0x18,0x63,0x31,0x98,0xcc,0x66,0x33, -0x19,0x8c,0x10,0x73,0x31,0x98,0xcc,0x66,0x30,0xe1,0x8c,0x38,0x1c,0x7f,0x80,0xa0, -0x50,0x10,0x24,0x0d,0xff,0x01,0x01,0x02,0x00,0x40,0x80,0xf0,0x24,0x04,0x02,0x01, -0x81,0x20,0x10,0x30,0x28,0x1a,0x09,0x06,0x8a,0x81,0x20,0x90,0x20,0x08,0x04,0x02, -0x00,0x0c,0x00,0x04,0x85,0x32,0x6f,0xb8,0x00,0x18,0x06,0x00,0x01,0x01,0xc0,0x00, -0x70,0x60,0x36,0x06,0x1f,0xcc,0xe0,0x63,0x30,0xd8,0x60,0x63,0x33,0x06,0x03,0x00, -0x60,0x00,0xc0,0x30,0x60,0x61,0x99,0x86,0x66,0x63,0x01,0x80,0x66,0x63,0x0c,0x03, -0x0c,0x66,0x04,0x19,0x1c,0xcc,0x60,0x33,0x18,0xcc,0x61,0x81,0xb0,0x60,0xcc,0x63, -0x0c,0x18,0x06,0x00,0x60,0x30,0x00,0x00,0x00,0x67,0x19,0x86,0x23,0x71,0x88,0x60, -0x36,0x63,0x06,0x01,0x8c,0x60,0xc6,0xd9,0x8c,0x6c,0x66,0x1b,0x8c,0x08,0x61,0x83, -0xb8,0x70,0xcc,0x63,0x0c,0x18,0x03,0x00,0xc0,0x60,0x00,0xaa,0x98,0xc0,0x7f,0x5f, -0xaf,0xef,0xdb,0xf2,0x00,0xfe,0xfe,0xfd,0xff,0xbf,0x7f,0x6f,0xdb,0xfb,0xfd,0xfe, -0x7e,0xdf,0xef,0xcf,0xd7,0xe5,0xf6,0xf9,0x75,0x7e,0xdf,0x6f,0xdf,0xf7,0xfb,0xfd, -0x00,0x0c,0x07,0xc6,0x04,0x10,0x60,0x30,0x06,0x00,0x10,0x80,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x3f,0x80,0x00,0x00,0x03,0xb8,0x14,0x00,0x00,0x00,0x00,0x00,0x04, -0x11,0x21,0x04,0xc0,0xc3,0x61,0xb0,0xd8,0x6c,0x36,0x1b,0x30,0x66,0x30,0x18,0x0c, -0x06,0x01,0x80,0xc0,0x60,0x30,0x66,0x23,0x99,0x8c,0xc6,0x63,0x31,0x98,0x00,0x66, -0x1b,0x0d,0x86,0xc3,0x60,0xc1,0x80,0xc6,0xce,0x67,0x33,0x99,0xcc,0xe6,0x73,0x74, -0x62,0x31,0x18,0x8c,0x46,0x20,0xc0,0x60,0x30,0x18,0x36,0x31,0x8d,0x86,0xc3,0x61, -0xb0,0xd8,0x10,0x36,0x3b,0x9d,0xce,0xe7,0x70,0xc1,0x98,0x30,0x00,0x7f,0x80,0xc0, -0x60,0x10,0x24,0x0c,0x38,0x0e,0x01,0x02,0x00,0x40,0x80,0xa0,0x18,0x0e,0x03,0x00, -0x80,0x40,0x60,0x50,0x30,0x16,0x0e,0x05,0x88,0x81,0xc0,0x81,0xc0,0x70,0x38,0x1c, -0x00,0x0c,0x00,0x04,0x83,0xe0,0x39,0xcc,0x00,0x0c,0x0c,0x00,0x00,0x01,0xc0,0x00, -0x70,0xc0,0x1c,0x06,0x1f,0xc7,0xc0,0x61,0xe0,0x70,0x60,0x3e,0x1e,0x06,0x03,0x00, -0x00,0x00,0x00,0x30,0x1e,0x61,0x9f,0x03,0xc7,0xc3,0xf1,0x80,0x3e,0x63,0x3f,0x1e, -0x0c,0x67,0xe4,0x19,0x0c,0x78,0x60,0x1e,0x18,0xc7,0xc1,0x80,0xe0,0x60,0xcc,0x63, -0x0c,0x1f,0xc6,0x00,0x30,0x30,0x00,0x00,0x00,0x3b,0x9f,0x03,0xc1,0xb0,0xf0,0x60, -0x06,0x63,0x06,0x01,0x8c,0x70,0xc6,0xd9,0x8c,0x38,0x7c,0x0d,0x8c,0x07,0xc0,0xf1, -0xd8,0x60,0xcc,0x63,0x0c,0x1f,0xc3,0x00,0xc0,0x60,0x01,0x54,0x80,0xc0,0x7f,0x3f, -0x9f,0xef,0xdb,0xf3,0xc7,0xf1,0xfe,0xfd,0xff,0xbf,0x7f,0xff,0xe7,0xf1,0xfc,0xff, -0x7f,0xbf,0x9f,0xaf,0xcf,0xe9,0xf1,0xfa,0x77,0x7e,0x3f,0x7e,0x3f,0x8f,0xc7,0xe3, -0xff,0x0c,0x01,0x0f,0xe8,0x08,0x60,0x30,0xc6,0x00,0x0f,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xd8,0x14,0x00,0x00,0x00,0x00,0x00,0x04, -0x11,0x3d,0x04,0xc0,0xc3,0x61,0xb0,0xd8,0x6c,0x36,0x1b,0x3c,0x3c,0x3f,0x1f,0x8f, -0xc7,0xe7,0xe3,0xf1,0xf8,0xfc,0x7c,0x21,0x8f,0x07,0x83,0xc1,0xe0,0xf0,0x00,0xbc, -0x0e,0x07,0x03,0x81,0xc0,0xc1,0x80,0xcc,0x77,0x3b,0x9d,0xce,0xe7,0x73,0xb9,0x98, -0x3c,0x1e,0x0f,0x07,0x83,0xc0,0xc0,0x60,0x30,0x18,0x1c,0x31,0x87,0x03,0x81,0xc0, -0xe0,0x70,0x00,0x5c,0x1d,0x8e,0xc7,0x63,0xb0,0xc1,0xf0,0x30,0x00,0x7f,0x81,0x40, -0xa0,0x10,0x28,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x02,0x00, -0x80,0x80,0x10,0xf8,0x28,0x12,0x09,0x04,0x80,0x01,0x20,0x80,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x06,0x18,0x00,0x00,0x00,0x40,0x00, -0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x07,0xc0,0x31,0xf0,0x01,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0xcc,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x80,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x18,0x00,0x01,0xe0,0xc3,0xc0,0x00,0x00,0xff,0xc0,0x7e,0xbf, -0x5f,0xef,0xd7,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff, -0x7f,0x7f,0xef,0x07,0xd7,0xed,0xf6,0xfb,0x7f,0xfe,0xdf,0x7f,0xff,0xff,0xff,0xff, -0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x30,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x08,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x81,0x80,0x60,0x00,0x7f,0x81,0x20, -0x90,0x10,0x1c,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80, -0x81,0xe0,0x60,0x10,0x24,0x12,0x0e,0x04,0x80,0x01,0xc0,0x70,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x78,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x80,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xfe,0xdf, -0x6f,0xef,0xe3,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x7f, -0x7e,0x1f,0x9f,0xef,0xdb,0xed,0xf1,0xfb,0x7f,0xfe,0x3f,0x8f,0xff,0xff,0xff,0xff, -0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x81,0x80,0x60,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x32,0x35,0x36,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x31,0x35,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x33,0x20, -0x00,0x00,0x01,0x0c,0x00,0x09,0x09,0x00,0x01,0x0f,0x00,0x09,0x12,0x00,0x01,0x0f, -0x00,0x09,0x1b,0x00,0x01,0x0f,0x00,0x09,0x24,0x00,0x01,0x0f,0x00,0x09,0x2d,0x00, -0x01,0x0f,0x00,0x09,0x36,0x00,0x01,0x0f,0x00,0x09,0x3f,0x00,0x03,0x0d,0x00,0x09, -0x48,0x00,0x03,0x0d,0x00,0x09,0x51,0x00,0x03,0x0d,0x00,0x09,0x5a,0x00,0x03,0x0d, -0x00,0x09,0x63,0x00,0x03,0x0d,0x00,0x09,0x6c,0x00,0x03,0x0d,0x00,0x09,0x75,0x00, -0x03,0x0e,0x00,0x09,0x7e,0x00,0x03,0x0d,0x00,0x09,0x87,0x00,0x03,0x0d,0x00,0x09, -0x90,0x00,0x01,0x0f,0x00,0x09,0x99,0x00,0x01,0x0f,0x00,0x09,0xa2,0x00,0x01,0x0f, -0x00,0x09,0xab,0x00,0x01,0x0f,0x00,0x09,0xb4,0x00,0x01,0x0f,0x00,0x09,0xbd,0x00, -0x01,0x0f,0x00,0x09,0xc6,0x00,0x01,0x0f,0x00,0x09,0xcf,0x00,0x01,0x0f,0x00,0x09, -0xd8,0x00,0x01,0x0f,0x00,0x09,0xe1,0x00,0x03,0x0d,0x00,0x09,0xea,0x00,0x01,0x0f, -0x00,0x09,0xf3,0x00,0x01,0x0f,0x00,0x09,0xfc,0x00,0x03,0x0d,0x00,0x09,0x05,0x01, -0x03,0x0d,0x00,0x09,0x0e,0x01,0x03,0x0d,0x00,0x09,0x17,0x01,0x03,0x0d,0x00,0x09, -0x20,0x01,0x00,0x00,0x00,0x09,0x29,0x01,0x03,0x0d,0x00,0x09,0x32,0x01,0x02,0x05, -0x00,0x09,0x3b,0x01,0x03,0x0d,0x00,0x09,0x44,0x01,0x02,0x0e,0x00,0x09,0x4d,0x01, -0x03,0x0d,0x00,0x09,0x56,0x01,0x03,0x0d,0x00,0x09,0x5f,0x01,0x02,0x06,0x00,0x09, -0x68,0x01,0x02,0x0e,0x00,0x09,0x71,0x01,0x02,0x0e,0x00,0x09,0x7a,0x01,0x03,0x08, -0x00,0x09,0x83,0x01,0x05,0x0c,0x00,0x09,0x8c,0x01,0x0b,0x0f,0x00,0x09,0x95,0x01, -0x08,0x09,0x00,0x09,0x9e,0x01,0x0b,0x0d,0x00,0x09,0xa7,0x01,0x02,0x0e,0x00,0x09, -0xb0,0x01,0x03,0x0d,0x00,0x09,0xb9,0x01,0x03,0x0d,0x00,0x09,0xc2,0x01,0x03,0x0d, -0x00,0x09,0xcb,0x01,0x03,0x0d,0x00,0x09,0xd4,0x01,0x03,0x0d,0x00,0x09,0xdd,0x01, -0x03,0x0d,0x00,0x09,0xe6,0x01,0x03,0x0d,0x00,0x09,0xef,0x01,0x03,0x0d,0x00,0x09, -0xf8,0x01,0x03,0x0d,0x00,0x09,0x01,0x02,0x03,0x0d,0x00,0x09,0x0a,0x02,0x06,0x0d, -0x00,0x09,0x13,0x02,0x06,0x0f,0x00,0x09,0x1c,0x02,0x05,0x0c,0x00,0x09,0x25,0x02, -0x07,0x0a,0x00,0x09,0x2e,0x02,0x05,0x0c,0x00,0x09,0x37,0x02,0x03,0x0d,0x00,0x09, -0x40,0x02,0x03,0x0d,0x00,0x09,0x49,0x02,0x03,0x0d,0x00,0x09,0x52,0x02,0x03,0x0d, -0x00,0x09,0x5b,0x02,0x03,0x0d,0x00,0x09,0x64,0x02,0x03,0x0d,0x00,0x09,0x6d,0x02, -0x03,0x0d,0x00,0x09,0x76,0x02,0x03,0x0d,0x00,0x09,0x7f,0x02,0x03,0x0d,0x00,0x09, -0x88,0x02,0x03,0x0d,0x00,0x09,0x91,0x02,0x03,0x0d,0x00,0x09,0x9a,0x02,0x03,0x0d, -0x00,0x09,0xa3,0x02,0x03,0x0d,0x00,0x09,0xac,0x02,0x03,0x0d,0x00,0x09,0xb5,0x02, -0x03,0x0d,0x00,0x09,0xbe,0x02,0x03,0x0d,0x00,0x09,0xc7,0x02,0x03,0x0d,0x00,0x09, -0xd0,0x02,0x03,0x0d,0x00,0x09,0xd9,0x02,0x03,0x0f,0x00,0x09,0xe2,0x02,0x03,0x0d, -0x00,0x09,0xeb,0x02,0x03,0x0d,0x00,0x09,0xf4,0x02,0x03,0x0d,0x00,0x09,0xfd,0x02, -0x03,0x0d,0x00,0x09,0x06,0x03,0x03,0x0d,0x00,0x09,0x0f,0x03,0x03,0x0d,0x00,0x09, -0x18,0x03,0x03,0x0d,0x00,0x09,0x21,0x03,0x03,0x0d,0x00,0x09,0x2a,0x03,0x03,0x0d, -0x00,0x09,0x33,0x03,0x02,0x0e,0x00,0x09,0x3c,0x03,0x02,0x0e,0x00,0x09,0x45,0x03, -0x02,0x0e,0x00,0x09,0x4e,0x03,0x04,0x0b,0x00,0x09,0x57,0x03,0x0d,0x0e,0x00,0x09, -0x60,0x03,0x02,0x06,0x00,0x09,0x69,0x03,0x05,0x0d,0x00,0x09,0x72,0x03,0x02,0x0d, -0x00,0x09,0x7b,0x03,0x05,0x0d,0x00,0x09,0x84,0x03,0x02,0x0d,0x00,0x09,0x8d,0x03, -0x05,0x0d,0x00,0x09,0x96,0x03,0x02,0x0d,0x00,0x09,0x9f,0x03,0x05,0x0f,0x00,0x09, -0xa8,0x03,0x02,0x0d,0x00,0x09,0xb1,0x03,0x02,0x0d,0x00,0x09,0xba,0x03,0x02,0x0f, -0x00,0x09,0xc3,0x03,0x02,0x0d,0x00,0x09,0xcc,0x03,0x02,0x0d,0x00,0x09,0xd5,0x03, -0x05,0x0d,0x00,0x09,0xde,0x03,0x05,0x0d,0x00,0x09,0xe7,0x03,0x05,0x0d,0x00,0x09, -0xf0,0x03,0x05,0x0f,0x00,0x09,0xf9,0x03,0x05,0x0f,0x00,0x09,0x02,0x04,0x05,0x0d, -0x00,0x09,0x0b,0x04,0x05,0x0d,0x00,0x09,0x14,0x04,0x03,0x0d,0x00,0x09,0x1d,0x04, -0x05,0x0d,0x00,0x09,0x26,0x04,0x05,0x0d,0x00,0x09,0x2f,0x04,0x05,0x0d,0x00,0x09, -0x38,0x04,0x05,0x0d,0x00,0x09,0x41,0x04,0x05,0x0f,0x00,0x09,0x4a,0x04,0x05,0x0d, -0x00,0x09,0x53,0x04,0x02,0x0e,0x00,0x09,0x5c,0x04,0x02,0x0e,0x00,0x09,0x65,0x04, -0x02,0x0e,0x00,0x09,0x6e,0x04,0x07,0x0a,0x00,0x09,0x77,0x04,0x01,0x0d,0x00,0x09, -0x80,0x04,0x00,0x0e,0x00,0x09,0x89,0x04,0x00,0x0f,0x00,0x09,0x92,0x04,0x00,0x0f, -0x00,0x09,0x9b,0x04,0x00,0x0f,0x00,0x09,0xa4,0x04,0x00,0x0f,0x00,0x09,0xad,0x04, -0x00,0x0f,0x00,0x09,0xb6,0x04,0x00,0x0f,0x00,0x09,0xbf,0x04,0x00,0x0f,0x00,0x09, -0xc8,0x04,0x00,0x0f,0x00,0x09,0xd1,0x04,0x00,0x0f,0x00,0x09,0xda,0x04,0x00,0x0f, -0x00,0x09,0xe3,0x04,0x00,0x0f,0x00,0x09,0xec,0x04,0x00,0x0f,0x00,0x09,0xf5,0x04, -0x00,0x0f,0x00,0x09,0xfe,0x04,0x00,0x0f,0x00,0x09,0x07,0x05,0x00,0x0f,0x00,0x09, -0x10,0x05,0x00,0x0f,0x00,0x09,0x19,0x05,0x00,0x0f,0x00,0x09,0x22,0x05,0x00,0x0f, -0x00,0x09,0x2b,0x05,0x00,0x0f,0x00,0x09,0x34,0x05,0x00,0x0f,0x00,0x09,0x3d,0x05, -0x00,0x0f,0x00,0x09,0x46,0x05,0x00,0x0f,0x00,0x09,0x4f,0x05,0x00,0x0f,0x00,0x09, -0x58,0x05,0x00,0x0f,0x00,0x09,0x61,0x05,0x00,0x0f,0x00,0x09,0x6a,0x05,0x00,0x0f, -0x00,0x09,0x73,0x05,0x00,0x0f,0x00,0x09,0x7c,0x05,0x00,0x0f,0x00,0x09,0x85,0x05, -0x00,0x0f,0x00,0x09,0x8e,0x05,0x00,0x0f,0x00,0x09,0x97,0x05,0x00,0x0f,0x00,0x09, -0xa0,0x05,0x00,0x0d,0x00,0x09,0xa9,0x05,0x05,0x0f,0x00,0x09,0xb2,0x05,0x02,0x0e, -0x00,0x09,0xbb,0x05,0x03,0x0d,0x00,0x09,0xc4,0x05,0x03,0x0d,0x00,0x09,0xcd,0x05, -0x03,0x0d,0x00,0x09,0xd6,0x05,0x02,0x0e,0x00,0x09,0xdf,0x05,0x03,0x0e,0x00,0x09, -0xe8,0x05,0x02,0x04,0x00,0x09,0xf1,0x05,0x03,0x0d,0x00,0x09,0xfa,0x05,0x03,0x0a, -0x00,0x09,0x03,0x06,0x06,0x0b,0x00,0x09,0x0c,0x06,0x07,0x0a,0x00,0x09,0x15,0x06, -0x08,0x09,0x00,0x09,0x1e,0x06,0x03,0x0b,0x00,0x09,0x27,0x06,0x02,0x03,0x00,0x09, -0x30,0x06,0x03,0x07,0x00,0x09,0x39,0x06,0x05,0x0c,0x00,0x09,0x42,0x06,0x03,0x0a, -0x00,0x09,0x4b,0x06,0x03,0x0a,0x00,0x09,0x54,0x06,0x02,0x04,0x00,0x09,0x5d,0x06, -0x05,0x0f,0x00,0x09,0x66,0x06,0x03,0x0e,0x00,0x09,0x6f,0x06,0x08,0x0a,0x00,0x09, -0x78,0x06,0x0d,0x0f,0x00,0x09,0x81,0x06,0x03,0x0a,0x00,0x09,0x8a,0x06,0x03,0x0a, -0x00,0x09,0x93,0x06,0x06,0x0b,0x00,0x09,0x9c,0x06,0x03,0x0d,0x00,0x09,0xa5,0x06, -0x03,0x0d,0x00,0x09,0xae,0x06,0x03,0x0d,0x00,0x09,0xb7,0x06,0x05,0x0f,0x00,0x09, -0xc0,0x06,0x00,0x0d,0x00,0x09,0xc9,0x06,0x00,0x0d,0x00,0x09,0xd2,0x06,0x00,0x0d, -0x00,0x09,0xdb,0x06,0x00,0x0d,0x00,0x09,0xe4,0x06,0x00,0x0d,0x00,0x09,0xed,0x06, -0x01,0x0d,0x00,0x09,0xf6,0x06,0x03,0x0d,0x00,0x09,0xff,0x06,0x03,0x0f,0x00,0x09, -0x08,0x07,0x00,0x0d,0x00,0x09,0x11,0x07,0x00,0x0d,0x00,0x09,0x1a,0x07,0x00,0x0d, -0x00,0x09,0x23,0x07,0x00,0x0d,0x00,0x09,0x2c,0x07,0x00,0x0d,0x00,0x09,0x35,0x07, -0x00,0x0d,0x00,0x09,0x3e,0x07,0x00,0x0d,0x00,0x09,0x47,0x07,0x00,0x0d,0x00,0x09, -0x50,0x07,0x03,0x0d,0x00,0x09,0x59,0x07,0x00,0x0d,0x00,0x09,0x62,0x07,0x00,0x0d, -0x00,0x09,0x6b,0x07,0x00,0x0d,0x00,0x09,0x74,0x07,0x00,0x0d,0x00,0x09,0x7d,0x07, -0x00,0x0d,0x00,0x09,0x86,0x07,0x00,0x0d,0x00,0x09,0x8f,0x07,0x06,0x0b,0x00,0x09, -0x98,0x07,0x03,0x0d,0x00,0x09,0xa1,0x07,0x00,0x0d,0x00,0x09,0xaa,0x07,0x00,0x0d, -0x00,0x09,0xb3,0x07,0x00,0x0d,0x00,0x09,0xbc,0x07,0x00,0x0d,0x00,0x09,0xc5,0x07, -0x00,0x0d,0x00,0x09,0xce,0x07,0x03,0x0d,0x00,0x09,0xd7,0x07,0x02,0x0d,0x00,0x09, -0xe0,0x07,0x02,0x0d,0x00,0x09,0xe9,0x07,0x02,0x0d,0x00,0x09,0xf2,0x07,0x02,0x0d, -0x00,0x09,0xfb,0x07,0x02,0x0d,0x00,0x09,0x04,0x08,0x02,0x0d,0x00,0x09,0x0d,0x08, -0x02,0x0d,0x00,0x09,0x16,0x08,0x05,0x0d,0x00,0x09,0x1f,0x08,0x05,0x0f,0x00,0x09, -0x28,0x08,0x02,0x0d,0x00,0x09,0x31,0x08,0x02,0x0d,0x00,0x09,0x3a,0x08,0x02,0x0d, -0x00,0x09,0x43,0x08,0x02,0x0d,0x00,0x09,0x4c,0x08,0x02,0x0d,0x00,0x09,0x55,0x08, -0x02,0x0d,0x00,0x09,0x5e,0x08,0x02,0x0d,0x00,0x09,0x67,0x08,0x02,0x0d,0x00,0x09, -0x70,0x08,0x02,0x0d,0x00,0x09,0x79,0x08,0x02,0x0d,0x00,0x09,0x82,0x08,0x02,0x0d, -0x00,0x09,0x8b,0x08,0x02,0x0d,0x00,0x09,0x94,0x08,0x02,0x0d,0x00,0x09,0x9d,0x08, -0x02,0x0d,0x00,0x09,0xa6,0x08,0x02,0x0d,0x00,0x09,0xaf,0x08,0x05,0x0c,0x00,0x09, -0xb8,0x08,0x05,0x0d,0x00,0x09,0xc1,0x08,0x02,0x0d,0x00,0x09,0xca,0x08,0x02,0x0d, -0x00,0x09,0xd3,0x08,0x02,0x0d,0x00,0x09,0xdc,0x08,0x02,0x0d,0x00,0x09,0xe5,0x08, -0x02,0x0f,0x00,0x09,0xee,0x08,0x03,0x0f,0x00,0x09,0xf7,0x08,0x02,0x0f,0x00,0x09, -0x00,0x09,0x00,0x00,0x00,0x00, -}; - -int sizeofdefont = sizeof defontdata; - -void -_unpackinfo(Fontchar *fc, uchar *p, int n) -{ - int j; - - for(j=0; j<=n; j++){ - fc->x = p[0]|(p[1]<<8); - fc->top = p[2]; - fc->bottom = p[3]; - fc->left = p[4]; - fc->width = p[5]; - fc++; - p += 6; - } -} diff --git a/sys/src/cmd/unix/drawterm/libdraw/drawrepl.c b/sys/src/cmd/unix/drawterm/libdraw/drawrepl.c deleted file mode 100644 index c72fee26a..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/drawrepl.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -int -drawreplxy(int min, int max, int x) -{ - int sx; - - sx = (x-min)%(max-min); - if(sx < 0) - sx += max-min; - return sx+min; -} - -Point -drawrepl(Rectangle r, Point p) -{ - p.x = drawreplxy(r.min.x, r.max.x, p.x); - p.y = drawreplxy(r.min.y, r.max.y, p.y); - return p; -} - diff --git a/sys/src/cmd/unix/drawterm/libdraw/icossin.c b/sys/src/cmd/unix/drawterm/libdraw/icossin.c deleted file mode 100644 index b66417d4d..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/icossin.c +++ /dev/null @@ -1,140 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -/* - * Integer sine and cosine for integral degree argument. - * Tables computed by (sin,cos)(PI*d/180). - */ -static short sinus[91] = { - 0, /* 0 */ - 18, /* 1 */ - 36, /* 2 */ - 54, /* 3 */ - 71, /* 4 */ - 89, /* 5 */ - 107, /* 6 */ - 125, /* 7 */ - 143, /* 8 */ - 160, /* 9 */ - 178, /* 10 */ - 195, /* 11 */ - 213, /* 12 */ - 230, /* 13 */ - 248, /* 14 */ - 265, /* 15 */ - 282, /* 16 */ - 299, /* 17 */ - 316, /* 18 */ - 333, /* 19 */ - 350, /* 20 */ - 367, /* 21 */ - 384, /* 22 */ - 400, /* 23 */ - 416, /* 24 */ - 433, /* 25 */ - 449, /* 26 */ - 465, /* 27 */ - 481, /* 28 */ - 496, /* 29 */ - 512, /* 30 */ - 527, /* 31 */ - 543, /* 32 */ - 558, /* 33 */ - 573, /* 34 */ - 587, /* 35 */ - 602, /* 36 */ - 616, /* 37 */ - 630, /* 38 */ - 644, /* 39 */ - 658, /* 40 */ - 672, /* 41 */ - 685, /* 42 */ - 698, /* 43 */ - 711, /* 44 */ - 724, /* 45 */ - 737, /* 46 */ - 749, /* 47 */ - 761, /* 48 */ - 773, /* 49 */ - 784, /* 50 */ - 796, /* 51 */ - 807, /* 52 */ - 818, /* 53 */ - 828, /* 54 */ - 839, /* 55 */ - 849, /* 56 */ - 859, /* 57 */ - 868, /* 58 */ - 878, /* 59 */ - 887, /* 60 */ - 896, /* 61 */ - 904, /* 62 */ - 912, /* 63 */ - 920, /* 64 */ - 928, /* 65 */ - 935, /* 66 */ - 943, /* 67 */ - 949, /* 68 */ - 956, /* 69 */ - 962, /* 70 */ - 968, /* 71 */ - 974, /* 72 */ - 979, /* 73 */ - 984, /* 74 */ - 989, /* 75 */ - 994, /* 76 */ - 998, /* 77 */ - 1002, /* 78 */ - 1005, /* 79 */ - 1008, /* 80 */ - 1011, /* 81 */ - 1014, /* 82 */ - 1016, /* 83 */ - 1018, /* 84 */ - 1020, /* 85 */ - 1022, /* 86 */ - 1023, /* 87 */ - 1023, /* 88 */ - 1024, /* 89 */ - 1024, /* 90 */ -}; - -void -icossin(int deg, int *cosp, int *sinp) -{ - int sinsign, cossign; - short *stp, *ctp; - - deg %= 360; - if(deg < 0) - deg += 360; - sinsign = 1; - cossign = 1; - stp = 0; - ctp = 0; - switch(deg/90){ - case 2: - sinsign = -1; - cossign = -1; - deg -= 180; - /* fall through */ - case 0: - stp = &sinus[deg]; - ctp = &sinus[90-deg]; - break; - case 3: - sinsign = -1; - cossign = -1; - deg -= 180; - /* fall through */ - case 1: - deg = 180-deg; - cossign = -cossign; - stp = &sinus[deg]; - ctp = &sinus[90-deg]; - break; - } - *sinp = sinsign*stp[0]; - *cosp = cossign*ctp[0]; -} diff --git a/sys/src/cmd/unix/drawterm/libdraw/icossin2.c b/sys/src/cmd/unix/drawterm/libdraw/icossin2.c deleted file mode 100644 index aa864e1a3..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/icossin2.c +++ /dev/null @@ -1,261 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -/* - * Sine and Cosine of arctangents, calculated by - * (sin(atan(index/100.0))*1024.+0.5) - * (cos(atan(index/100.0))*1024.+0.5) - * To use, get rational tangent between 0<=tan<=1, scale by 100, - * and look up sin and cos, and use linear interpolation. divide by 1024. - * Maximum error is 0.0020. Without linear interpolation, it's 0.010. - */ -static -short sinus[] = { - 0, /* 0.00 */ - 10, /* 0.01 */ - 20, /* 0.02 */ - 31, /* 0.03 */ - 41, /* 0.04 */ - 51, /* 0.05 */ - 61, /* 0.06 */ - 72, /* 0.07 */ - 82, /* 0.08 */ - 92, /* 0.09 */ - 102, /* 0.10 */ - 112, /* 0.11 */ - 122, /* 0.12 */ - 132, /* 0.13 */ - 142, /* 0.14 */ - 152, /* 0.15 */ - 162, /* 0.16 */ - 172, /* 0.17 */ - 181, /* 0.18 */ - 191, /* 0.19 */ - 201, /* 0.20 */ - 210, /* 0.21 */ - 220, /* 0.22 */ - 230, /* 0.23 */ - 239, /* 0.24 */ - 248, /* 0.25 */ - 258, /* 0.26 */ - 267, /* 0.27 */ - 276, /* 0.28 */ - 285, /* 0.29 */ - 294, /* 0.30 */ - 303, /* 0.31 */ - 312, /* 0.32 */ - 321, /* 0.33 */ - 330, /* 0.34 */ - 338, /* 0.35 */ - 347, /* 0.36 */ - 355, /* 0.37 */ - 364, /* 0.38 */ - 372, /* 0.39 */ - 380, /* 0.40 */ - 388, /* 0.41 */ - 397, /* 0.42 */ - 405, /* 0.43 */ - 412, /* 0.44 */ - 420, /* 0.45 */ - 428, /* 0.46 */ - 436, /* 0.47 */ - 443, /* 0.48 */ - 451, /* 0.49 */ - 458, /* 0.50 */ - 465, /* 0.51 */ - 472, /* 0.52 */ - 480, /* 0.53 */ - 487, /* 0.54 */ - 493, /* 0.55 */ - 500, /* 0.56 */ - 507, /* 0.57 */ - 514, /* 0.58 */ - 520, /* 0.59 */ - 527, /* 0.60 */ - 533, /* 0.61 */ - 540, /* 0.62 */ - 546, /* 0.63 */ - 552, /* 0.64 */ - 558, /* 0.65 */ - 564, /* 0.66 */ - 570, /* 0.67 */ - 576, /* 0.68 */ - 582, /* 0.69 */ - 587, /* 0.70 */ - 593, /* 0.71 */ - 598, /* 0.72 */ - 604, /* 0.73 */ - 609, /* 0.74 */ - 614, /* 0.75 */ - 620, /* 0.76 */ - 625, /* 0.77 */ - 630, /* 0.78 */ - 635, /* 0.79 */ - 640, /* 0.80 */ - 645, /* 0.81 */ - 649, /* 0.82 */ - 654, /* 0.83 */ - 659, /* 0.84 */ - 663, /* 0.85 */ - 668, /* 0.86 */ - 672, /* 0.87 */ - 676, /* 0.88 */ - 681, /* 0.89 */ - 685, /* 0.90 */ - 689, /* 0.91 */ - 693, /* 0.92 */ - 697, /* 0.93 */ - 701, /* 0.94 */ - 705, /* 0.95 */ - 709, /* 0.96 */ - 713, /* 0.97 */ - 717, /* 0.98 */ - 720, /* 0.99 */ - 724, /* 1.00 */ - 728, /* 1.01 */ -}; - -static -short cosinus[] = { - 1024, /* 0.00 */ - 1024, /* 0.01 */ - 1024, /* 0.02 */ - 1024, /* 0.03 */ - 1023, /* 0.04 */ - 1023, /* 0.05 */ - 1022, /* 0.06 */ - 1022, /* 0.07 */ - 1021, /* 0.08 */ - 1020, /* 0.09 */ - 1019, /* 0.10 */ - 1018, /* 0.11 */ - 1017, /* 0.12 */ - 1015, /* 0.13 */ - 1014, /* 0.14 */ - 1013, /* 0.15 */ - 1011, /* 0.16 */ - 1010, /* 0.17 */ - 1008, /* 0.18 */ - 1006, /* 0.19 */ - 1004, /* 0.20 */ - 1002, /* 0.21 */ - 1000, /* 0.22 */ - 998, /* 0.23 */ - 996, /* 0.24 */ - 993, /* 0.25 */ - 991, /* 0.26 */ - 989, /* 0.27 */ - 986, /* 0.28 */ - 983, /* 0.29 */ - 981, /* 0.30 */ - 978, /* 0.31 */ - 975, /* 0.32 */ - 972, /* 0.33 */ - 969, /* 0.34 */ - 967, /* 0.35 */ - 963, /* 0.36 */ - 960, /* 0.37 */ - 957, /* 0.38 */ - 954, /* 0.39 */ - 951, /* 0.40 */ - 947, /* 0.41 */ - 944, /* 0.42 */ - 941, /* 0.43 */ - 937, /* 0.44 */ - 934, /* 0.45 */ - 930, /* 0.46 */ - 927, /* 0.47 */ - 923, /* 0.48 */ - 920, /* 0.49 */ - 916, /* 0.50 */ - 912, /* 0.51 */ - 909, /* 0.52 */ - 905, /* 0.53 */ - 901, /* 0.54 */ - 897, /* 0.55 */ - 893, /* 0.56 */ - 890, /* 0.57 */ - 886, /* 0.58 */ - 882, /* 0.59 */ - 878, /* 0.60 */ - 874, /* 0.61 */ - 870, /* 0.62 */ - 866, /* 0.63 */ - 862, /* 0.64 */ - 859, /* 0.65 */ - 855, /* 0.66 */ - 851, /* 0.67 */ - 847, /* 0.68 */ - 843, /* 0.69 */ - 839, /* 0.70 */ - 835, /* 0.71 */ - 831, /* 0.72 */ - 827, /* 0.73 */ - 823, /* 0.74 */ - 819, /* 0.75 */ - 815, /* 0.76 */ - 811, /* 0.77 */ - 807, /* 0.78 */ - 804, /* 0.79 */ - 800, /* 0.80 */ - 796, /* 0.81 */ - 792, /* 0.82 */ - 788, /* 0.83 */ - 784, /* 0.84 */ - 780, /* 0.85 */ - 776, /* 0.86 */ - 773, /* 0.87 */ - 769, /* 0.88 */ - 765, /* 0.89 */ - 761, /* 0.90 */ - 757, /* 0.91 */ - 754, /* 0.92 */ - 750, /* 0.93 */ - 746, /* 0.94 */ - 742, /* 0.95 */ - 739, /* 0.96 */ - 735, /* 0.97 */ - 731, /* 0.98 */ - 728, /* 0.99 */ - 724, /* 1.00 */ - 720, /* 1.01 */ -}; - -void -icossin2(int x, int y, int *cosp, int *sinp) -{ - int sinsign, cossign, tan, tan10, rem; - short *stp, *ctp; - - if(x == 0){ - if(y >= 0) - *sinp = ICOSSCALE, *cosp = 0; - else - *sinp = -ICOSSCALE, *cosp = 0; - return; - } - sinsign = cossign = 1; - if(x < 0){ - cossign = -1; - x = -x; - } - if(y < 0){ - sinsign = -1; - y = -y; - } - if(y > x){ - tan = 1000*x/y; - tan10 = tan/10; - stp = &cosinus[tan10]; - ctp = &sinus[tan10]; - }else{ - tan = 1000*y/x; - tan10 = tan/10; - stp = &sinus[tan10]; - ctp = &cosinus[tan10]; - } - rem = tan-(tan10*10); - *sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10); - *cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10); -} diff --git a/sys/src/cmd/unix/drawterm/libdraw/rectclip.c b/sys/src/cmd/unix/drawterm/libdraw/rectclip.c deleted file mode 100644 index 2228628b8..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/rectclip.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -int -rectclip(Rectangle *rp, Rectangle b) /* first by reference, second by value */ -{ - Rectangle *bp = &b; - /* - * Expand rectXrect() in line for speed - */ - if((rp->min.x<bp->max.x && bp->min.x<rp->max.x && - rp->min.y<bp->max.y && bp->min.y<rp->max.y)==0) - return 0; - /* They must overlap */ - if(rp->min.x < bp->min.x) - rp->min.x = bp->min.x; - if(rp->min.y < bp->min.y) - rp->min.y = bp->min.y; - if(rp->max.x > bp->max.x) - rp->max.x = bp->max.x; - if(rp->max.y > bp->max.y) - rp->max.y = bp->max.y; - return 1; -} diff --git a/sys/src/cmd/unix/drawterm/libdraw/rgb.c b/sys/src/cmd/unix/drawterm/libdraw/rgb.c deleted file mode 100644 index eda28b4c8..000000000 --- a/sys/src/cmd/unix/drawterm/libdraw/rgb.c +++ /dev/null @@ -1,99 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> - -/* - * This original version, although fast and a true inverse of - * cmap2rgb, in the sense that rgb2cmap(cmap2rgb(c)) - * returned the original color, does a terrible job for RGB - * triples that do not appear in the color map, so it has been - * replaced by the much slower version below, that loops - * over the color map looking for the nearest point in RGB - * space. There is no visual psychology reason for that - * criterion, but it's easy to implement and the results are - * far more pleasing. - * -int -rgb2cmap(int cr, int cg, int cb) -{ - int r, g, b, v, cv; - - if(cr < 0) - cr = 0; - else if(cr > 255) - cr = 255; - if(cg < 0) - cg = 0; - else if(cg > 255) - cg = 255; - if(cb < 0) - cb = 0; - else if(cb > 255) - cb = 255; - r = cr>>6; - g = cg>>6; - b = cb>>6; - cv = cr; - if(cg > cv) - cv = cg; - if(cb > cv) - cv = cb; - v = (cv>>4)&3; - return ((((r<<2)+v)<<4)+(((g<<2)+b+v-r)&15)); -} -*/ - -int -rgb2cmap(int cr, int cg, int cb) -{ - int i, r, g, b, sq; - ulong rgb; - int best, bestsq; - - best = 0; - bestsq = 0x7FFFFFFF; - for(i=0; i<256; i++){ - rgb = cmap2rgb(i); - r = (rgb>>16) & 0xFF; - g = (rgb>>8) & 0xFF; - b = (rgb>>0) & 0xFF; - sq = (r-cr)*(r-cr)+(g-cg)*(g-cg)+(b-cb)*(b-cb); - if(sq < bestsq){ - bestsq = sq; - best = i; - } - } - return best; -} - -int -cmap2rgb(int c) -{ - int j, num, den, r, g, b, v, rgb; - - r = c>>6; - v = (c>>4)&3; - j = (c-v+r)&15; - g = j>>2; - b = j&3; - den=r; - if(g>den) - den=g; - if(b>den) - den=b; - if(den==0) { - v *= 17; - rgb = (v<<16)|(v<<8)|v; - } - else{ - num=17*(4*den+v); - rgb = ((r*num/den)<<16)|((g*num/den)<<8)|(b*num/den); - } - return rgb; -} - -int -cmap2rgba(int c) -{ - return (cmap2rgb(c)<<8)|0xFF; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/Makefile b/sys/src/cmd/unix/drawterm/libmemdraw/Makefile deleted file mode 100644 index cabf3fdd7..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libmemdraw.a - -OFILES=\ - alloc.$O\ - arc.$O\ - cload.$O\ - cmap.$O\ - cread.$O\ - defont.$O\ - draw.$O\ - ellipse.$O\ - fillpoly.$O\ - hwdraw.$O\ - line.$O\ - load.$O\ - openmemsubfont.$O\ - poly.$O\ - read.$O\ - string.$O\ - subfont.$O\ - unload.$O\ - write.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/alloc.c b/sys/src/cmd/unix/drawterm/libmemdraw/alloc.c deleted file mode 100644 index 1f41d2dfd..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/alloc.c +++ /dev/null @@ -1,204 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -#define poolalloc(a, b) malloc(b) -#define poolfree(a, b) free(b) - -void -memimagemove(void *from, void *to) -{ - Memdata *md; - - md = *(Memdata**)to; - if(md->base != from){ - print("compacted data not right: #%p\n", md->base); - abort(); - } - md->base = to; - - /* if allocmemimage changes this must change too */ - md->bdata = (uchar*)md->base+sizeof(Memdata*)+sizeof(ulong); -} - -Memimage* -allocmemimaged(Rectangle r, ulong chan, Memdata *md, void *X) -{ - int d; - ulong l; - Memimage *i; - - if(Dx(r) <= 0 || Dy(r) <= 0){ - werrstr("bad rectangle %R", r); - return nil; - } - if((d = chantodepth(chan)) == 0) { - werrstr("bad channel descriptor %.8lux", chan); - return nil; - } - - l = wordsperline(r, d); - - i = mallocz(sizeof(Memimage), 1); - if(i == nil) - return nil; - - i->X = X; - i->data = md; - i->zero = sizeof(ulong)*l*r.min.y; - - if(r.min.x >= 0) - i->zero += (r.min.x*d)/8; - else - i->zero -= (-r.min.x*d+7)/8; - i->zero = -i->zero; - i->width = l; - i->r = r; - i->clipr = r; - i->flags = 0; - i->layer = nil; - i->cmap = memdefcmap; - if(memsetchan(i, chan) < 0){ - free(i); - return nil; - } - return i; -} - -Memimage* -_allocmemimage(Rectangle r, ulong chan) -{ - int d; - u32int l, nw; - uchar *p; - Memdata *md; - Memimage *i; - - if((d = chantodepth(chan)) == 0) { - werrstr("bad channel descriptor %.8lux", chan); - return nil; - } - - l = wordsperline(r, d); - nw = l*Dy(r); - md = malloc(sizeof(Memdata)); - if(md == nil) - return nil; - - md->ref = 1; - md->base = poolalloc(imagmem, sizeof(Memdata*)+(1+nw)*sizeof(ulong)); - if(md->base == nil){ - free(md); - return nil; - } - - p = (uchar*)md->base; - *(Memdata**)p = md; - p += sizeof(Memdata*); - - *(ulong*)p = getcallerpc(&r); - p += sizeof(ulong); - - /* if this changes, memimagemove must change too */ - md->bdata = p; - md->allocd = 1; - - i = allocmemimaged(r, chan, md, nil); - if(i == nil){ - poolfree(imagmem, md->base); - free(md); - return nil; - } - md->imref = i; - return i; -} - -void -_freememimage(Memimage *i) -{ - if(i == nil) - return; - if(i->data->ref-- == 1 && i->data->allocd){ - if(i->data->base) - poolfree(imagmem, i->data->base); - free(i->data); - } - free(i); -} - -/* - * Wordaddr is deprecated. - */ -ulong* -wordaddr(Memimage *i, Point p) -{ - return (ulong*) ((uintptr)byteaddr(i, p) & ~(sizeof(ulong)-1)); -} - -uchar* -byteaddr(Memimage *i, Point p) -{ - uchar *a; - - a = i->data->bdata+i->zero+sizeof(ulong)*p.y*i->width; - - if(i->depth < 8){ - /* - * We need to always round down, - * but C rounds toward zero. - */ - int np; - np = 8/i->depth; - if(p.x < 0) - return a+(p.x-np+1)/np; - else - return a+p.x/np; - } - else - return a+p.x*(i->depth/8); -} - -int -memsetchan(Memimage *i, ulong chan) -{ - int d; - int t, j, k; - ulong cc; - int bytes; - - if((d = chantodepth(chan)) == 0) { - werrstr("bad channel descriptor"); - return -1; - } - - i->depth = d; - i->chan = chan; - i->flags &= ~(Fgrey|Falpha|Fcmap|Fbytes); - bytes = 1; - for(cc=chan, j=0, k=0; cc; j+=NBITS(cc), cc>>=8, k++){ - t=TYPE(cc); - if(t < 0 || t >= NChan){ - werrstr("bad channel string"); - return -1; - } - if(t == CGrey) - i->flags |= Fgrey; - if(t == CAlpha) - i->flags |= Falpha; - if(t == CMap && i->cmap == nil){ - i->cmap = memdefcmap; - i->flags |= Fcmap; - } - - i->shift[t] = j; - i->mask[t] = (1<<NBITS(cc))-1; - i->nbits[t] = NBITS(cc); - if(NBITS(cc) != 8) - bytes = 0; - } - i->nchan = k; - if(bytes) - i->flags |= Fbytes; - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/alpha.hoc b/sys/src/cmd/unix/drawterm/libmemdraw/alpha.hoc deleted file mode 100644 index 2f2494233..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/alpha.hoc +++ /dev/null @@ -1,9 +0,0 @@ -func f(x) { - return x-x%1 -} - -func pixel(dr, dg, db, da, sr, sg, sb, sa, m) { - M = 255-f((sa*m)/255) - print f((sr*m+dr*M)/255), " ", f((sg*m+dg*M)/255), " ", f((sb*m+db*M)/255), " ", f((sa*m+da*M)/255), "\n" - return 0 -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/arc.c b/sys/src/cmd/unix/drawterm/libmemdraw/arc.c deleted file mode 100644 index a0854c0f6..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/arc.c +++ /dev/null @@ -1,117 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -/* - * elarc(dst,c,a,b,t,src,sp,alpha,phi) - * draws the part of an ellipse between rays at angles alpha and alpha+phi - * measured counterclockwise from the positive x axis. other - * arguments are as for ellipse(dst,c,a,b,t,src,sp) - */ - -enum -{ - R, T, L, B /* right, top, left, bottom */ -}; - -static -Point corners[] = { - {1,1}, - {-1,1}, - {-1,-1}, - {1,-1} -}; - -static -Point p00; - -/* - * make a "wedge" mask covering the desired angle and contained in - * a surrounding square; draw a full ellipse; intersect that with the - * wedge to make a mask through which to copy src to dst. - */ -void -memarc(Memimage *dst, Point c, int a, int b, int t, Memimage *src, Point sp, int alpha, int phi, int op) -{ - int i, w, beta, tmp, c1, c2, m, m1; - Rectangle rect; - Point p, bnd[8]; - Memimage *wedge, *figure, *mask; - - if(a < 0) - a = -a; - if(b < 0) - b = -b; - w = t; - if(w < 0) - w = 0; - alpha = -alpha; /* compensate for upside-down coords */ - phi = -phi; - beta = alpha + phi; - if(phi < 0){ - tmp = alpha; - alpha = beta; - beta = tmp; - phi = -phi; - } - if(phi >= 360){ - memellipse(dst, c, a, b, t, src, sp, op); - return; - } - while(alpha < 0) - alpha += 360; - while(beta < 0) - beta += 360; - c1 = alpha/90 & 3; /* number of nearest corner */ - c2 = beta/90 & 3; - /* - * icossin returns point at radius ICOSSCALE. - * multiplying by m1 moves it outside the ellipse - */ - rect = Rect(-a-w, -b-w, a+w+1, b+w+1); - m = rect.max.x; /* inradius of bounding square */ - if(m < rect.max.y) - m = rect.max.y; - m1 = (m+ICOSSCALE-1) >> 10; - m = m1 << 10; /* assure m1*cossin is inside */ - i = 0; - bnd[i++] = Pt(0,0); - icossin(alpha, &p.x, &p.y); - bnd[i++] = mulpt(p, m1); - for(;;) { - bnd[i++] = mulpt(corners[c1], m); - if(c1==c2 && phi<180) - break; - c1 = (c1+1) & 3; - phi -= 90; - } - icossin(beta, &p.x, &p.y); - bnd[i++] = mulpt(p, m1); - - figure = nil; - mask = nil; - wedge = allocmemimage(rect, GREY1); - if(wedge == nil) - goto Return; - memfillcolor(wedge, DTransparent); - memfillpoly(wedge, bnd, i, ~0, memopaque, p00, S); - figure = allocmemimage(rect, GREY1); - if(figure == nil) - goto Return; - memfillcolor(figure, DTransparent); - memellipse(figure, p00, a, b, t, memopaque, p00, S); - mask = allocmemimage(rect, GREY1); - if(mask == nil) - goto Return; - memfillcolor(mask, DTransparent); - memimagedraw(mask, rect, figure, rect.min, wedge, rect.min, S); - c = subpt(c, dst->r.min); - memdraw(dst, dst->r, src, subpt(sp, c), mask, subpt(p00, c), op); - - Return: - freememimage(wedge); - freememimage(figure); - freememimage(mask); -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/arctest.c b/sys/src/cmd/unix/drawterm/libmemdraw/arctest.c deleted file mode 100644 index a9ad1fb99..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/arctest.c +++ /dev/null @@ -1,62 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -extern int drawdebug; -void -main(int argc, char **argv) -{ - char cc; - Memimage *x; - Point c = {208,871}; - int a = 441; - int b = 441; - int thick = 0; - Point sp = {0,0}; - int alpha = 51; - int phi = 3; - vlong t0, t1; - int i, n; - vlong del; - - memimageinit(); - - x = allocmemimage(Rect(0,0,1000,1000), CMAP8); - n = atoi(argv[1]); - - t0 = nsec(); - t0 = nsec(); - t0 = nsec(); - t1 = nsec(); - del = t1-t0; - t0 = nsec(); - for(i=0; i<n; i++) - memarc(x, c, a, b, thick, memblack, sp, alpha, phi, SoverD); - t1 = nsec(); - print("%lld %lld\n", t1-t0-del, del); -} - -int drawdebug = 0; - -void -rdb(void) -{ -} - -int -iprint(char *fmt, ...) -{ - int n; - va_list va; - char buf[1024]; - - va_start(va, fmt); - n = doprint(buf, buf+sizeof buf, fmt, va) - buf; - va_end(va); - - write(1,buf,n); - return 1; -} - diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/cload.c b/sys/src/cmd/unix/drawterm/libmemdraw/cload.c deleted file mode 100644 index 472caa6ba..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/cload.c +++ /dev/null @@ -1,68 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -_cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - int y, bpl, c, cnt, offs; - uchar mem[NMEM], *memp, *omemp, *emem, *linep, *elinep, *u, *eu; - - if(!rectinrect(r, i->r)) - return -1; - bpl = bytesperline(r, i->depth); - u = data; - eu = data+ndata; - memp = mem; - emem = mem+NMEM; - y = r.min.y; - linep = byteaddr(i, Pt(r.min.x, y)); - elinep = linep+bpl; - for(;;){ - if(linep == elinep){ - if(++y == r.max.y) - break; - linep = byteaddr(i, Pt(r.min.x, y)); - elinep = linep+bpl; - } - if(u == eu){ /* buffer too small */ - return -1; - } - c = *u++; - if(c >= 128){ - for(cnt=c-128+1; cnt!=0 ;--cnt){ - if(u == eu){ /* buffer too small */ - return -1; - } - if(linep == elinep){ /* phase error */ - return -1; - } - *linep++ = *u; - *memp++ = *u++; - if(memp == emem) - memp = mem; - } - } - else{ - if(u == eu) /* short buffer */ - return -1; - offs = *u++ + ((c&3)<<8)+1; - if(memp-mem < offs) - omemp = memp+(NMEM-offs); - else - omemp = memp-offs; - for(cnt=(c>>2)+NMATCH; cnt!=0; --cnt){ - if(linep == elinep) /* phase error */ - return -1; - *linep++ = *omemp; - *memp++ = *omemp++; - if(omemp == emem) - omemp = mem; - if(memp == emem) - memp = mem; - } - } - } - return u-data; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/cmap.c b/sys/src/cmd/unix/drawterm/libmemdraw/cmap.c deleted file mode 100644 index 2561c3f1c..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/cmap.c +++ /dev/null @@ -1,320 +0,0 @@ -/* - * generated by mkcmap.c - */ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -static Memcmap def = { -/* cmap2rgb */ { - 0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x88,0x00,0x00,0xcc,0x00,0x44,0x00,0x00, - 0x44,0x44,0x00,0x44,0x88,0x00,0x44,0xcc,0x00,0x88,0x00,0x00,0x88,0x44,0x00,0x88, - 0x88,0x00,0x88,0xcc,0x00,0xcc,0x00,0x00,0xcc,0x44,0x00,0xcc,0x88,0x00,0xcc,0xcc, - 0x00,0xdd,0xdd,0x11,0x11,0x11,0x00,0x00,0x55,0x00,0x00,0x99,0x00,0x00,0xdd,0x00, - 0x55,0x00,0x00,0x55,0x55,0x00,0x4c,0x99,0x00,0x49,0xdd,0x00,0x99,0x00,0x00,0x99, - 0x4c,0x00,0x99,0x99,0x00,0x93,0xdd,0x00,0xdd,0x00,0x00,0xdd,0x49,0x00,0xdd,0x93, - 0x00,0xee,0x9e,0x00,0xee,0xee,0x22,0x22,0x22,0x00,0x00,0x66,0x00,0x00,0xaa,0x00, - 0x00,0xee,0x00,0x66,0x00,0x00,0x66,0x66,0x00,0x55,0xaa,0x00,0x4f,0xee,0x00,0xaa, - 0x00,0x00,0xaa,0x55,0x00,0xaa,0xaa,0x00,0x9e,0xee,0x00,0xee,0x00,0x00,0xee,0x4f, - 0x00,0xff,0x55,0x00,0xff,0xaa,0x00,0xff,0xff,0x33,0x33,0x33,0x00,0x00,0x77,0x00, - 0x00,0xbb,0x00,0x00,0xff,0x00,0x77,0x00,0x00,0x77,0x77,0x00,0x5d,0xbb,0x00,0x55, - 0xff,0x00,0xbb,0x00,0x00,0xbb,0x5d,0x00,0xbb,0xbb,0x00,0xaa,0xff,0x00,0xff,0x00, - 0x44,0x00,0x44,0x44,0x00,0x88,0x44,0x00,0xcc,0x44,0x44,0x00,0x44,0x44,0x44,0x44, - 0x44,0x88,0x44,0x44,0xcc,0x44,0x88,0x00,0x44,0x88,0x44,0x44,0x88,0x88,0x44,0x88, - 0xcc,0x44,0xcc,0x00,0x44,0xcc,0x44,0x44,0xcc,0x88,0x44,0xcc,0xcc,0x44,0x00,0x00, - 0x55,0x00,0x00,0x55,0x00,0x55,0x4c,0x00,0x99,0x49,0x00,0xdd,0x55,0x55,0x00,0x55, - 0x55,0x55,0x4c,0x4c,0x99,0x49,0x49,0xdd,0x4c,0x99,0x00,0x4c,0x99,0x4c,0x4c,0x99, - 0x99,0x49,0x93,0xdd,0x49,0xdd,0x00,0x49,0xdd,0x49,0x49,0xdd,0x93,0x49,0xdd,0xdd, - 0x4f,0xee,0xee,0x66,0x00,0x00,0x66,0x00,0x66,0x55,0x00,0xaa,0x4f,0x00,0xee,0x66, - 0x66,0x00,0x66,0x66,0x66,0x55,0x55,0xaa,0x4f,0x4f,0xee,0x55,0xaa,0x00,0x55,0xaa, - 0x55,0x55,0xaa,0xaa,0x4f,0x9e,0xee,0x4f,0xee,0x00,0x4f,0xee,0x4f,0x4f,0xee,0x9e, - 0x55,0xff,0xaa,0x55,0xff,0xff,0x77,0x00,0x00,0x77,0x00,0x77,0x5d,0x00,0xbb,0x55, - 0x00,0xff,0x77,0x77,0x00,0x77,0x77,0x77,0x5d,0x5d,0xbb,0x55,0x55,0xff,0x5d,0xbb, - 0x00,0x5d,0xbb,0x5d,0x5d,0xbb,0xbb,0x55,0xaa,0xff,0x55,0xff,0x00,0x55,0xff,0x55, - 0x88,0x00,0x88,0x88,0x00,0xcc,0x88,0x44,0x00,0x88,0x44,0x44,0x88,0x44,0x88,0x88, - 0x44,0xcc,0x88,0x88,0x00,0x88,0x88,0x44,0x88,0x88,0x88,0x88,0x88,0xcc,0x88,0xcc, - 0x00,0x88,0xcc,0x44,0x88,0xcc,0x88,0x88,0xcc,0xcc,0x88,0x00,0x00,0x88,0x00,0x44, - 0x99,0x00,0x4c,0x99,0x00,0x99,0x93,0x00,0xdd,0x99,0x4c,0x00,0x99,0x4c,0x4c,0x99, - 0x4c,0x99,0x93,0x49,0xdd,0x99,0x99,0x00,0x99,0x99,0x4c,0x99,0x99,0x99,0x93,0x93, - 0xdd,0x93,0xdd,0x00,0x93,0xdd,0x49,0x93,0xdd,0x93,0x93,0xdd,0xdd,0x99,0x00,0x00, - 0xaa,0x00,0x00,0xaa,0x00,0x55,0xaa,0x00,0xaa,0x9e,0x00,0xee,0xaa,0x55,0x00,0xaa, - 0x55,0x55,0xaa,0x55,0xaa,0x9e,0x4f,0xee,0xaa,0xaa,0x00,0xaa,0xaa,0x55,0xaa,0xaa, - 0xaa,0x9e,0x9e,0xee,0x9e,0xee,0x00,0x9e,0xee,0x4f,0x9e,0xee,0x9e,0x9e,0xee,0xee, - 0xaa,0xff,0xff,0xbb,0x00,0x00,0xbb,0x00,0x5d,0xbb,0x00,0xbb,0xaa,0x00,0xff,0xbb, - 0x5d,0x00,0xbb,0x5d,0x5d,0xbb,0x5d,0xbb,0xaa,0x55,0xff,0xbb,0xbb,0x00,0xbb,0xbb, - 0x5d,0xbb,0xbb,0xbb,0xaa,0xaa,0xff,0xaa,0xff,0x00,0xaa,0xff,0x55,0xaa,0xff,0xaa, - 0xcc,0x00,0xcc,0xcc,0x44,0x00,0xcc,0x44,0x44,0xcc,0x44,0x88,0xcc,0x44,0xcc,0xcc, - 0x88,0x00,0xcc,0x88,0x44,0xcc,0x88,0x88,0xcc,0x88,0xcc,0xcc,0xcc,0x00,0xcc,0xcc, - 0x44,0xcc,0xcc,0x88,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0xcc,0x00,0x44,0xcc,0x00,0x88, - 0xdd,0x00,0x93,0xdd,0x00,0xdd,0xdd,0x49,0x00,0xdd,0x49,0x49,0xdd,0x49,0x93,0xdd, - 0x49,0xdd,0xdd,0x93,0x00,0xdd,0x93,0x49,0xdd,0x93,0x93,0xdd,0x93,0xdd,0xdd,0xdd, - 0x00,0xdd,0xdd,0x49,0xdd,0xdd,0x93,0xdd,0xdd,0xdd,0xdd,0x00,0x00,0xdd,0x00,0x49, - 0xee,0x00,0x4f,0xee,0x00,0x9e,0xee,0x00,0xee,0xee,0x4f,0x00,0xee,0x4f,0x4f,0xee, - 0x4f,0x9e,0xee,0x4f,0xee,0xee,0x9e,0x00,0xee,0x9e,0x4f,0xee,0x9e,0x9e,0xee,0x9e, - 0xee,0xee,0xee,0x00,0xee,0xee,0x4f,0xee,0xee,0x9e,0xee,0xee,0xee,0xee,0x00,0x00, - 0xff,0x00,0x00,0xff,0x00,0x55,0xff,0x00,0xaa,0xff,0x00,0xff,0xff,0x55,0x00,0xff, - 0x55,0x55,0xff,0x55,0xaa,0xff,0x55,0xff,0xff,0xaa,0x00,0xff,0xaa,0x55,0xff,0xaa, - 0xaa,0xff,0xaa,0xff,0xff,0xff,0x00,0xff,0xff,0x55,0xff,0xff,0xaa,0xff,0xff,0xff, -}, -/* rgb2cmap */ { - 0x00,0x00,0x11,0x01,0x01,0x12,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x00,0x11,0x11,0x01,0x01,0x12,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x11,0x11,0x11,0x01,0x01,0x12,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x17,0x07,0x07,0x18,0x18,0x29, - 0x04,0x04,0x04,0x05,0x05,0x05,0x16,0x06,0x06,0x17,0x28,0x07,0x07,0x18,0x29,0x3a, - 0x15,0x15,0x15,0x05,0x05,0x16,0x16,0x06,0x06,0x17,0x28,0x39,0x07,0x18,0x29,0x3a, - 0x26,0x26,0x26,0x05,0x16,0x16,0x27,0x27,0x38,0x28,0x28,0x39,0x39,0x29,0x29,0x3a, - 0x37,0x37,0x37,0x09,0x09,0x09,0x27,0x38,0x0a,0x0a,0x39,0x0b,0x0b,0x0b,0x1c,0x3a, - 0x08,0x08,0x08,0x09,0x09,0x09,0x38,0x0a,0x0a,0x0a,0x1b,0x0b,0x0b,0x1c,0x1c,0x2d, - 0x19,0x19,0x19,0x09,0x1a,0x1a,0x2b,0x0a,0x0a,0x1b,0x1b,0x0b,0x0b,0x1c,0x2d,0x3e, - 0x2a,0x2a,0x2a,0x1a,0x2b,0x2b,0x2b,0x3c,0x1b,0x1b,0x2c,0x2c,0x3d,0x2d,0x2d,0x3e, - 0x3b,0x3b,0x3b,0x0d,0x0d,0x3c,0x3c,0x0e,0x0e,0x0e,0x2c,0x3d,0x0f,0x0f,0x3e,0x3e, - 0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x3c,0x0e,0x0e,0x0e,0x3d,0x0f,0x0f,0x0f,0x10,0x3e, - 0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x2f,0x0e,0x1f,0x1f,0x20,0x0f,0x0f,0x10,0x10,0x21, - 0x2e,0x2e,0x2e,0x1e,0x2f,0x2f,0x2f,0x1f,0x1f,0x20,0x20,0x31,0x10,0x10,0x21,0x21, - 0x3f,0x3f,0x3f,0x2f,0x30,0x30,0x30,0x30,0x20,0x31,0x31,0x31,0x31,0x21,0x21,0x32, - 0x00,0x11,0x11,0x01,0x01,0x12,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x11,0x11,0x11,0x01,0x01,0x12,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x11,0x11,0x22,0x22,0x01,0x12,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x04,0x04,0x22,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x17,0x07,0x07,0x18,0x18,0x29, - 0x04,0x04,0x04,0x05,0x05,0x05,0x16,0x06,0x06,0x17,0x28,0x07,0x07,0x18,0x29,0x3a, - 0x15,0x15,0x15,0x05,0x05,0x16,0x16,0x06,0x06,0x17,0x28,0x39,0x07,0x18,0x29,0x3a, - 0x26,0x26,0x26,0x05,0x16,0x16,0x27,0x27,0x38,0x28,0x28,0x39,0x39,0x29,0x29,0x3a, - 0x37,0x37,0x37,0x09,0x09,0x09,0x27,0x38,0x0a,0x0a,0x39,0x0b,0x0b,0x0b,0x1c,0x3a, - 0x08,0x08,0x08,0x09,0x09,0x09,0x38,0x0a,0x0a,0x0a,0x1b,0x0b,0x0b,0x1c,0x1c,0x2d, - 0x19,0x19,0x19,0x09,0x1a,0x1a,0x2b,0x0a,0x0a,0x1b,0x1b,0x0b,0x0b,0x1c,0x2d,0x3e, - 0x2a,0x2a,0x2a,0x1a,0x2b,0x2b,0x2b,0x3c,0x1b,0x1b,0x2c,0x2c,0x3d,0x2d,0x2d,0x3e, - 0x3b,0x3b,0x3b,0x0d,0x0d,0x3c,0x3c,0x0e,0x0e,0x0e,0x2c,0x3d,0x0f,0x0f,0x3e,0x3e, - 0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x3c,0x0e,0x0e,0x0e,0x3d,0x0f,0x0f,0x0f,0x10,0x3e, - 0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x2f,0x0e,0x1f,0x1f,0x20,0x0f,0x0f,0x10,0x10,0x21, - 0x2e,0x2e,0x2e,0x1e,0x2f,0x2f,0x2f,0x1f,0x1f,0x20,0x20,0x31,0x10,0x10,0x21,0x21, - 0x3f,0x3f,0x3f,0x2f,0x30,0x30,0x30,0x30,0x20,0x31,0x31,0x31,0x31,0x21,0x21,0x32, - 0x11,0x11,0x11,0x01,0x01,0x12,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x11,0x11,0x22,0x22,0x01,0x12,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x11,0x22,0x22,0x22,0x33,0x33,0x23,0x34,0x02,0x13,0x24,0x35,0x03,0x14,0x25,0x36, - 0x04,0x22,0x22,0x33,0x33,0x33,0x05,0x06,0x06,0x06,0x17,0x07,0x07,0x18,0x18,0x29, - 0x04,0x04,0x33,0x33,0x33,0x05,0x16,0x06,0x06,0x17,0x28,0x07,0x07,0x18,0x29,0x3a, - 0x15,0x15,0x33,0x33,0x05,0x16,0x16,0x06,0x06,0x17,0x28,0x39,0x07,0x18,0x29,0x3a, - 0x26,0x26,0x26,0x05,0x16,0x16,0x27,0x27,0x38,0x28,0x28,0x39,0x39,0x29,0x29,0x3a, - 0x37,0x37,0x37,0x09,0x09,0x09,0x27,0x38,0x0a,0x0a,0x39,0x0b,0x0b,0x0b,0x1c,0x3a, - 0x08,0x08,0x08,0x09,0x09,0x09,0x38,0x0a,0x0a,0x0a,0x1b,0x0b,0x0b,0x1c,0x1c,0x2d, - 0x19,0x19,0x19,0x09,0x1a,0x1a,0x2b,0x0a,0x0a,0x1b,0x1b,0x0b,0x0b,0x1c,0x2d,0x3e, - 0x2a,0x2a,0x2a,0x1a,0x2b,0x2b,0x2b,0x3c,0x1b,0x1b,0x2c,0x2c,0x3d,0x2d,0x2d,0x3e, - 0x3b,0x3b,0x3b,0x0d,0x0d,0x3c,0x3c,0x0e,0x0e,0x0e,0x2c,0x3d,0x0f,0x0f,0x3e,0x3e, - 0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x3c,0x0e,0x0e,0x0e,0x3d,0x0f,0x0f,0x0f,0x10,0x3e, - 0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x2f,0x0e,0x1f,0x1f,0x20,0x0f,0x0f,0x10,0x10,0x21, - 0x2e,0x2e,0x2e,0x1e,0x2f,0x2f,0x2f,0x1f,0x1f,0x20,0x20,0x31,0x10,0x10,0x21,0x21, - 0x3f,0x3f,0x3f,0x2f,0x30,0x30,0x30,0x30,0x20,0x31,0x31,0x31,0x31,0x21,0x21,0x32, - 0x4f,0x4f,0x22,0x40,0x40,0x40,0x40,0x41,0x41,0x41,0x52,0x42,0x42,0x53,0x53,0x64, - 0x4f,0x22,0x22,0x22,0x40,0x40,0x40,0x41,0x41,0x41,0x52,0x42,0x42,0x53,0x53,0x64, - 0x22,0x22,0x22,0x33,0x33,0x33,0x40,0x41,0x41,0x41,0x52,0x42,0x42,0x53,0x53,0x64, - 0x43,0x22,0x33,0x33,0x33,0x44,0x44,0x45,0x45,0x45,0x56,0x46,0x46,0x46,0x57,0x68, - 0x43,0x43,0x33,0x33,0x44,0x44,0x44,0x45,0x45,0x45,0x56,0x46,0x46,0x57,0x57,0x68, - 0x43,0x43,0x33,0x44,0x44,0x44,0x55,0x45,0x45,0x56,0x56,0x46,0x46,0x57,0x68,0x68, - 0x43,0x43,0x43,0x44,0x44,0x55,0x55,0x45,0x45,0x56,0x67,0x46,0x46,0x57,0x68,0x79, - 0x47,0x47,0x47,0x48,0x48,0x48,0x48,0x49,0x49,0x49,0x49,0x4a,0x4a,0x4a,0x5b,0x79, - 0x47,0x47,0x47,0x48,0x48,0x48,0x48,0x49,0x49,0x49,0x5a,0x4a,0x4a,0x4a,0x5b,0x6c, - 0x47,0x47,0x47,0x48,0x48,0x59,0x59,0x49,0x49,0x5a,0x5a,0x4a,0x4a,0x5b,0x5b,0x6c, - 0x58,0x58,0x58,0x59,0x59,0x59,0x6a,0x49,0x5a,0x5a,0x6b,0x6b,0x5b,0x5b,0x6c,0x7d, - 0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x6b,0x4e,0x4e,0x4e,0x6c,0x7d, - 0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x5e,0x4e,0x4e,0x4e,0x5f,0x5f, - 0x5c,0x5c,0x5c,0x4c,0x5d,0x5d,0x5d,0x4d,0x4d,0x5e,0x5e,0x4e,0x4e,0x5f,0x5f,0x60, - 0x5c,0x5c,0x5c,0x5d,0x5d,0x6e,0x6e,0x5e,0x5e,0x5e,0x6f,0x6f,0x5f,0x5f,0x60,0x60, - 0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x7f,0x7f,0x6f,0x6f,0x70,0x70,0x5f,0x60,0x60,0x71, - 0x4f,0x4f,0x40,0x40,0x40,0x40,0x51,0x41,0x41,0x52,0x63,0x42,0x42,0x53,0x64,0x75, - 0x4f,0x4f,0x22,0x40,0x40,0x40,0x51,0x41,0x41,0x52,0x63,0x42,0x42,0x53,0x64,0x75, - 0x43,0x22,0x33,0x33,0x33,0x40,0x51,0x41,0x41,0x52,0x63,0x42,0x42,0x53,0x64,0x75, - 0x43,0x43,0x33,0x33,0x44,0x44,0x44,0x45,0x45,0x45,0x56,0x46,0x46,0x57,0x57,0x68, - 0x43,0x43,0x33,0x44,0x44,0x44,0x55,0x45,0x45,0x56,0x56,0x46,0x46,0x57,0x68,0x68, - 0x43,0x43,0x43,0x44,0x44,0x55,0x55,0x45,0x45,0x56,0x67,0x46,0x46,0x57,0x68,0x79, - 0x54,0x54,0x54,0x44,0x55,0x55,0x55,0x45,0x56,0x56,0x67,0x78,0x78,0x57,0x68,0x79, - 0x47,0x47,0x47,0x48,0x48,0x48,0x48,0x49,0x49,0x49,0x49,0x4a,0x4a,0x4a,0x5b,0x79, - 0x47,0x47,0x47,0x48,0x48,0x48,0x59,0x49,0x49,0x49,0x5a,0x4a,0x4a,0x5b,0x5b,0x6c, - 0x58,0x58,0x58,0x48,0x59,0x59,0x59,0x49,0x49,0x5a,0x5a,0x4a,0x4a,0x5b,0x6c,0x6c, - 0x69,0x69,0x69,0x59,0x59,0x6a,0x6a,0x49,0x5a,0x5a,0x6b,0x6b,0x5b,0x5b,0x6c,0x7d, - 0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x7b,0x4d,0x4d,0x4d,0x6b,0x4e,0x4e,0x4e,0x7d,0x7d, - 0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x7b,0x4d,0x4d,0x4d,0x5e,0x4e,0x4e,0x4e,0x5f,0x7d, - 0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,0x5d,0x4d,0x5e,0x5e,0x5e,0x4e,0x4e,0x5f,0x5f,0x60, - 0x6d,0x6d,0x6d,0x5d,0x6e,0x6e,0x6e,0x5e,0x5e,0x6f,0x6f,0x70,0x5f,0x5f,0x60,0x60, - 0x7e,0x7e,0x7e,0x6e,0x6e,0x7f,0x7f,0x7f,0x6f,0x6f,0x70,0x70,0x70,0x60,0x60,0x71, - 0x50,0x50,0x50,0x40,0x40,0x51,0x51,0x41,0x41,0x52,0x63,0x74,0x42,0x53,0x64,0x75, - 0x50,0x50,0x50,0x40,0x40,0x51,0x51,0x41,0x41,0x52,0x63,0x74,0x42,0x53,0x64,0x75, - 0x50,0x50,0x33,0x33,0x40,0x51,0x51,0x41,0x41,0x52,0x63,0x74,0x42,0x53,0x64,0x75, - 0x43,0x43,0x33,0x44,0x44,0x44,0x55,0x45,0x45,0x56,0x56,0x46,0x46,0x57,0x68,0x68, - 0x43,0x43,0x43,0x44,0x44,0x55,0x55,0x45,0x45,0x56,0x67,0x46,0x46,0x57,0x68,0x79, - 0x54,0x54,0x54,0x44,0x55,0x55,0x55,0x45,0x56,0x56,0x67,0x78,0x78,0x57,0x68,0x79, - 0x54,0x54,0x54,0x55,0x55,0x55,0x66,0x66,0x56,0x67,0x67,0x78,0x78,0x68,0x68,0x79, - 0x47,0x47,0x47,0x48,0x48,0x48,0x66,0x49,0x49,0x49,0x78,0x78,0x4a,0x4a,0x5b,0x79, - 0x47,0x47,0x47,0x48,0x48,0x59,0x59,0x49,0x49,0x5a,0x5a,0x4a,0x4a,0x5b,0x6c,0x6c, - 0x58,0x58,0x58,0x59,0x59,0x59,0x6a,0x49,0x5a,0x5a,0x6b,0x6b,0x5b,0x5b,0x6c,0x7d, - 0x69,0x69,0x69,0x59,0x6a,0x6a,0x6a,0x7b,0x5a,0x6b,0x6b,0x6b,0x7c,0x6c,0x6c,0x7d, - 0x7a,0x7a,0x7a,0x4c,0x4c,0x7b,0x7b,0x7b,0x4d,0x6b,0x6b,0x7c,0x7c,0x4e,0x7d,0x7d, - 0x4b,0x4b,0x4b,0x4c,0x4c,0x7b,0x7b,0x4d,0x4d,0x5e,0x7c,0x7c,0x4e,0x5f,0x5f,0x7d, - 0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,0x6e,0x4d,0x5e,0x5e,0x6f,0x4e,0x5f,0x5f,0x60,0x60, - 0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6e,0x5e,0x6f,0x6f,0x6f,0x70,0x5f,0x60,0x60,0x71, - 0x7e,0x7e,0x7e,0x6e,0x7f,0x7f,0x7f,0x7f,0x6f,0x70,0x70,0x70,0x70,0x60,0x71,0x71, - 0x61,0x61,0x61,0x40,0x51,0x51,0x62,0x62,0x73,0x63,0x63,0x74,0x74,0x64,0x64,0x75, - 0x61,0x61,0x61,0x40,0x51,0x51,0x62,0x62,0x73,0x63,0x63,0x74,0x74,0x64,0x64,0x75, - 0x61,0x61,0x61,0x40,0x51,0x51,0x62,0x62,0x73,0x63,0x63,0x74,0x74,0x64,0x64,0x75, - 0x43,0x43,0x43,0x44,0x44,0x55,0x55,0x45,0x45,0x56,0x67,0x46,0x46,0x57,0x68,0x79, - 0x54,0x54,0x54,0x44,0x55,0x55,0x55,0x45,0x56,0x56,0x67,0x78,0x78,0x57,0x68,0x79, - 0x54,0x54,0x54,0x55,0x55,0x55,0x66,0x66,0x56,0x67,0x67,0x78,0x78,0x68,0x68,0x79, - 0x65,0x65,0x65,0x55,0x55,0x66,0x66,0x66,0x77,0x67,0x78,0x78,0x78,0x78,0x79,0x79, - 0x65,0x65,0x65,0x48,0x48,0x66,0x66,0x77,0x77,0x77,0x78,0x78,0x78,0x5b,0x79,0x79, - 0x76,0x76,0x76,0x48,0x59,0x59,0x77,0x77,0x77,0x5a,0x5a,0x4a,0x4a,0x5b,0x6c,0x6c, - 0x69,0x69,0x69,0x59,0x59,0x6a,0x6a,0x77,0x5a,0x5a,0x6b,0x6b,0x5b,0x6c,0x6c,0x7d, - 0x69,0x69,0x69,0x6a,0x6a,0x6a,0x7b,0x7b,0x5a,0x6b,0x6b,0x7c,0x7c,0x6c,0x7d,0x7d, - 0x7a,0x7a,0x7a,0x4c,0x7b,0x7b,0x7b,0x7b,0x4d,0x6b,0x7c,0x7c,0x7c,0x7c,0x7d,0x7d, - 0x7a,0x7a,0x7a,0x4c,0x7b,0x7b,0x7b,0x7b,0x4d,0x5e,0x7c,0x7c,0x7c,0x5f,0x5f,0x7d, - 0x6d,0x6d,0x6d,0x5d,0x5d,0x6e,0x7b,0x5e,0x5e,0x6f,0x6f,0x7c,0x5f,0x5f,0x60,0x60, - 0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x7f,0x7f,0x6f,0x6f,0x70,0x70,0x5f,0x60,0x60,0x71, - 0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x7f,0x7f,0x6f,0x70,0x70,0x70,0x70,0x60,0x71,0x71, - 0x72,0x72,0x72,0x8f,0x8f,0x62,0x62,0x73,0x73,0x80,0x74,0x81,0x81,0x81,0x92,0x75, - 0x72,0x72,0x72,0x8f,0x8f,0x62,0x62,0x73,0x73,0x80,0x74,0x81,0x81,0x81,0x92,0x75, - 0x72,0x72,0x72,0x83,0x83,0x62,0x62,0x73,0x73,0x80,0x74,0x81,0x81,0x81,0x92,0x75, - 0x82,0x82,0x82,0x83,0x83,0x83,0x83,0x84,0x84,0x84,0x84,0x85,0x85,0x85,0x96,0x79, - 0x82,0x82,0x82,0x83,0x83,0x83,0x66,0x84,0x84,0x84,0x67,0x85,0x85,0x85,0x96,0x79, - 0x65,0x65,0x65,0x83,0x83,0x66,0x66,0x66,0x84,0x84,0x78,0x78,0x85,0x85,0x96,0x79, - 0x65,0x65,0x65,0x83,0x66,0x66,0x66,0x77,0x77,0x77,0x78,0x78,0x78,0x96,0x79,0x79, - 0x76,0x76,0x76,0x87,0x87,0x66,0x77,0x77,0x77,0x88,0x78,0x89,0x89,0x89,0x89,0x79, - 0x76,0x76,0x76,0x87,0x87,0x87,0x77,0x77,0x88,0x88,0x88,0x89,0x89,0x89,0x9a,0x9a, - 0x86,0x86,0x86,0x87,0x87,0x87,0x77,0x88,0x88,0x88,0x6b,0x89,0x89,0x9a,0x9a,0x7d, - 0x7a,0x7a,0x7a,0x87,0x6a,0x7b,0x7b,0x7b,0x88,0x6b,0x6b,0x7c,0x7c,0x9a,0x7d,0x7d, - 0x8a,0x8a,0x8a,0x8b,0x8b,0x7b,0x7b,0x8c,0x8c,0x8c,0x7c,0x7c,0x8d,0x8d,0x7d,0x7d, - 0x8a,0x8a,0x8a,0x8b,0x8b,0x8b,0x7b,0x8c,0x8c,0x8c,0x7c,0x8d,0x8d,0x8d,0x9e,0x9e, - 0x8a,0x8a,0x8a,0x8b,0x8b,0x8b,0x9c,0x8c,0x8c,0x9d,0x9d,0x8d,0x8d,0x9e,0x9e,0x9e, - 0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0x7f,0x8c,0x9d,0x9d,0x70,0x70,0x9e,0x9e,0x9e,0x71, - 0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x7f,0x7f,0x9d,0x70,0x70,0x70,0x9e,0x9e,0x71,0x71, - 0x8e,0x8e,0x8e,0x8f,0x8f,0x8f,0x73,0x73,0x80,0x80,0x91,0x81,0x81,0x92,0x92,0xa3, - 0x8e,0x8e,0x8e,0x8f,0x8f,0x8f,0x73,0x73,0x80,0x80,0x91,0x81,0x81,0x92,0x92,0xa3, - 0x82,0x82,0x82,0x83,0x83,0x83,0x73,0x73,0x80,0x80,0x91,0x81,0x81,0x92,0x92,0xa3, - 0x82,0x82,0x82,0x83,0x83,0x83,0x83,0x84,0x84,0x84,0x95,0x85,0x85,0x85,0x96,0xa7, - 0x82,0x82,0x82,0x83,0x83,0x83,0x94,0x84,0x84,0x84,0x95,0x85,0x85,0x96,0x96,0xa7, - 0x82,0x82,0x82,0x83,0x83,0x94,0x94,0x84,0x84,0x95,0x95,0x85,0x85,0x96,0xa7,0xa7, - 0x76,0x76,0x76,0x83,0x94,0x94,0x77,0x77,0x77,0x95,0x95,0x85,0x85,0x96,0xa7,0xa7, - 0x76,0x76,0x76,0x87,0x87,0x87,0x77,0x77,0x88,0x88,0x88,0x89,0x89,0x89,0x9a,0x9a, - 0x86,0x86,0x86,0x87,0x87,0x87,0x77,0x88,0x88,0x88,0x99,0x89,0x89,0x9a,0x9a,0xab, - 0x86,0x86,0x86,0x87,0x87,0x98,0x98,0x88,0x88,0x99,0x99,0x89,0x89,0x9a,0x9a,0xab, - 0x97,0x97,0x97,0x98,0x98,0x98,0x98,0x88,0x99,0x99,0x99,0x89,0x9a,0x9a,0xab,0xab, - 0x8a,0x8a,0x8a,0x8b,0x8b,0x8b,0x8b,0x8c,0x8c,0x8c,0x8c,0x8d,0x8d,0x8d,0xab,0xbc, - 0x8a,0x8a,0x8a,0x8b,0x8b,0x8b,0x8b,0x8c,0x8c,0x8c,0x9d,0x8d,0x8d,0x8d,0x9e,0x9e, - 0x9b,0x9b,0x9b,0x8b,0x9c,0x9c,0x9c,0x8c,0x9d,0x9d,0x9d,0x8d,0x8d,0x9e,0x9e,0xaf, - 0x9b,0x9b,0x9b,0x9c,0x9c,0xad,0xad,0x9d,0x9d,0x9d,0xae,0xae,0x9e,0x9e,0xaf,0xaf, - 0xac,0xac,0xac,0xad,0xad,0xad,0xad,0x9d,0xae,0xae,0xae,0xbf,0x9e,0xaf,0xaf,0xaf, - 0x9f,0x9f,0x9f,0x8f,0x90,0x90,0xa1,0x80,0x80,0x91,0x91,0x81,0x81,0x92,0xa3,0xb4, - 0x9f,0x9f,0x9f,0x8f,0x90,0x90,0xa1,0x80,0x80,0x91,0x91,0x81,0x81,0x92,0xa3,0xb4, - 0x9f,0x9f,0x9f,0x83,0x90,0x90,0xa1,0x80,0x80,0x91,0x91,0x81,0x81,0x92,0xa3,0xb4, - 0x82,0x82,0x82,0x83,0x83,0x94,0x94,0x84,0x84,0x95,0x95,0x85,0x85,0x96,0x96,0xa7, - 0x93,0x93,0x93,0x83,0x94,0x94,0x94,0x84,0x84,0x95,0x95,0x85,0x85,0x96,0xa7,0xa7, - 0x93,0x93,0x93,0x94,0x94,0x94,0xa5,0x84,0x95,0x95,0xa6,0xa6,0x96,0x96,0xa7,0xb8, - 0xa4,0xa4,0xa4,0x94,0x94,0xa5,0xa5,0x77,0x95,0x95,0xa6,0xa6,0x96,0xa7,0xa7,0xb8, - 0x86,0x86,0x86,0x87,0x87,0x87,0x77,0x88,0x88,0x88,0x99,0x89,0x89,0x9a,0x9a,0xb8, - 0x86,0x86,0x86,0x87,0x87,0x98,0x98,0x88,0x88,0x99,0x99,0x89,0x89,0x9a,0x9a,0xab, - 0x97,0x97,0x97,0x98,0x98,0x98,0x98,0x88,0x99,0x99,0x99,0x89,0x9a,0x9a,0xab,0xab, - 0x97,0x97,0x97,0x98,0x98,0xa9,0xa9,0x99,0x99,0x99,0xaa,0xaa,0x9a,0xab,0xab,0xbc, - 0x8a,0x8a,0x8a,0x8b,0x8b,0xa9,0xa9,0x8c,0x8c,0x8c,0xaa,0x8d,0x8d,0x8d,0xab,0xbc, - 0x8a,0x8a,0x8a,0x8b,0x8b,0x9c,0x9c,0x8c,0x8c,0x9d,0x9d,0x8d,0x8d,0x9e,0x9e,0xbc, - 0x9b,0x9b,0x9b,0x9c,0x9c,0x9c,0xad,0x9d,0x9d,0x9d,0xae,0x8d,0x9e,0x9e,0xaf,0xaf, - 0xac,0xac,0xac,0x9c,0xad,0xad,0xad,0x9d,0x9d,0xae,0xae,0xae,0x9e,0xaf,0xaf,0xaf, - 0xbd,0xbd,0xbd,0xad,0xad,0xbe,0xbe,0xbe,0xae,0xae,0xbf,0xbf,0xbf,0xaf,0xaf,0xb0, - 0xa0,0xa0,0xa0,0x90,0xa1,0xa1,0xa1,0xb2,0x91,0x91,0xa2,0xa2,0xb3,0xa3,0xa3,0xb4, - 0xa0,0xa0,0xa0,0x90,0xa1,0xa1,0xa1,0xb2,0x91,0x91,0xa2,0xa2,0xb3,0xa3,0xa3,0xb4, - 0xa0,0xa0,0xa0,0x90,0xa1,0xa1,0xa1,0xb2,0x91,0x91,0xa2,0xa2,0xb3,0xa3,0xa3,0xb4, - 0x93,0x93,0x93,0x94,0x94,0x94,0xa5,0x84,0x95,0x95,0xa6,0xa6,0x96,0x96,0xa7,0xb8, - 0xa4,0xa4,0xa4,0x94,0x94,0xa5,0xa5,0x84,0x95,0x95,0xa6,0xa6,0x96,0x96,0xa7,0xb8, - 0xa4,0xa4,0xa4,0x94,0xa5,0xa5,0xa5,0xb6,0x95,0xa6,0xa6,0xa6,0xb7,0xa7,0xa7,0xb8, - 0xa4,0xa4,0xa4,0xa5,0xa5,0xa5,0xb6,0xb6,0x95,0xa6,0xa6,0xb7,0xb7,0xa7,0xb8,0xb8, - 0xb5,0xb5,0xb5,0x87,0x87,0xb6,0xb6,0xb6,0x88,0x99,0xa6,0xb7,0xb7,0x9a,0xb8,0xb8, - 0x97,0x97,0x97,0x98,0x98,0x98,0x98,0x88,0x99,0x99,0x99,0x89,0x9a,0x9a,0xab,0xab, - 0x97,0x97,0x97,0x98,0x98,0xa9,0xa9,0x99,0x99,0x99,0xaa,0xaa,0x9a,0xab,0xab,0xbc, - 0xa8,0xa8,0xa8,0xa9,0xa9,0xa9,0xa9,0xa9,0x99,0xaa,0xaa,0xaa,0xbb,0xab,0xab,0xbc, - 0xa8,0xa8,0xa8,0xa9,0xa9,0xa9,0xba,0xba,0x8c,0xaa,0xaa,0xbb,0xbb,0xab,0xbc,0xbc, - 0xb9,0xb9,0xb9,0x9c,0x9c,0xba,0xba,0xba,0x9d,0x9d,0xbb,0xbb,0xbb,0x9e,0x9e,0xbc, - 0xac,0xac,0xac,0x9c,0x9c,0xad,0xad,0x9d,0x9d,0xae,0xae,0xae,0x9e,0x9e,0xaf,0xaf, - 0xac,0xac,0xac,0xad,0xad,0xad,0xbe,0xbe,0xae,0xae,0xae,0xbf,0x9e,0xaf,0xaf,0xb0, - 0xbd,0xbd,0xbd,0xbe,0xbe,0xbe,0xbe,0xbe,0xae,0xbf,0xbf,0xbf,0xbf,0xaf,0xb0,0xb0, - 0xb1,0xb1,0xb1,0xce,0xce,0xb2,0xb2,0xcf,0xcf,0xa2,0xa2,0xb3,0xb3,0xc0,0xb4,0xb4, - 0xb1,0xb1,0xb1,0xce,0xce,0xb2,0xb2,0xcf,0xcf,0xa2,0xa2,0xb3,0xb3,0xc0,0xb4,0xb4, - 0xb1,0xb1,0xb1,0xc2,0xc2,0xb2,0xb2,0xc3,0xc3,0xa2,0xa2,0xb3,0xb3,0xc0,0xb4,0xb4, - 0xc1,0xc1,0xc1,0xc2,0xc2,0xc2,0xa5,0xc3,0xc3,0xc3,0xa6,0xc4,0xc4,0xc4,0xa7,0xb8, - 0xc1,0xc1,0xc1,0xc2,0xc2,0xa5,0xb6,0xc3,0xc3,0xc3,0xa6,0xc4,0xc4,0xc4,0xb8,0xb8, - 0xb5,0xb5,0xb5,0xc2,0xa5,0xb6,0xb6,0xb6,0xc3,0xa6,0xa6,0xb7,0xb7,0xc4,0xb8,0xb8, - 0xb5,0xb5,0xb5,0xa5,0xb6,0xb6,0xb6,0xb6,0xc3,0xa6,0xb7,0xb7,0xb7,0xb7,0xb8,0xb8, - 0xc5,0xc5,0xc5,0xc6,0xc6,0xb6,0xb6,0xc7,0xc7,0xc7,0xb7,0xb7,0xc8,0xc8,0xb8,0xb8, - 0xc5,0xc5,0xc5,0xc6,0xc6,0xc6,0xc6,0xc7,0xc7,0xc7,0xaa,0xc8,0xc8,0xc8,0xab,0xbc, - 0xa8,0xa8,0xa8,0xc6,0xc6,0xa9,0xa9,0xc7,0xc7,0xaa,0xaa,0xaa,0xc8,0xc8,0xab,0xbc, - 0xa8,0xa8,0xa8,0xa9,0xa9,0xa9,0xba,0xba,0xaa,0xaa,0xaa,0xbb,0xbb,0xab,0xbc,0xbc, - 0xb9,0xb9,0xb9,0xca,0xca,0xba,0xba,0xba,0xcb,0xaa,0xbb,0xbb,0xbb,0xcc,0xbc,0xbc, - 0xb9,0xb9,0xb9,0xca,0xca,0xba,0xba,0xcb,0xcb,0xcb,0xbb,0xbb,0xcc,0xcc,0xcc,0xbc, - 0xc9,0xc9,0xc9,0xca,0xca,0xca,0xba,0xcb,0xcb,0xcb,0xae,0xcc,0xcc,0xcc,0xaf,0xaf, - 0xbd,0xbd,0xbd,0xad,0xbe,0xbe,0xbe,0xbe,0xae,0xae,0xbf,0xbf,0xcc,0xaf,0xaf,0xb0, - 0xbd,0xbd,0xbd,0xbe,0xbe,0xbe,0xbe,0xbe,0xbf,0xbf,0xbf,0xbf,0xbf,0xaf,0xb0,0xb0, - 0xcd,0xcd,0xcd,0xce,0xce,0xce,0xb2,0xcf,0xcf,0xcf,0xb3,0xb3,0xc0,0xc0,0xd1,0xb4, - 0xcd,0xcd,0xcd,0xce,0xce,0xce,0xb2,0xcf,0xcf,0xcf,0xb3,0xb3,0xc0,0xc0,0xd1,0xb4, - 0xc1,0xc1,0xc1,0xc2,0xc2,0xc2,0xb2,0xc3,0xc3,0xc3,0xb3,0xb3,0xc0,0xc0,0xd1,0xb4, - 0xc1,0xc1,0xc1,0xc2,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3,0xd4,0xc4,0xc4,0xc4,0xd5,0xd5, - 0xc1,0xc1,0xc1,0xc2,0xc2,0xc2,0xb6,0xc3,0xc3,0xc3,0xd4,0xc4,0xc4,0xc4,0xd5,0xb8, - 0xc1,0xc1,0xc1,0xc2,0xc2,0xb6,0xb6,0xc3,0xc3,0xd4,0xb7,0xb7,0xc4,0xd5,0xd5,0xb8, - 0xb5,0xb5,0xb5,0xc2,0xb6,0xb6,0xb6,0xb6,0xc3,0xd4,0xb7,0xb7,0xb7,0xd5,0xd5,0xb8, - 0xc5,0xc5,0xc5,0xc6,0xc6,0xc6,0xb6,0xc7,0xc7,0xc7,0xb7,0xc8,0xc8,0xc8,0xd9,0xd9, - 0xc5,0xc5,0xc5,0xc6,0xc6,0xc6,0xc6,0xc7,0xc7,0xc7,0xd8,0xc8,0xc8,0xc8,0xd9,0xd9, - 0xc5,0xc5,0xc5,0xc6,0xc6,0xd7,0xd7,0xc7,0xc7,0xd8,0xd8,0xc8,0xc8,0xd9,0xd9,0xbc, - 0xb9,0xb9,0xb9,0xd7,0xd7,0xba,0xba,0xba,0xd8,0xd8,0xbb,0xbb,0xbb,0xd9,0xd9,0xbc, - 0xb9,0xb9,0xb9,0xca,0xca,0xba,0xba,0xcb,0xcb,0xcb,0xbb,0xbb,0xcc,0xcc,0xcc,0xbc, - 0xc9,0xc9,0xc9,0xca,0xca,0xca,0xba,0xcb,0xcb,0xcb,0xbb,0xcc,0xcc,0xcc,0xdd,0xdd, - 0xc9,0xc9,0xc9,0xca,0xca,0xdb,0xdb,0xcb,0xcb,0xdc,0xdc,0xcc,0xcc,0xdd,0xdd,0xdd, - 0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xcc,0xdd,0xdd,0xdd,0xb0, - 0xbd,0xbd,0xbd,0xdb,0xbe,0xbe,0xbe,0xdc,0xdc,0xbf,0xbf,0xbf,0xdd,0xdd,0xb0,0xb0, - 0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xcf,0xd0,0xd0,0xe1,0xc0,0xc0,0xd1,0xd1,0xe2, - 0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xcf,0xd0,0xd0,0xe1,0xc0,0xc0,0xd1,0xd1,0xe2, - 0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xc3,0xd0,0xd0,0xe1,0xc0,0xc0,0xd1,0xd1,0xe2, - 0xd2,0xd2,0xd2,0xc2,0xd3,0xd3,0xd3,0xc3,0xc3,0xd4,0xd4,0xc4,0xc4,0xd5,0xd5,0xe6, - 0xd2,0xd2,0xd2,0xd3,0xd3,0xd3,0xd3,0xc3,0xd4,0xd4,0xd4,0xc4,0xc4,0xd5,0xd5,0xe6, - 0xd2,0xd2,0xd2,0xd3,0xd3,0xd3,0xe4,0xc3,0xd4,0xd4,0xe5,0xc4,0xd5,0xd5,0xe6,0xe6, - 0xe3,0xe3,0xe3,0xd3,0xd3,0xe4,0xb6,0xd4,0xd4,0xe5,0xe5,0xb7,0xd5,0xd5,0xe6,0xe6, - 0xc5,0xc5,0xc5,0xc6,0xc6,0xc6,0xd7,0xc7,0xc7,0xd8,0xd8,0xc8,0xc8,0xd9,0xd9,0xd9, - 0xd6,0xd6,0xd6,0xc6,0xd7,0xd7,0xd7,0xc7,0xd8,0xd8,0xd8,0xc8,0xc8,0xd9,0xd9,0xea, - 0xd6,0xd6,0xd6,0xd7,0xd7,0xd7,0xe8,0xd8,0xd8,0xd8,0xe9,0xc8,0xd9,0xd9,0xea,0xea, - 0xe7,0xe7,0xe7,0xd7,0xd7,0xe8,0xe8,0xd8,0xd8,0xe9,0xe9,0xe9,0xd9,0xd9,0xea,0xea, - 0xc9,0xc9,0xc9,0xca,0xca,0xca,0xba,0xcb,0xcb,0xcb,0xe9,0xcc,0xcc,0xcc,0xea,0xea, - 0xc9,0xc9,0xc9,0xca,0xca,0xdb,0xdb,0xcb,0xcb,0xdc,0xdc,0xcc,0xcc,0xdd,0xdd,0xdd, - 0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xcc,0xdd,0xdd,0xdd,0xee, - 0xda,0xda,0xda,0xdb,0xdb,0xec,0xec,0xdc,0xdc,0xed,0xed,0xed,0xdd,0xdd,0xee,0xee, - 0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xdc,0xed,0xed,0xed,0xed,0xdd,0xee,0xee,0xee, - 0xef,0xef,0xef,0xdf,0xe0,0xe0,0xe0,0xd0,0xd0,0xe1,0xe1,0xf2,0xd1,0xd1,0xe2,0xe2, - 0xef,0xef,0xef,0xdf,0xe0,0xe0,0xe0,0xd0,0xd0,0xe1,0xe1,0xf2,0xd1,0xd1,0xe2,0xe2, - 0xef,0xef,0xef,0xdf,0xe0,0xe0,0xe0,0xd0,0xd0,0xe1,0xe1,0xf2,0xd1,0xd1,0xe2,0xe2, - 0xd2,0xd2,0xd2,0xd3,0xd3,0xe4,0xe4,0xd4,0xd4,0xd4,0xe5,0xe5,0xd5,0xd5,0xe6,0xe6, - 0xe3,0xe3,0xe3,0xd3,0xe4,0xe4,0xe4,0xd4,0xd4,0xe5,0xe5,0xf6,0xd5,0xd5,0xe6,0xe6, - 0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xd4,0xe5,0xe5,0xe5,0xf6,0xd5,0xe6,0xe6,0xf7, - 0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xf5,0xf5,0xe5,0xe5,0xf6,0xf6,0xd5,0xe6,0xe6,0xf7, - 0xd6,0xd6,0xd6,0xd7,0xd7,0xd7,0xf5,0xc7,0xd8,0xd8,0xf6,0xc8,0xd9,0xd9,0xd9,0xf7, - 0xd6,0xd6,0xd6,0xd7,0xd7,0xe8,0xe8,0xd8,0xd8,0xd8,0xe9,0xe9,0xd9,0xd9,0xea,0xea, - 0xe7,0xe7,0xe7,0xd7,0xe8,0xe8,0xe8,0xd8,0xd8,0xe9,0xe9,0xe9,0xd9,0xea,0xea,0xea, - 0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xf9,0xf9,0xe9,0xe9,0xe9,0xfa,0xd9,0xea,0xea,0xfb, - 0xf8,0xf8,0xf8,0xe8,0xf9,0xf9,0xf9,0xcb,0xe9,0xe9,0xfa,0xfa,0xcc,0xea,0xea,0xfb, - 0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xcc,0xdd,0xdd,0xdd,0xee, - 0xda,0xda,0xda,0xdb,0xdb,0xec,0xec,0xdc,0xdc,0xed,0xed,0xed,0xdd,0xdd,0xee,0xee, - 0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xdc,0xed,0xed,0xed,0xed,0xdd,0xee,0xee,0xee, - 0xeb,0xeb,0xeb,0xec,0xec,0xfd,0xfd,0xfd,0xed,0xed,0xfe,0xfe,0xee,0xee,0xee,0xff, - 0xf0,0xf0,0xf0,0xe0,0xf1,0xf1,0xf1,0xf1,0xe1,0xf2,0xf2,0xf2,0xf2,0xe2,0xe2,0xf3, - 0xf0,0xf0,0xf0,0xe0,0xf1,0xf1,0xf1,0xf1,0xe1,0xf2,0xf2,0xf2,0xf2,0xe2,0xe2,0xf3, - 0xf0,0xf0,0xf0,0xe0,0xf1,0xf1,0xf1,0xf1,0xe1,0xf2,0xf2,0xf2,0xf2,0xe2,0xe2,0xf3, - 0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xf5,0xf5,0xe5,0xe5,0xf6,0xf6,0xd5,0xe6,0xe6,0xf7, - 0xf4,0xf4,0xf4,0xe4,0xe4,0xf5,0xf5,0xf5,0xe5,0xe5,0xf6,0xf6,0xf6,0xe6,0xe6,0xf7, - 0xf4,0xf4,0xf4,0xe4,0xf5,0xf5,0xf5,0xf5,0xe5,0xf6,0xf6,0xf6,0xf6,0xe6,0xf7,0xf7, - 0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xe5,0xf6,0xf6,0xf6,0xf6,0xe6,0xf7,0xf7, - 0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xd8,0xf6,0xf6,0xf6,0xd9,0xd9,0xf7,0xf7, - 0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xd8,0xe9,0xe9,0xe9,0xfa,0xd9,0xea,0xea,0xea, - 0xf8,0xf8,0xf8,0xe8,0xe8,0xf9,0xf9,0xf9,0xe9,0xe9,0xfa,0xfa,0xfa,0xea,0xea,0xfb, - 0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xe9,0xfa,0xfa,0xfa,0xfa,0xea,0xfb,0xfb, - 0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xea,0xfb,0xfb, - 0xf8,0xf8,0xf8,0xdb,0xf9,0xf9,0xf9,0xdc,0xdc,0xfa,0xfa,0xfa,0xdd,0xdd,0xee,0xfb, - 0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xdc,0xed,0xed,0xed,0xed,0xdd,0xee,0xee,0xee, - 0xeb,0xeb,0xeb,0xec,0xec,0xfd,0xfd,0xfd,0xed,0xed,0xfe,0xfe,0xee,0xee,0xee,0xff, - 0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xed,0xfe,0xfe,0xfe,0xfe,0xee,0xff,0xff, -} -}; -Memcmap *memdefcmap = &def; -void _memmkcmap(void){} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/cread.c b/sys/src/cmd/unix/drawterm/libmemdraw/cread.c deleted file mode 100644 index f414cd172..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/cread.c +++ /dev/null @@ -1,96 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -Memimage* -creadmemimage(int fd) -{ - char hdr[5*12+1]; - Rectangle r; - int m, nb, miny, maxy, new, ldepth, ncblock; - uchar *buf; - Memimage *i; - ulong chan; - - if(readn(fd, hdr, 5*12) != 5*12){ - werrstr("readmemimage: short header (2)"); - return nil; - } - - /* - * distinguish new channel descriptor from old ldepth. - * channel descriptors have letters as well as numbers, - * while ldepths are a single digit formatted as %-11d. - */ - new = 0; - for(m=0; m<10; m++){ - if(hdr[m] != ' '){ - new = 1; - break; - } - } - if(hdr[11] != ' '){ - werrstr("creadimage: bad format"); - return nil; - } - if(new){ - hdr[11] = '\0'; - if((chan = strtochan(hdr)) == 0){ - werrstr("creadimage: bad channel string %s", hdr); - return nil; - } - }else{ - ldepth = ((int)hdr[10])-'0'; - if(ldepth<0 || ldepth>3){ - werrstr("creadimage: bad ldepth %d", ldepth); - return nil; - } - chan = drawld2chan[ldepth]; - } - r.min.x=atoi(hdr+1*12); - r.min.y=atoi(hdr+2*12); - r.max.x=atoi(hdr+3*12); - r.max.y=atoi(hdr+4*12); - if(r.min.x>r.max.x || r.min.y>r.max.y){ - werrstr("creadimage: bad rectangle"); - return nil; - } - - i = allocmemimage(r, chan); - if(i == nil) - return nil; - ncblock = _compblocksize(r, i->depth); - buf = malloc(ncblock); - if(buf == nil) - goto Errout; - miny = r.min.y; - while(miny != r.max.y){ - if(readn(fd, hdr, 2*12) != 2*12){ - Shortread: - werrstr("readmemimage: short read"); - Errout: - freememimage(i); - free(buf); - return nil; - } - maxy = atoi(hdr+0*12); - nb = atoi(hdr+1*12); - if(maxy<=miny || r.max.y<maxy){ - werrstr("readimage: bad maxy %d", maxy); - goto Errout; - } - if(nb<=0 || ncblock<nb){ - werrstr("readimage: bad count %d", nb); - goto Errout; - } - if(readn(fd, buf, nb)!=nb) - goto Shortread; - if(!new) /* old image: flip the data bits */ - _twiddlecompressed(buf, nb); - cloadmemimage(i, Rect(r.min.x, miny, r.max.x, maxy), buf, nb); - miny = maxy; - } - free(buf); - return i; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/defont.c b/sys/src/cmd/unix/drawterm/libmemdraw/defont.c deleted file mode 100644 index 3b0805c46..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/defont.c +++ /dev/null @@ -1,68 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -Memsubfont* -getmemdefont(void) -{ - char *hdr, *p; - int n; - Fontchar *fc; - Memsubfont *f; - int ld; - Rectangle r; - Memdata *md; - Memimage *i; - - /* - * make sure data is word-aligned. this is true with Plan 9 compilers - * but not in general. the byte order is right because the data is - * declared as char*, not ulong*. - */ - p = (char*)defontdata; - n = (uintptr)p & 3; - if(n != 0){ - memmove(p+(4-n), p, sizeofdefont-n); - p += 4-n; - } - ld = atoi(p+0*12); - r.min.x = atoi(p+1*12); - r.min.y = atoi(p+2*12); - r.max.x = atoi(p+3*12); - r.max.y = atoi(p+4*12); - - md = mallocz(sizeof(Memdata), 1); - if(md == nil) - return nil; - - p += 5*12; - - md->base = nil; /* so freememimage doesn't free p */ - md->bdata = (uchar*)p; /* ick */ - md->ref = 1; - md->allocd = 1; /* so freememimage does free md */ - - i = allocmemimaged(r, drawld2chan[ld], md, nil); - if(i == nil){ - free(md); - return nil; - } - - hdr = p+Dy(r)*i->width*sizeof(ulong); - n = atoi(hdr); - p = hdr+3*12; - fc = malloc(sizeof(Fontchar)*(n+1)); - if(fc == 0){ - freememimage(i); - return 0; - } - _unpackinfo(fc, (uchar*)p, n); - f = allocmemsubfont("*default*", n, atoi(hdr+12), atoi(hdr+24), fc, i); - if(f == 0){ - freememimage(i); - free(fc); - return 0; - } - return f; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/draw.c b/sys/src/cmd/unix/drawterm/libmemdraw/draw.c deleted file mode 100644 index f5659972a..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/draw.c +++ /dev/null @@ -1,2483 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int drawdebug; -static int tablesbuilt; - -/* perfect approximation to NTSC = .299r+.587g+.114b when 0 ≤ r,g,b < 256 */ -#define RGB2K(r,g,b) ((156763*(r)+307758*(g)+59769*(b))>>19) - -/* - * for 0 ≤ x ≤ 255*255, (x*0x0101+0x100)>>16 is a perfect approximation. - * for 0 ≤ x < (1<<16), x/255 = ((x+1)*0x0101)>>16 is a perfect approximation. - * the last one is perfect for all up to 1<<16, avoids a multiply, but requires a rathole. - */ -/* #define DIV255(x) (((x)*257+256)>>16) */ -#define DIV255(x) ((((x)+1)*257)>>16) -/* #define DIV255(x) (tmp=(x)+1, (tmp+(tmp>>8))>>8) */ - -#define MUL(x, y, t) (t = (x)*(y)+128, (t+(t>>8))>>8) -#define MASK13 0xFF00FF00 -#define MASK02 0x00FF00FF -#define MUL13(a, x, t) (t = (a)*(((x)&MASK13)>>8)+128, ((t+((t>>8)&MASK02))>>8)&MASK02) -#define MUL02(a, x, t) (t = (a)*(((x)&MASK02)>>0)+128, ((t+((t>>8)&MASK02))>>8)&MASK02) -#define MUL0123(a, x, s, t) ((MUL13(a, x, s)<<8)|MUL02(a, x, t)) - -#define MUL2(u, v, x, y) (t = (u)*(v)+(x)*(y)+256, (t+(t>>8))>>8) - -static void mktables(void); -typedef int Subdraw(Memdrawparam*); -static Subdraw chardraw, alphadraw, memoptdraw; - -static Memimage* memones; -static Memimage* memzeros; -Memimage *memwhite; -Memimage *memblack; -Memimage *memtransparent; -Memimage *memopaque; - -int _ifmt(Fmt*); - -void -_memimageinit(void) -{ - static int didinit = 0; - - if(didinit) - return; - - didinit = 1; - - mktables(); - _memmkcmap(); - - fmtinstall('R', Rfmt); - fmtinstall('P', Pfmt); - - memones = allocmemimage(Rect(0,0,1,1), GREY1); - memones->flags |= Frepl; - memones->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF); - *byteaddr(memones, ZP) = ~0; - - memzeros = allocmemimage(Rect(0,0,1,1), GREY1); - memzeros->flags |= Frepl; - memzeros->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF); - *byteaddr(memzeros, ZP) = 0; - - if(memones == nil || memzeros == nil) - assert(0 /*cannot initialize memimage library */); /* RSC BUG */ - - memwhite = memones; - memblack = memzeros; - memopaque = memones; - memtransparent = memzeros; -} - -ulong _imgtorgba(Memimage*, ulong); -ulong _rgbatoimg(Memimage*, ulong); -ulong _pixelbits(Memimage*, Point); - -#define DBG if(0) -static Memdrawparam par; - -Memdrawparam* -_memimagedrawsetup(Memimage *dst, Rectangle r, Memimage *src, Point p0, Memimage *mask, Point p1, int op) -{ - - if(mask == nil) - mask = memopaque; - -DBG print("memimagedraw %p/%luX %R @ %p %p/%luX %P %p/%luX %P... ", dst, dst->chan, r, dst->data->bdata, src, src->chan, p0, mask, mask->chan, p1); - - if(drawclip(dst, &r, src, &p0, mask, &p1, &par.sr, &par.mr) == 0){ -// if(drawdebug) -// iprint("empty clipped rectangle\n"); - return nil; - } - - if(op < Clear || op > SoverD){ -// if(drawdebug) -// iprint("op out of range: %d\n", op); - return nil; - } - - par.op = op; - par.dst = dst; - par.r = r; - par.src = src; - /* par.sr set by drawclip */ - par.mask = mask; - /* par.mr set by drawclip */ - - par.state = 0; - if(src->flags&Frepl){ - par.state |= Replsrc; - if(Dx(src->r)==1 && Dy(src->r)==1){ - par.sval = _pixelbits(src, src->r.min); - par.state |= Simplesrc; - par.srgba = _imgtorgba(src, par.sval); - par.sdval = _rgbatoimg(dst, par.srgba); - if((par.srgba&0xFF) == 0 && (op&DoutS)){ -// if (drawdebug) iprint("fill with transparent source\n"); - return nil; /* no-op successfully handled */ - } - } - } - - if(mask->flags & Frepl){ - par.state |= Replmask; - if(Dx(mask->r)==1 && Dy(mask->r)==1){ - par.mval = _pixelbits(mask, mask->r.min); - if(par.mval == 0 && (op&DoutS)){ -// if(drawdebug) iprint("fill with zero mask\n"); - return nil; /* no-op successfully handled */ - } - par.state |= Simplemask; - if(par.mval == ~0) - par.state |= Fullmask; - par.mrgba = _imgtorgba(mask, par.mval); - } - } - -// if(drawdebug) -// iprint("dr %R sr %R mr %R...", r, par.sr, par.mr); -DBG print("draw dr %R sr %R mr %R %lux\n", r, par.sr, par.mr, par.state); - - return ∥ -} - -void -_memimagedraw(Memdrawparam *par) -{ - if (par == nil) - return; - - /* - * Now that we've clipped the parameters down to be consistent, we - * simply try sub-drawing routines in order until we find one that was able - * to handle us. If the sub-drawing routine returns zero, it means it was - * unable to satisfy the request, so we do not return. - */ - - /* - * Hardware support. Each video driver provides this function, - * which checks to see if there is anything it can help with. - * There could be an if around this checking to see if dst is in video memory. - */ -DBG print("test hwdraw\n"); - if(hwdraw(par)){ -//if(drawdebug) iprint("hw handled\n"); -DBG print("hwdraw handled\n"); - return; - } - /* - * Optimizations using memmove and memset. - */ -DBG print("test memoptdraw\n"); - if(memoptdraw(par)){ -//if(drawdebug) iprint("memopt handled\n"); -DBG print("memopt handled\n"); - return; - } - - /* - * Character drawing. - * Solid source color being painted through a boolean mask onto a high res image. - */ -DBG print("test chardraw\n"); - if(chardraw(par)){ -//if(drawdebug) iprint("chardraw handled\n"); -DBG print("chardraw handled\n"); - return; - } - - /* - * General calculation-laden case that does alpha for each pixel. - */ -DBG print("do alphadraw\n"); - alphadraw(par); -//if(drawdebug) iprint("alphadraw handled\n"); -DBG print("alphadraw handled\n"); -} -#undef DBG - -/* - * Clip the destination rectangle further based on the properties of the - * source and mask rectangles. Once the destination rectangle is properly - * clipped, adjust the source and mask rectangles to be the same size. - * Then if source or mask is replicated, move its clipped rectangle - * so that its minimum point falls within the repl rectangle. - * - * Return zero if the final rectangle is null. - */ -int -drawclip(Memimage *dst, Rectangle *r, Memimage *src, Point *p0, Memimage *mask, Point *p1, Rectangle *sr, Rectangle *mr) -{ - Point rmin, delta; - int splitcoords; - Rectangle omr; - - if(r->min.x>=r->max.x || r->min.y>=r->max.y) - return 0; - splitcoords = (p0->x!=p1->x) || (p0->y!=p1->y); - /* clip to destination */ - rmin = r->min; - if(!rectclip(r, dst->r) || !rectclip(r, dst->clipr)) - return 0; - /* move mask point */ - p1->x += r->min.x-rmin.x; - p1->y += r->min.y-rmin.y; - /* move source point */ - p0->x += r->min.x-rmin.x; - p0->y += r->min.y-rmin.y; - /* map destination rectangle into source */ - sr->min = *p0; - sr->max.x = p0->x+Dx(*r); - sr->max.y = p0->y+Dy(*r); - /* sr is r in source coordinates; clip to source */ - if(!(src->flags&Frepl) && !rectclip(sr, src->r)) - return 0; - if(!rectclip(sr, src->clipr)) - return 0; - /* compute and clip rectangle in mask */ - if(splitcoords){ - /* move mask point with source */ - p1->x += sr->min.x-p0->x; - p1->y += sr->min.y-p0->y; - mr->min = *p1; - mr->max.x = p1->x+Dx(*sr); - mr->max.y = p1->y+Dy(*sr); - omr = *mr; - /* mr is now rectangle in mask; clip it */ - if(!(mask->flags&Frepl) && !rectclip(mr, mask->r)) - return 0; - if(!rectclip(mr, mask->clipr)) - return 0; - /* reflect any clips back to source */ - sr->min.x += mr->min.x-omr.min.x; - sr->min.y += mr->min.y-omr.min.y; - sr->max.x += mr->max.x-omr.max.x; - sr->max.y += mr->max.y-omr.max.y; - *p1 = mr->min; - }else{ - if(!(mask->flags&Frepl) && !rectclip(sr, mask->r)) - return 0; - if(!rectclip(sr, mask->clipr)) - return 0; - *p1 = sr->min; - } - - /* move source clipping back to destination */ - delta.x = r->min.x - p0->x; - delta.y = r->min.y - p0->y; - r->min.x = sr->min.x + delta.x; - r->min.y = sr->min.y + delta.y; - r->max.x = sr->max.x + delta.x; - r->max.y = sr->max.y + delta.y; - - /* move source rectangle so sr->min is in src->r */ - if(src->flags&Frepl) { - delta.x = drawreplxy(src->r.min.x, src->r.max.x, sr->min.x) - sr->min.x; - delta.y = drawreplxy(src->r.min.y, src->r.max.y, sr->min.y) - sr->min.y; - sr->min.x += delta.x; - sr->min.y += delta.y; - sr->max.x += delta.x; - sr->max.y += delta.y; - } - *p0 = sr->min; - - /* move mask point so it is in mask->r */ - *p1 = drawrepl(mask->r, *p1); - mr->min = *p1; - mr->max.x = p1->x+Dx(*sr); - mr->max.y = p1->y+Dy(*sr); - - assert(Dx(*sr) == Dx(*mr) && Dx(*mr) == Dx(*r)); - assert(Dy(*sr) == Dy(*mr) && Dy(*mr) == Dy(*r)); - assert(ptinrect(*p0, src->r)); - assert(ptinrect(*p1, mask->r)); - assert(ptinrect(r->min, dst->r)); - - return 1; -} - -/* - * Conversion tables. - */ -static uchar replbit[1+8][256]; /* replbit[x][y] is the replication of the x-bit quantity y to 8-bit depth */ - -/* - * bitmap of how to replicate n bits to fill 8, for 1 ≤ n ≤ 8. - * the X's are where to put the bottom (ones) bit of the n-bit pattern. - * only the top 8 bits of the result are actually used. - * (the lower 8 bits are needed to get bits in the right place - * when n is not a divisor of 8.) - * - * Should check to see if its easier to just refer to replmul than - * use the precomputed values in replbit. On PCs it may well - * be; on machines with slow multiply instructions it probably isn't. - */ -#define a ((((((((((((((((0 -#define X *2+1) -#define _ *2) -static int replmul[1+8] = { - 0, - a X X X X X X X X X X X X X X X X, - a _ X _ X _ X _ X _ X _ X _ X _ X, - a _ _ X _ _ X _ _ X _ _ X _ _ X _, - a _ _ _ X _ _ _ X _ _ _ X _ _ _ X, - a _ _ _ _ X _ _ _ _ X _ _ _ _ X _, - a _ _ _ _ _ X _ _ _ _ _ X _ _ _ _, - a _ _ _ _ _ _ X _ _ _ _ _ _ X _ _, - a _ _ _ _ _ _ _ X _ _ _ _ _ _ _ X, -}; -#undef a -#undef X -#undef _ - -static void -mktables(void) -{ - int i, j, small; - - if(tablesbuilt) - return; - - fmtinstall('R', Rfmt); - fmtinstall('P', Pfmt); - tablesbuilt = 1; - - /* bit replication up to 8 bits */ - for(i=0; i<256; i++){ - for(j=0; j<=8; j++){ /* j <= 8 [sic] */ - small = i & ((1<<j)-1); - replbit[j][i] = (small*replmul[j])>>8; - } - } - -} - -static uchar ones = 0xff; - -/* - * General alpha drawing case. Can handle anything. - */ -typedef struct Buffer Buffer; -struct Buffer { - /* used by most routines */ - uchar *red; - uchar *grn; - uchar *blu; - uchar *alpha; - uchar *grey; - ulong *rgba; - int delta; /* number of bytes to add to pointer to get next pixel to the right */ - - /* used by boolcalc* for mask data */ - uchar *m; /* ptr to mask data r.min byte; like p->bytermin */ - int mskip; /* no. of left bits to skip in *m */ - uchar *bm; /* ptr to mask data img->r.min byte; like p->bytey0s */ - int bmskip; /* no. of left bits to skip in *bm */ - uchar *em; /* ptr to mask data img->r.max.x byte; like p->bytey0e */ - int emskip; /* no. of right bits to skip in *em */ -}; - -typedef struct Param Param; -typedef Buffer Readfn(Param*, uchar*, int); -typedef void Writefn(Param*, uchar*, Buffer); -typedef Buffer Calcfn(Buffer, Buffer, Buffer, int, int, int); - -enum { - MAXBCACHE = 16 -}; - -/* giant rathole to customize functions with */ -struct Param { - Readfn *replcall; - Readfn *greymaskcall; - Readfn *convreadcall; - Writefn *convwritecall; - - Memimage *img; - Rectangle r; - int dx; /* of r */ - int needbuf; - int convgrey; - int alphaonly; - - uchar *bytey0s; /* byteaddr(Pt(img->r.min.x, img->r.min.y)) */ - uchar *bytermin; /* byteaddr(Pt(r.min.x, img->r.min.y)) */ - uchar *bytey0e; /* byteaddr(Pt(img->r.max.x, img->r.min.y)) */ - int bwidth; - - int replcache; /* if set, cache buffers */ - Buffer bcache[MAXBCACHE]; - ulong bfilled; - uchar *bufbase; - int bufoff; - int bufdelta; - - int dir; - - int convbufoff; - uchar *convbuf; - Param *convdpar; - int convdx; -}; - -static uchar *drawbuf; -static int ndrawbuf; -static int mdrawbuf; -static Param spar, mpar, dpar; /* easier on the stacks */ -static Readfn greymaskread, replread, readptr; -static Writefn nullwrite; -static Calcfn alphacalc0, alphacalc14, alphacalc2810, alphacalc3679, alphacalc5, alphacalc11, alphacalcS; -static Calcfn boolcalc14, boolcalc236789, boolcalc1011; - -static Readfn* readfn(Memimage*); -static Readfn* readalphafn(Memimage*); -static Writefn* writefn(Memimage*); - -static Calcfn* boolcopyfn(Memimage*, Memimage*); -static Readfn* convfn(Memimage*, Param*, Memimage*, Param*); - -static Calcfn *alphacalc[Ncomp] = -{ - alphacalc0, /* Clear */ - alphacalc14, /* DoutS */ - alphacalc2810, /* SoutD */ - alphacalc3679, /* DxorS */ - alphacalc14, /* DinS */ - alphacalc5, /* D */ - alphacalc3679, /* DatopS */ - alphacalc3679, /* DoverS */ - alphacalc2810, /* SinD */ - alphacalc3679, /* SatopD */ - alphacalc2810, /* S */ - alphacalc11, /* SoverD */ -}; - -static Calcfn *boolcalc[Ncomp] = -{ - alphacalc0, /* Clear */ - boolcalc14, /* DoutS */ - boolcalc236789, /* SoutD */ - boolcalc236789, /* DxorS */ - boolcalc14, /* DinS */ - alphacalc5, /* D */ - boolcalc236789, /* DatopS */ - boolcalc236789, /* DoverS */ - boolcalc236789, /* SinD */ - boolcalc236789, /* SatopD */ - boolcalc1011, /* S */ - boolcalc1011, /* SoverD */ -}; - -static int -allocdrawbuf(void) -{ - uchar *p; - - if(ndrawbuf > mdrawbuf){ - p = realloc(drawbuf, ndrawbuf); - if(p == nil){ - werrstr("memimagedraw out of memory"); - return -1; - } - drawbuf = p; - mdrawbuf = ndrawbuf; - } - return 0; -} - -static Param -getparam(Memimage *img, Rectangle r, int convgrey, int needbuf) -{ - Param p; - int nbuf; - - memset(&p, 0, sizeof p); - - p.img = img; - p.r = r; - p.dx = Dx(r); - p.needbuf = needbuf; - p.convgrey = convgrey; - - assert(img->r.min.x <= r.min.x && r.min.x < img->r.max.x); - - p.bytey0s = byteaddr(img, Pt(img->r.min.x, img->r.min.y)); - p.bytermin = byteaddr(img, Pt(r.min.x, img->r.min.y)); - p.bytey0e = byteaddr(img, Pt(img->r.max.x, img->r.min.y)); - p.bwidth = sizeof(ulong)*img->width; - - assert(p.bytey0s <= p.bytermin && p.bytermin <= p.bytey0e); - - if(p.r.min.x == p.img->r.min.x) - assert(p.bytermin == p.bytey0s); - - nbuf = 1; - if((img->flags&Frepl) && Dy(img->r) <= MAXBCACHE && Dy(img->r) < Dy(r)){ - p.replcache = 1; - nbuf = Dy(img->r); - } - p.bufdelta = 4*p.dx; - p.bufoff = ndrawbuf; - ndrawbuf += p.bufdelta*nbuf; - - return p; -} - -static void -clipy(Memimage *img, int *y) -{ - int dy; - - dy = Dy(img->r); - if(*y == dy) - *y = 0; - else if(*y == -1) - *y = dy-1; - assert(0 <= *y && *y < dy); -} - -static void -dumpbuf(char *s, Buffer b, int n) -{ - int i; - uchar *p; - - print("%s", s); - for(i=0; i<n; i++){ - print(" "); - if((p=b.grey)){ - print(" k%.2uX", *p); - b.grey += b.delta; - }else{ - if((p=b.red)){ - print(" r%.2uX", *p); - b.red += b.delta; - } - if((p=b.grn)){ - print(" g%.2uX", *p); - b.grn += b.delta; - } - if((p=b.blu)){ - print(" b%.2uX", *p); - b.blu += b.delta; - } - } - if((p=b.alpha) != &ones){ - print(" α%.2uX", *p); - b.alpha += b.delta; - } - } - print("\n"); -} - -/* - * For each scan line, we expand the pixels from source, mask, and destination - * into byte-aligned red, green, blue, alpha, and grey channels. If buffering is not - * needed and the channels were already byte-aligned (grey8, rgb24, rgba32, rgb32), - * the readers need not copy the data: they can simply return pointers to the data. - * If the destination image is grey and the source is not, it is converted using the NTSC - * formula. - * - * Once we have all the channels, we call either rgbcalc or greycalc, depending on - * whether the destination image is color. This is allowed to overwrite the dst buffer (perhaps - * the actual data, perhaps a copy) with its result. It should only overwrite the dst buffer - * with the same format (i.e. red bytes with red bytes, etc.) A new buffer is returned from - * the calculator, and that buffer is passed to a function to write it to the destination. - * If the buffer is already pointing at the destination, the writing function is a no-op. - */ -#define DBG if(0) -static int -alphadraw(Memdrawparam *par) -{ - int isgrey, starty, endy, op; - int needbuf, dsty, srcy, masky; - int y, dir, dx, dy; - Buffer bsrc, bdst, bmask; - Readfn *rdsrc, *rdmask, *rddst; - Calcfn *calc; - Writefn *wrdst; - Memimage *src, *mask, *dst; - Rectangle r, sr, mr; - - r = par->r; - dx = Dx(r); - dy = Dy(r); - - ndrawbuf = 0; - - src = par->src; - mask = par->mask; - dst = par->dst; - sr = par->sr; - mr = par->mr; - op = par->op; - - isgrey = dst->flags&Fgrey; - - /* - * Buffering when src and dst are the same bitmap is sufficient but not - * necessary. There are stronger conditions we could use. We could - * check to see if the rectangles intersect, and if simply moving in the - * correct y direction can avoid the need to buffer. - */ - needbuf = (src->data == dst->data); - - spar = getparam(src, sr, isgrey, needbuf); - dpar = getparam(dst, r, isgrey, needbuf); - mpar = getparam(mask, mr, 0, needbuf); - - dir = (needbuf && byteaddr(dst, r.min) > byteaddr(src, sr.min)) ? -1 : 1; - spar.dir = mpar.dir = dpar.dir = dir; - - /* - * If the mask is purely boolean, we can convert from src to dst format - * when we read src, and then just copy it to dst where the mask tells us to. - * This requires a boolean (1-bit grey) mask and lack of a source alpha channel. - * - * The computation is accomplished by assigning the function pointers as follows: - * rdsrc - read and convert source into dst format in a buffer - * rdmask - convert mask to bytes, set pointer to it - * rddst - fill with pointer to real dst data, but do no reads - * calc - copy src onto dst when mask says to. - * wrdst - do nothing - * This is slightly sleazy, since things aren't doing exactly what their names say, - * but it avoids a fair amount of code duplication to make this a case here - * rather than have a separate booldraw. - */ -//if(drawdebug) iprint("flag %lud mchan %lux=?%x dd %d\n", src->flags&Falpha, mask->chan, GREY1, dst->depth); - if(!(src->flags&Falpha) && mask->chan == GREY1 && dst->depth >= 8 && op == SoverD){ -//if(drawdebug) iprint("boolcopy..."); - rdsrc = convfn(dst, &dpar, src, &spar); - rddst = readptr; - rdmask = readfn(mask); - calc = boolcopyfn(dst, mask); - wrdst = nullwrite; - }else{ - /* usual alphadraw parameter fetching */ - rdsrc = readfn(src); - rddst = readfn(dst); - wrdst = writefn(dst); - calc = alphacalc[op]; - - /* - * If there is no alpha channel, we'll ask for a grey channel - * and pretend it is the alpha. - */ - if(mask->flags&Falpha){ - rdmask = readalphafn(mask); - mpar.alphaonly = 1; - }else{ - mpar.greymaskcall = readfn(mask); - mpar.convgrey = 1; - rdmask = greymaskread; - - /* - * Should really be above, but then boolcopyfns would have - * to deal with bit alignment, and I haven't written that. - * - * This is a common case for things like ellipse drawing. - * When there's no alpha involved and the mask is boolean, - * we can avoid all the division and multiplication. - */ - if(mask->chan == GREY1 && !(src->flags&Falpha)) - calc = boolcalc[op]; - else if(op == SoverD && !(src->flags&Falpha)) - calc = alphacalcS; - } - } - - /* - * If the image has a small enough repl rectangle, - * we can just read each line once and cache them. - */ - if(spar.replcache){ - spar.replcall = rdsrc; - rdsrc = replread; - } - if(mpar.replcache){ - mpar.replcall = rdmask; - rdmask = replread; - } - - if(allocdrawbuf() < 0) - return 0; - - /* - * Before we were saving only offsets from drawbuf in the parameter - * structures; now that drawbuf has been grown to accomodate us, - * we can fill in the pointers. - */ - spar.bufbase = drawbuf+spar.bufoff; - mpar.bufbase = drawbuf+mpar.bufoff; - dpar.bufbase = drawbuf+dpar.bufoff; - spar.convbuf = drawbuf+spar.convbufoff; - - if(dir == 1){ - starty = 0; - endy = dy; - }else{ - starty = dy-1; - endy = -1; - } - - /* - * srcy, masky, and dsty are offsets from the top of their - * respective Rectangles. they need to be contained within - * the rectangles, so clipy can keep them there without division. - */ - srcy = (starty + sr.min.y - src->r.min.y)%Dy(src->r); - masky = (starty + mr.min.y - mask->r.min.y)%Dy(mask->r); - dsty = starty + r.min.y - dst->r.min.y; - - assert(0 <= srcy && srcy < Dy(src->r)); - assert(0 <= masky && masky < Dy(mask->r)); - assert(0 <= dsty && dsty < Dy(dst->r)); - - for(y=starty; y!=endy; y+=dir, srcy+=dir, masky+=dir, dsty+=dir){ - clipy(src, &srcy); - clipy(dst, &dsty); - clipy(mask, &masky); - - bsrc = rdsrc(&spar, spar.bufbase, srcy); -DBG print("["); - bmask = rdmask(&mpar, mpar.bufbase, masky); -DBG print("]\n"); - bdst = rddst(&dpar, dpar.bufbase, dsty); -DBG dumpbuf("src", bsrc, dx); -DBG dumpbuf("mask", bmask, dx); -DBG dumpbuf("dst", bdst, dx); - bdst = calc(bdst, bsrc, bmask, dx, isgrey, op); - wrdst(&dpar, dpar.bytermin+dsty*dpar.bwidth, bdst); - } - - return 1; -} -#undef DBG - -static Buffer -alphacalc0(Buffer bdst, Buffer b1, Buffer b2, int dx, int grey, int op) -{ - USED(grey); - USED(op); - memset(bdst.rgba, 0, dx*bdst.delta); - return bdst; -} - -static Buffer -alphacalc14(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int fd, sadelta; - int i, sa, ma, q; - ulong s, t; - - obdst = bdst; - sadelta = bsrc.alpha == &ones ? 0 : bsrc.delta; - q = bsrc.delta == 4 && bdst.delta == 4; - - for(i=0; i<dx; i++){ - sa = *bsrc.alpha; - ma = *bmask.alpha; - fd = MUL(sa, ma, t); - if(op == DoutS) - fd = 255-fd; - - if(grey){ - *bdst.grey = MUL(fd, *bdst.grey, t); - bsrc.grey += bsrc.delta; - bdst.grey += bdst.delta; - }else{ - if(q){ - *bdst.rgba = MUL0123(fd, *bdst.rgba, s, t); - bsrc.rgba++; - bdst.rgba++; - bsrc.alpha += sadelta; - bmask.alpha += bmask.delta; - continue; - } - *bdst.red = MUL(fd, *bdst.red, t); - *bdst.grn = MUL(fd, *bdst.grn, t); - *bdst.blu = MUL(fd, *bdst.blu, t); - bsrc.red += bsrc.delta; - bsrc.blu += bsrc.delta; - bsrc.grn += bsrc.delta; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - if(bdst.alpha != &ones){ - *bdst.alpha = MUL(fd, *bdst.alpha, t); - bdst.alpha += bdst.delta; - } - bmask.alpha += bmask.delta; - bsrc.alpha += sadelta; - } - return obdst; -} - -static Buffer -alphacalc2810(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int fs, sadelta; - int i, ma, da, q; - ulong s, t; - - obdst = bdst; - sadelta = bsrc.alpha == &ones ? 0 : bsrc.delta; - q = bsrc.delta == 4 && bdst.delta == 4; - - for(i=0; i<dx; i++){ - ma = *bmask.alpha; - da = *bdst.alpha; - if(op == SoutD) - da = 255-da; - fs = ma; - if(op != S) - fs = MUL(fs, da, t); - - if(grey){ - *bdst.grey = MUL(fs, *bsrc.grey, t); - bsrc.grey += bsrc.delta; - bdst.grey += bdst.delta; - }else{ - if(q){ - *bdst.rgba = MUL0123(fs, *bsrc.rgba, s, t); - bsrc.rgba++; - bdst.rgba++; - bmask.alpha += bmask.delta; - bdst.alpha += bdst.delta; - continue; - } - *bdst.red = MUL(fs, *bsrc.red, t); - *bdst.grn = MUL(fs, *bsrc.grn, t); - *bdst.blu = MUL(fs, *bsrc.blu, t); - bsrc.red += bsrc.delta; - bsrc.blu += bsrc.delta; - bsrc.grn += bsrc.delta; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - if(bdst.alpha != &ones){ - *bdst.alpha = MUL(fs, *bsrc.alpha, t); - bdst.alpha += bdst.delta; - } - bmask.alpha += bmask.delta; - bsrc.alpha += sadelta; - } - return obdst; -} - -static Buffer -alphacalc3679(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int fs, fd, sadelta; - int i, sa, ma, da, q; - ulong s, t, u, v; - - obdst = bdst; - sadelta = bsrc.alpha == &ones ? 0 : bsrc.delta; - q = bsrc.delta == 4 && bdst.delta == 4; - - for(i=0; i<dx; i++){ - sa = *bsrc.alpha; - ma = *bmask.alpha; - da = *bdst.alpha; - if(op == SatopD) - fs = MUL(ma, da, t); - else - fs = MUL(ma, 255-da, t); - if(op == DoverS) - fd = 255; - else{ - fd = MUL(sa, ma, t); - if(op != DatopS) - fd = 255-fd; - } - - if(grey){ - *bdst.grey = MUL(fs, *bsrc.grey, s)+MUL(fd, *bdst.grey, t); - bsrc.grey += bsrc.delta; - bdst.grey += bdst.delta; - }else{ - if(q){ - *bdst.rgba = MUL0123(fs, *bsrc.rgba, s, t)+MUL0123(fd, *bdst.rgba, u, v); - bsrc.rgba++; - bdst.rgba++; - bsrc.alpha += sadelta; - bmask.alpha += bmask.delta; - bdst.alpha += bdst.delta; - continue; - } - *bdst.red = MUL(fs, *bsrc.red, s)+MUL(fd, *bdst.red, t); - *bdst.grn = MUL(fs, *bsrc.grn, s)+MUL(fd, *bdst.grn, t); - *bdst.blu = MUL(fs, *bsrc.blu, s)+MUL(fd, *bdst.blu, t); - bsrc.red += bsrc.delta; - bsrc.blu += bsrc.delta; - bsrc.grn += bsrc.delta; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - if(bdst.alpha != &ones){ - *bdst.alpha = MUL(fs, sa, s)+MUL(fd, da, t); - bdst.alpha += bdst.delta; - } - bmask.alpha += bmask.delta; - bsrc.alpha += sadelta; - } - return obdst; -} - -static Buffer -alphacalc5(Buffer bdst, Buffer b1, Buffer b2, int dx, int grey, int op) -{ - USED(dx); - USED(grey); - USED(op); - return bdst; -} - -static Buffer -alphacalc11(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int fd, sadelta; - int i, sa, ma, q; - ulong s, t, u, v; - - USED(op); - obdst = bdst; - sadelta = bsrc.alpha == &ones ? 0 : bsrc.delta; - q = bsrc.delta == 4 && bdst.delta == 4; - - for(i=0; i<dx; i++){ - sa = *bsrc.alpha; - ma = *bmask.alpha; - fd = 255-MUL(sa, ma, t); - - if(grey){ - *bdst.grey = MUL(ma, *bsrc.grey, s)+MUL(fd, *bdst.grey, t); - bsrc.grey += bsrc.delta; - bdst.grey += bdst.delta; - }else{ - if(q){ - *bdst.rgba = MUL0123(ma, *bsrc.rgba, s, t)+MUL0123(fd, *bdst.rgba, u, v); - bsrc.rgba++; - bdst.rgba++; - bsrc.alpha += sadelta; - bmask.alpha += bmask.delta; - continue; - } - *bdst.red = MUL(ma, *bsrc.red, s)+MUL(fd, *bdst.red, t); - *bdst.grn = MUL(ma, *bsrc.grn, s)+MUL(fd, *bdst.grn, t); - *bdst.blu = MUL(ma, *bsrc.blu, s)+MUL(fd, *bdst.blu, t); - bsrc.red += bsrc.delta; - bsrc.blu += bsrc.delta; - bsrc.grn += bsrc.delta; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - if(bdst.alpha != &ones){ - *bdst.alpha = MUL(ma, sa, s)+MUL(fd, *bdst.alpha, t); - bdst.alpha += bdst.delta; - } - bmask.alpha += bmask.delta; - bsrc.alpha += sadelta; - } - return obdst; -} - -/* -not used yet -source and mask alpha 1 -static Buffer -alphacalcS0(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int i; - - USED(op); - obdst = bdst; - if(bsrc.delta == bdst.delta){ - memmove(bdst.rgba, bsrc.rgba, dx*bdst.delta); - return obdst; - } - for(i=0; i<dx; i++){ - if(grey){ - *bdst.grey = *bsrc.grey; - bsrc.grey += bsrc.delta; - bdst.grey += bdst.delta; - }else{ - *bdst.red = *bsrc.red; - *bdst.grn = *bsrc.grn; - *bdst.blu = *bsrc.blu; - bsrc.red += bsrc.delta; - bsrc.blu += bsrc.delta; - bsrc.grn += bsrc.delta; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - if(bdst.alpha != &ones){ - *bdst.alpha = 255; - bdst.alpha += bdst.delta; - } - } - return obdst; -} -*/ - -/* source alpha 1 */ -static Buffer -alphacalcS(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int fd; - int i, ma; - ulong s, t; - - USED(op); - obdst = bdst; - - for(i=0; i<dx; i++){ - ma = *bmask.alpha; - fd = 255-ma; - - if(grey){ - *bdst.grey = MUL(ma, *bsrc.grey, s)+MUL(fd, *bdst.grey, t); - bsrc.grey += bsrc.delta; - bdst.grey += bdst.delta; - }else{ - *bdst.red = MUL(ma, *bsrc.red, s)+MUL(fd, *bdst.red, t); - *bdst.grn = MUL(ma, *bsrc.grn, s)+MUL(fd, *bdst.grn, t); - *bdst.blu = MUL(ma, *bsrc.blu, s)+MUL(fd, *bdst.blu, t); - bsrc.red += bsrc.delta; - bsrc.blu += bsrc.delta; - bsrc.grn += bsrc.delta; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - if(bdst.alpha != &ones){ - *bdst.alpha = ma+MUL(fd, *bdst.alpha, t); - bdst.alpha += bdst.delta; - } - bmask.alpha += bmask.delta; - } - return obdst; -} - -static Buffer -boolcalc14(Buffer bdst, Buffer b1, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int i, ma, zero; - - obdst = bdst; - - for(i=0; i<dx; i++){ - ma = *bmask.alpha; - zero = ma ? op == DoutS : op == DinS; - - if(grey){ - if(zero) - *bdst.grey = 0; - bdst.grey += bdst.delta; - }else{ - if(zero) - *bdst.red = *bdst.grn = *bdst.blu = 0; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - bmask.alpha += bmask.delta; - if(bdst.alpha != &ones){ - if(zero) - *bdst.alpha = 0; - bdst.alpha += bdst.delta; - } - } - return obdst; -} - -static Buffer -boolcalc236789(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int fs, fd; - int i, ma, da, zero; - ulong s, t; - - obdst = bdst; - zero = !(op&1); - - for(i=0; i<dx; i++){ - ma = *bmask.alpha; - da = *bdst.alpha; - fs = da; - if(op&2) - fs = 255-da; - fd = 0; - if(op&4) - fd = 255; - - if(grey){ - if(ma) - *bdst.grey = MUL(fs, *bsrc.grey, s)+MUL(fd, *bdst.grey, t); - else if(zero) - *bdst.grey = 0; - bsrc.grey += bsrc.delta; - bdst.grey += bdst.delta; - }else{ - if(ma){ - *bdst.red = MUL(fs, *bsrc.red, s)+MUL(fd, *bdst.red, t); - *bdst.grn = MUL(fs, *bsrc.grn, s)+MUL(fd, *bdst.grn, t); - *bdst.blu = MUL(fs, *bsrc.blu, s)+MUL(fd, *bdst.blu, t); - } - else if(zero) - *bdst.red = *bdst.grn = *bdst.blu = 0; - bsrc.red += bsrc.delta; - bsrc.blu += bsrc.delta; - bsrc.grn += bsrc.delta; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - bmask.alpha += bmask.delta; - if(bdst.alpha != &ones){ - if(ma) - *bdst.alpha = fs+MUL(fd, da, t); - else if(zero) - *bdst.alpha = 0; - bdst.alpha += bdst.delta; - } - } - return obdst; -} - -static Buffer -boolcalc1011(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op) -{ - Buffer obdst; - int i, ma, zero; - - obdst = bdst; - zero = !(op&1); - - for(i=0; i<dx; i++){ - ma = *bmask.alpha; - - if(grey){ - if(ma) - *bdst.grey = *bsrc.grey; - else if(zero) - *bdst.grey = 0; - bsrc.grey += bsrc.delta; - bdst.grey += bdst.delta; - }else{ - if(ma){ - *bdst.red = *bsrc.red; - *bdst.grn = *bsrc.grn; - *bdst.blu = *bsrc.blu; - } - else if(zero) - *bdst.red = *bdst.grn = *bdst.blu = 0; - bsrc.red += bsrc.delta; - bsrc.blu += bsrc.delta; - bsrc.grn += bsrc.delta; - bdst.red += bdst.delta; - bdst.blu += bdst.delta; - bdst.grn += bdst.delta; - } - bmask.alpha += bmask.delta; - if(bdst.alpha != &ones){ - if(ma) - *bdst.alpha = 255; - else if(zero) - *bdst.alpha = 0; - bdst.alpha += bdst.delta; - } - } - return obdst; -} -/* - * Replicated cached scan line read. Call the function listed in the Param, - * but cache the result so that for replicated images we only do the work once. - */ -static Buffer -replread(Param *p, uchar *s, int y) -{ - Buffer *b; - - USED(s); - b = &p->bcache[y]; - if((p->bfilled & (1<<y)) == 0){ - p->bfilled |= 1<<y; - *b = p->replcall(p, p->bufbase+y*p->bufdelta, y); - } - return *b; -} - -/* - * Alpha reading function that simply relabels the grey pointer. - */ -static Buffer -greymaskread(Param *p, uchar *buf, int y) -{ - Buffer b; - - b = p->greymaskcall(p, buf, y); - b.alpha = b.grey; - return b; -} - -#define DBG if(0) -static Buffer -readnbit(Param *p, uchar *buf, int y) -{ - Buffer b; - Memimage *img; - uchar *repl, *r, *w, *ow, bits; - int i, n, sh, depth, x, dx, npack, nbits; - - b.rgba = (ulong*)buf; - b.grey = w = buf; - b.red = b.blu = b.grn = w; - b.alpha = &ones; - b.delta = 1; - - dx = p->dx; - img = p->img; - depth = img->depth; - repl = &replbit[depth][0]; - npack = 8/depth; - sh = 8-depth; - - /* copy from p->r.min.x until end of repl rectangle */ - x = p->r.min.x; - n = dx; - if(n > p->img->r.max.x - x) - n = p->img->r.max.x - x; - - r = p->bytermin + y*p->bwidth; -DBG print("readnbit dx %d %p=%p+%d*%d, *r=%d fetch %d ", dx, r, p->bytermin, y, p->bwidth, *r, n); - bits = *r++; - nbits = 8; - if((i=x&(npack-1))){ -DBG print("throwaway %d...", i); - bits <<= depth*i; - nbits -= depth*i; - } - for(i=0; i<n; i++){ - if(nbits == 0){ -DBG print("(%.2ux)...", *r); - bits = *r++; - nbits = 8; - } - *w++ = repl[bits>>sh]; -DBG print("bit %x...", repl[bits>>sh]); - bits <<= depth; - nbits -= depth; - } - dx -= n; - if(dx == 0) - return b; - - assert(x+i == p->img->r.max.x); - - /* copy from beginning of repl rectangle until where we were before. */ - x = p->img->r.min.x; - n = dx; - if(n > p->r.min.x - x) - n = p->r.min.x - x; - - r = p->bytey0s + y*p->bwidth; -DBG print("x=%d r=%p...", x, r); - bits = *r++; - nbits = 8; - if((i=x&(npack-1))){ - bits <<= depth*i; - nbits -= depth*i; - } -DBG print("nbits=%d...", nbits); - for(i=0; i<n; i++){ - if(nbits == 0){ - bits = *r++; - nbits = 8; - } - *w++ = repl[bits>>sh]; -DBG print("bit %x...", repl[bits>>sh]); - bits <<= depth; - nbits -= depth; -DBG print("bits %x nbits %d...", bits, nbits); - } - dx -= n; - if(dx == 0) - return b; - - assert(dx > 0); - /* now we have exactly one full scan line: just replicate the buffer itself until we are done */ - ow = buf; - while(dx--) - *w++ = *ow++; - - return b; -} -#undef DBG - -#define DBG if(0) -static void -writenbit(Param *p, uchar *w, Buffer src) -{ - uchar *r; - ulong bits; - int i, sh, depth, npack, nbits, x, ex; - - assert(src.grey != nil && src.delta == 1); - - x = p->r.min.x; - ex = x+p->dx; - depth = p->img->depth; - npack = 8/depth; - - i=x&(npack-1); - bits = i ? (*w >> (8-depth*i)) : 0; - nbits = depth*i; - sh = 8-depth; - r = src.grey; - - for(; x<ex; x++){ - bits <<= depth; -DBG print(" %x", *r); - bits |= (*r++ >> sh); - nbits += depth; - if(nbits == 8){ - *w++ = bits; - nbits = 0; - } - } - - if(nbits){ - sh = 8-nbits; - bits <<= sh; - bits |= *w & ((1<<sh)-1); - *w = bits; - } -DBG print("\n"); - return; -} -#undef DBG - -static Buffer -readcmap(Param *p, uchar *buf, int y) -{ - Buffer b; - int a, convgrey, copyalpha, dx, i, m; - uchar *q, *cmap, *begin, *end, *r, *w; - - begin = p->bytey0s + y*p->bwidth; - r = p->bytermin + y*p->bwidth; - end = p->bytey0e + y*p->bwidth; - cmap = p->img->cmap->cmap2rgb; - convgrey = p->convgrey; - copyalpha = (p->img->flags&Falpha) ? 1 : 0; - - w = buf; - dx = p->dx; - if(copyalpha){ - b.alpha = buf++; - a = p->img->shift[CAlpha]/8; - m = p->img->shift[CMap]/8; - for(i=0; i<dx; i++){ - *w++ = r[a]; - q = cmap+r[m]*3; - r += 2; - if(r == end) - r = begin; - if(convgrey){ - *w++ = RGB2K(q[0], q[1], q[2]); - }else{ - *w++ = q[2]; /* blue */ - *w++ = q[1]; /* green */ - *w++ = q[0]; /* red */ - } - } - }else{ - b.alpha = &ones; - for(i=0; i<dx; i++){ - q = cmap+*r++*3; - if(r == end) - r = begin; - if(convgrey){ - *w++ = RGB2K(q[0], q[1], q[2]); - }else{ - *w++ = q[2]; /* blue */ - *w++ = q[1]; /* green */ - *w++ = q[0]; /* red */ - } - } - } - - b.rgba = (ulong*)(buf-copyalpha); - - if(convgrey){ - b.grey = buf; - b.red = b.blu = b.grn = buf; - b.delta = 1+copyalpha; - }else{ - b.blu = buf; - b.grn = buf+1; - b.red = buf+2; - b.grey = nil; - b.delta = 3+copyalpha; - } - return b; -} - -static void -writecmap(Param *p, uchar *w, Buffer src) -{ - uchar *cmap, *red, *grn, *blu; - int i, dx, delta; - - cmap = p->img->cmap->rgb2cmap; - - delta = src.delta; - red= src.red; - grn = src.grn; - blu = src.blu; - - dx = p->dx; - for(i=0; i<dx; i++, red+=delta, grn+=delta, blu+=delta) - *w++ = cmap[(*red>>4)*256+(*grn>>4)*16+(*blu>>4)]; -} - -#define DBG if(0) -static Buffer -readbyte(Param *p, uchar *buf, int y) -{ - Buffer b; - Memimage *img; - int dx, isgrey, convgrey, alphaonly, copyalpha, i, nb; - uchar *begin, *end, *r, *w, *rrepl, *grepl, *brepl, *arepl, *krepl; - uchar ured, ugrn, ublu; - ulong u; - - img = p->img; - begin = p->bytey0s + y*p->bwidth; - r = p->bytermin + y*p->bwidth; - end = p->bytey0e + y*p->bwidth; - - w = buf; - dx = p->dx; - nb = img->depth/8; - - convgrey = p->convgrey; /* convert rgb to grey */ - isgrey = img->flags&Fgrey; - alphaonly = p->alphaonly; - copyalpha = (img->flags&Falpha) ? 1 : 0; - -DBG print("copyalpha %d alphaonly %d convgrey %d isgrey %d\n", copyalpha, alphaonly, convgrey, isgrey); - /* if we can, avoid processing everything */ - if(!(img->flags&Frepl) && !convgrey && (img->flags&Fbytes)){ - memset(&b, 0, sizeof b); - if(p->needbuf){ - memmove(buf, r, dx*nb); - r = buf; - } - b.rgba = (ulong*)r; - if(copyalpha) - b.alpha = r+img->shift[CAlpha]/8; - else - b.alpha = &ones; - if(isgrey){ - b.grey = r+img->shift[CGrey]/8; - b.red = b.grn = b.blu = b.grey; - }else{ - b.red = r+img->shift[CRed]/8; - b.grn = r+img->shift[CGreen]/8; - b.blu = r+img->shift[CBlue]/8; - } - b.delta = nb; - return b; - } - -DBG print("2\n"); - rrepl = replbit[img->nbits[CRed]]; - grepl = replbit[img->nbits[CGreen]]; - brepl = replbit[img->nbits[CBlue]]; - arepl = replbit[img->nbits[CAlpha]]; - krepl = replbit[img->nbits[CGrey]]; - - for(i=0; i<dx; i++){ - u = r[0] | (r[1]<<8) | (r[2]<<16) | (r[3]<<24); - if(copyalpha) { - *w++ = arepl[(u>>img->shift[CAlpha]) & img->mask[CAlpha]]; -DBG print("a %x\n", w[-1]); - } - - if(isgrey) - *w++ = krepl[(u >> img->shift[CGrey]) & img->mask[CGrey]]; - else if(!alphaonly){ - ured = rrepl[(u >> img->shift[CRed]) & img->mask[CRed]]; - ugrn = grepl[(u >> img->shift[CGreen]) & img->mask[CGreen]]; - ublu = brepl[(u >> img->shift[CBlue]) & img->mask[CBlue]]; - if(convgrey){ -DBG print("g %x %x %x\n", ured, ugrn, ublu); - *w++ = RGB2K(ured, ugrn, ublu); -DBG print("%x\n", w[-1]); - }else{ - *w++ = brepl[(u >> img->shift[CBlue]) & img->mask[CBlue]]; - *w++ = grepl[(u >> img->shift[CGreen]) & img->mask[CGreen]]; - *w++ = rrepl[(u >> img->shift[CRed]) & img->mask[CRed]]; - } - } - r += nb; - if(r == end) - r = begin; - } - - b.alpha = copyalpha ? buf : &ones; - b.rgba = (ulong*)buf; - if(alphaonly){ - b.red = b.grn = b.blu = b.grey = nil; - if(!copyalpha) - b.rgba = nil; - b.delta = 1; - }else if(isgrey || convgrey){ - b.grey = buf+copyalpha; - b.red = b.grn = b.blu = buf+copyalpha; - b.delta = copyalpha+1; -DBG print("alpha %x grey %x\n", b.alpha ? *b.alpha : 0xFF, *b.grey); - }else{ - b.blu = buf+copyalpha; - b.grn = buf+copyalpha+1; - b.grey = nil; - b.red = buf+copyalpha+2; - b.delta = copyalpha+3; - } - return b; -} -#undef DBG - -#define DBG if(0) -static void -writebyte(Param *p, uchar *w, Buffer src) -{ - Memimage *img; - int i, isalpha, isgrey, nb, delta, dx, adelta; - uchar ff, *red, *grn, *blu, *grey, *alpha; - ulong u, mask; - - img = p->img; - - red = src.red; - grn = src.grn; - blu = src.blu; - alpha = src.alpha; - delta = src.delta; - grey = src.grey; - dx = p->dx; - - nb = img->depth/8; - mask = (nb==4) ? 0 : ~((1<<img->depth)-1); - - isalpha = img->flags&Falpha; - isgrey = img->flags&Fgrey; - adelta = src.delta; - - if(isalpha && (alpha == nil || alpha == &ones)){ - ff = 0xFF; - alpha = &ff; - adelta = 0; - } - - for(i=0; i<dx; i++){ - u = w[0] | (w[1]<<8) | (w[2]<<16) | (w[3]<<24); -DBG print("u %.8lux...", u); - u &= mask; -DBG print("&mask %.8lux...", u); - if(isgrey){ - u |= ((*grey >> (8-img->nbits[CGrey])) & img->mask[CGrey]) << img->shift[CGrey]; -DBG print("|grey %.8lux...", u); - grey += delta; - }else{ - u |= ((*red >> (8-img->nbits[CRed])) & img->mask[CRed]) << img->shift[CRed]; - u |= ((*grn >> (8-img->nbits[CGreen])) & img->mask[CGreen]) << img->shift[CGreen]; - u |= ((*blu >> (8-img->nbits[CBlue])) & img->mask[CBlue]) << img->shift[CBlue]; - red += delta; - grn += delta; - blu += delta; -DBG print("|rgb %.8lux...", u); - } - - if(isalpha){ - u |= ((*alpha >> (8-img->nbits[CAlpha])) & img->mask[CAlpha]) << img->shift[CAlpha]; - alpha += adelta; -DBG print("|alpha %.8lux...", u); - } - - w[0] = u; - w[1] = u>>8; - w[2] = u>>16; - w[3] = u>>24; - w += nb; - } -} -#undef DBG - -static Readfn* -readfn(Memimage *img) -{ - if(img->depth < 8) - return readnbit; - if(img->nbits[CMap] == 8) - return readcmap; - return readbyte; -} - -static Readfn* -readalphafn(Memimage *m) -{ - USED(m); - return readbyte; -} - -static Writefn* -writefn(Memimage *img) -{ - if(img->depth < 8) - return writenbit; - if(img->chan == CMAP8) - return writecmap; - return writebyte; -} - -static void -nullwrite(Param *p, uchar *s, Buffer b) -{ - USED(p); - USED(s); -} - -static Buffer -readptr(Param *p, uchar *s, int y) -{ - Buffer b; - uchar *q; - - USED(s); - q = p->bytermin + y*p->bwidth; - b.red = q; /* ptr to data */ - b.grn = b.blu = b.grey = b.alpha = nil; - b.rgba = (ulong*)q; - b.delta = p->img->depth/8; - return b; -} - -static Buffer -boolmemmove(Buffer bdst, Buffer bsrc, Buffer b1, int dx, int i, int o) -{ - USED(i); - USED(o); - memmove(bdst.red, bsrc.red, dx*bdst.delta); - return bdst; -} - -static Buffer -boolcopy8(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int i, int o) -{ - uchar *m, *r, *w, *ew; - - USED(i); - USED(o); - m = bmask.grey; - w = bdst.red; - r = bsrc.red; - ew = w+dx; - for(; w < ew; w++,r++) - if(*m++) - *w = *r; - return bdst; /* not used */ -} - -static Buffer -boolcopy16(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int i, int o) -{ - uchar *m; - ushort *r, *w, *ew; - - USED(i); - USED(o); - m = bmask.grey; - w = (ushort*)bdst.red; - r = (ushort*)bsrc.red; - ew = w+dx; - for(; w < ew; w++,r++) - if(*m++) - *w = *r; - return bdst; /* not used */ -} - -static Buffer -boolcopy24(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int i, int o) -{ - uchar *m; - uchar *r, *w, *ew; - - USED(i); - USED(o); - m = bmask.grey; - w = bdst.red; - r = bsrc.red; - ew = w+dx*3; - while(w < ew){ - if(*m++){ - *w++ = *r++; - *w++ = *r++; - *w++ = *r++; - }else{ - w += 3; - r += 3; - } - } - return bdst; /* not used */ -} - -static Buffer -boolcopy32(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int i, int o) -{ - uchar *m; - ulong *r, *w, *ew; - - USED(i); - USED(o); - m = bmask.grey; - w = (ulong*)bdst.red; - r = (ulong*)bsrc.red; - ew = w+dx; - for(; w < ew; w++,r++) - if(*m++) - *w = *r; - return bdst; /* not used */ -} - -static Buffer -genconv(Param *p, uchar *buf, int y) -{ - Buffer b; - int nb; - uchar *r, *w, *ew; - - /* read from source into RGB format in convbuf */ - b = p->convreadcall(p, p->convbuf, y); - - /* write RGB format into dst format in buf */ - p->convwritecall(p->convdpar, buf, b); - - if(p->convdx){ - nb = p->convdpar->img->depth/8; - r = buf; - w = buf+nb*p->dx; - ew = buf+nb*p->convdx; - while(w<ew) - *w++ = *r++; - } - - b.red = buf; - b.blu = b.grn = b.grey = b.alpha = nil; - b.rgba = (ulong*)buf; - b.delta = 0; - - return b; -} - -static Readfn* -convfn(Memimage *dst, Param *dpar, Memimage *src, Param *spar) -{ - if(dst->chan == src->chan && !(src->flags&Frepl)){ -//if(drawdebug) iprint("readptr..."); - return readptr; - } - - if(dst->chan==CMAP8 && (src->chan==GREY1||src->chan==GREY2||src->chan==GREY4)){ - /* cheat because we know the replicated value is exactly the color map entry. */ -//if(drawdebug) iprint("Readnbit..."); - return readnbit; - } - - spar->convreadcall = readfn(src); - spar->convwritecall = writefn(dst); - spar->convdpar = dpar; - - /* allocate a conversion buffer */ - spar->convbufoff = ndrawbuf; - ndrawbuf += spar->dx*4; - - if(spar->dx > Dx(spar->img->r)){ - spar->convdx = spar->dx; - spar->dx = Dx(spar->img->r); - } - -//if(drawdebug) iprint("genconv..."); - return genconv; -} - -ulong -_pixelbits(Memimage *i, Point pt) -{ - uchar *p; - ulong val; - int off, bpp, npack; - - val = 0; - p = byteaddr(i, pt); - switch(bpp=i->depth){ - case 1: - case 2: - case 4: - npack = 8/bpp; - off = pt.x%npack; - val = p[0] >> bpp*(npack-1-off); - val &= (1<<bpp)-1; - break; - case 8: - val = p[0]; - break; - case 16: - val = p[0]|(p[1]<<8); - break; - case 24: - val = p[0]|(p[1]<<8)|(p[2]<<16); - break; - case 32: - val = p[0]|(p[1]<<8)|(p[2]<<16)|(p[3]<<24); - break; - } - while(bpp<32){ - val |= val<<bpp; - bpp *= 2; - } - return val; -} - -static Calcfn* -boolcopyfn(Memimage *img, Memimage *mask) -{ - if(mask->flags&Frepl && Dx(mask->r)==1 && Dy(mask->r)==1 && pixelbits(mask, mask->r.min)==~0) - return boolmemmove; - - switch(img->depth){ - case 8: - return boolcopy8; - case 16: - return boolcopy16; - case 24: - return boolcopy24; - case 32: - return boolcopy32; - default: - assert(0 /* boolcopyfn */); - } - return 0; -} - -/* - * Optimized draw for filling and scrolling; uses memset and memmove. - * -static void -memsetb(void *vp, uchar val, int n) -{ - uchar *p, *ep; - - p = vp; - ep = p+n; - while(p<ep) - *p++ = val; -} -*/ - -static void -memsets(void *vp, ushort val, int n) -{ - ushort *p, *ep; - - p = vp; - ep = p+n; - while(p<ep) - *p++ = val; -} - -static void -memsetl(void *vp, ulong val, int n) -{ - ulong *p, *ep; - - p = vp; - ep = p+n; - while(p<ep) - *p++ = val; -} - -static void -memset24(void *vp, ulong val, int n) -{ - uchar *p, *ep; - uchar a,b,c; - - p = vp; - ep = p+3*n; - a = val; - b = val>>8; - c = val>>16; - while(p<ep){ - *p++ = a; - *p++ = b; - *p++ = c; - } -} - -ulong -_imgtorgba(Memimage *img, ulong val) -{ - uchar r, g, b, a; - int nb, ov, v; - ulong chan; - uchar *p; - - a = 0xFF; - r = g = b = 0xAA; /* garbage */ - for(chan=img->chan; chan; chan>>=8){ - nb = NBITS(chan); - ov = v = val&((1<<nb)-1); - val >>= nb; - - while(nb < 8){ - v |= v<<nb; - nb *= 2; - } - v >>= (nb-8); - - switch(TYPE(chan)){ - case CRed: - r = v; - break; - case CGreen: - g = v; - break; - case CBlue: - b = v; - break; - case CAlpha: - a = v; - break; - case CGrey: - r = g = b = v; - break; - case CMap: - p = img->cmap->cmap2rgb+3*ov; - r = *p++; - g = *p++; - b = *p; - break; - } - } - return (r<<24)|(g<<16)|(b<<8)|a; -} - -ulong -_rgbatoimg(Memimage *img, ulong rgba) -{ - ulong chan; - int d, nb; - ulong v; - uchar *p, r, g, b, a, m; - - v = 0; - r = rgba>>24; - g = rgba>>16; - b = rgba>>8; - a = rgba; - d = 0; - for(chan=img->chan; chan; chan>>=8){ - nb = NBITS(chan); - switch(TYPE(chan)){ - case CRed: - v |= (r>>(8-nb))<<d; - break; - case CGreen: - v |= (g>>(8-nb))<<d; - break; - case CBlue: - v |= (b>>(8-nb))<<d; - break; - case CAlpha: - v |= (a>>(8-nb))<<d; - break; - case CMap: - p = img->cmap->rgb2cmap; - m = p[(r>>4)*256+(g>>4)*16+(b>>4)]; - v |= (m>>(8-nb))<<d; - break; - case CGrey: - m = RGB2K(r,g,b); - v |= (m>>(8-nb))<<d; - break; - } - d += nb; - } -// print("rgba2img %.8lux = %.*lux\n", rgba, 2*d/8, v); - return v; -} - -#define DBG if(0) -static int -memoptdraw(Memdrawparam *par) -{ - int m, y, dy, dx, op; - ulong v; - Memimage *src; - Memimage *dst; - - dx = Dx(par->r); - dy = Dy(par->r); - src = par->src; - dst = par->dst; - op = par->op; - -DBG print("state %lux mval %lux dd %d\n", par->state, par->mval, dst->depth); - /* - * If we have an opaque mask and source is one opaque pixel we can convert to the - * destination format and just replicate with memset. - */ - m = Simplesrc|Simplemask|Fullmask; - if((par->state&m)==m && (par->srgba&0xFF) == 0xFF && (op ==S || op == SoverD)){ - uchar *dp, p[4]; - int d, dwid, ppb, np, nb; - uchar lm, rm; - -DBG print("memopt, dst %p, dst->data->bdata %p\n", dst, dst->data->bdata); - dwid = dst->width*sizeof(ulong); - dp = byteaddr(dst, par->r.min); - v = par->sdval; -DBG print("sdval %lud, depth %d\n", v, dst->depth); - switch(dst->depth){ - case 1: - case 2: - case 4: - for(d=dst->depth; d<8; d*=2) - v |= (v<<d); - ppb = 8/dst->depth; /* pixels per byte */ - m = ppb-1; - /* left edge */ - np = par->r.min.x&m; /* no. pixels unused on left side of word */ - dx -= (ppb-np); - nb = 8 - np * dst->depth; /* no. bits used on right side of word */ - lm = (1<<nb)-1; -DBG print("np %d x %d nb %d lm %ux ppb %d m %ux\n", np, par->r.min.x, nb, lm, ppb, m); - - /* right edge */ - np = par->r.max.x&m; /* no. pixels used on left side of word */ - dx -= np; - nb = 8 - np * dst->depth; /* no. bits unused on right side of word */ - rm = ~((1<<nb)-1); -DBG print("np %d x %d nb %d rm %ux ppb %d m %ux\n", np, par->r.max.x, nb, rm, ppb, m); - -DBG print("dx %d Dx %d\n", dx, Dx(par->r)); - /* lm, rm are masks that are 1 where we should touch the bits */ - if(dx < 0){ /* just one byte */ - lm &= rm; - for(y=0; y<dy; y++, dp+=dwid) - *dp ^= (v ^ *dp) & lm; - }else if(dx == 0){ /* no full bytes */ - if(lm) - dwid--; - - for(y=0; y<dy; y++, dp+=dwid){ - if(lm){ -DBG print("dp %p v %lux lm %ux (v ^ *dp) & lm %lux\n", dp, v, lm, (v^*dp)&lm); - *dp ^= (v ^ *dp) & lm; - dp++; - } - *dp ^= (v ^ *dp) & rm; - } - }else{ /* full bytes in middle */ - dx /= ppb; - if(lm) - dwid--; - dwid -= dx; - - for(y=0; y<dy; y++, dp+=dwid){ - if(lm){ - *dp ^= (v ^ *dp) & lm; - dp++; - } - memset(dp, v, dx); - dp += dx; - *dp ^= (v ^ *dp) & rm; - } - } - return 1; - case 8: - for(y=0; y<dy; y++, dp+=dwid) - memset(dp, v, dx); - return 1; - case 16: - p[0] = v; /* make little endian */ - p[1] = v>>8; - v = *(ushort*)p; -DBG print("dp=%p; dx=%d; for(y=0; y<%d; y++, dp+=%d)\nmemsets(dp, v, dx);\n", - dp, dx, dy, dwid); - for(y=0; y<dy; y++, dp+=dwid) - memsets(dp, v, dx); - return 1; - case 24: - for(y=0; y<dy; y++, dp+=dwid) - memset24(dp, v, dx); - return 1; - case 32: - p[0] = v; /* make little endian */ - p[1] = v>>8; - p[2] = v>>16; - p[3] = v>>24; - v = *(ulong*)p; - for(y=0; y<dy; y++, dp+=dwid) - memsetl(dp, v, dx); - return 1; - default: - assert(0 /* bad dest depth in memoptdraw */); - } - } - - /* - * If no source alpha, an opaque mask, we can just copy the - * source onto the destination. If the channels are the same and - * the source is not replicated, memmove suffices. - */ - m = Simplemask|Fullmask; - if((par->state&(m|Replsrc))==m && src->depth >= 8 - && src->chan == dst->chan && !(src->flags&Falpha) && (op == S || op == SoverD)){ - uchar *sp, *dp; - long swid, dwid, nb; - int dir; - - if(src->data == dst->data && byteaddr(dst, par->r.min) > byteaddr(src, par->sr.min)) - dir = -1; - else - dir = 1; - - swid = src->width*sizeof(ulong); - dwid = dst->width*sizeof(ulong); - sp = byteaddr(src, par->sr.min); - dp = byteaddr(dst, par->r.min); - if(dir == -1){ - sp += (dy-1)*swid; - dp += (dy-1)*dwid; - swid = -swid; - dwid = -dwid; - } - nb = (dx*src->depth)/8; - for(y=0; y<dy; y++, sp+=swid, dp+=dwid) - memmove(dp, sp, nb); - return 1; - } - - /* - * If we have a 1-bit mask, 1-bit source, and 1-bit destination, and - * they're all bit aligned, we can just use bit operators. This happens - * when we're manipulating boolean masks, e.g. in the arc code. - */ - if((par->state&(Simplemask|Simplesrc|Replmask|Replsrc))==0 - && dst->chan==GREY1 && src->chan==GREY1 && par->mask->chan==GREY1 - && (par->r.min.x&7)==(par->sr.min.x&7) && (par->r.min.x&7)==(par->mr.min.x&7)){ - uchar *sp, *dp, *mp; - uchar lm, rm; - long swid, dwid, mwid; - int i, x, dir; - - sp = byteaddr(src, par->sr.min); - dp = byteaddr(dst, par->r.min); - mp = byteaddr(par->mask, par->mr.min); - swid = src->width*sizeof(ulong); - dwid = dst->width*sizeof(ulong); - mwid = par->mask->width*sizeof(ulong); - - if(src->data == dst->data && byteaddr(dst, par->r.min) > byteaddr(src, par->sr.min)){ - dir = -1; - }else - dir = 1; - - lm = 0xFF>>(par->r.min.x&7); - rm = 0xFF<<(8-(par->r.max.x&7)); - dx -= (8-(par->r.min.x&7)) + (par->r.max.x&7); - - if(dx < 0){ /* one byte wide */ - lm &= rm; - if(dir == -1){ - dp += dwid*(dy-1); - sp += swid*(dy-1); - mp += mwid*(dy-1); - dwid = -dwid; - swid = -swid; - mwid = -mwid; - } - for(y=0; y<dy; y++){ - *dp ^= (*dp ^ *sp) & *mp & lm; - dp += dwid; - sp += swid; - mp += mwid; - } - return 1; - } - - dx /= 8; - if(dir == 1){ - i = (lm!=0)+dx+(rm!=0); - mwid -= i; - swid -= i; - dwid -= i; - for(y=0; y<dy; y++, dp+=dwid, sp+=swid, mp+=mwid){ - if(lm){ - *dp ^= (*dp ^ *sp++) & *mp++ & lm; - dp++; - } - for(x=0; x<dx; x++){ - *dp ^= (*dp ^ *sp++) & *mp++; - dp++; - } - if(rm){ - *dp ^= (*dp ^ *sp++) & *mp++ & rm; - dp++; - } - } - return 1; - }else{ - /* dir == -1 */ - i = (lm!=0)+dx+(rm!=0); - dp += dwid*(dy-1)+i-1; - sp += swid*(dy-1)+i-1; - mp += mwid*(dy-1)+i-1; - dwid = -dwid+i; - swid = -swid+i; - mwid = -mwid+i; - for(y=0; y<dy; y++, dp+=dwid, sp+=swid, mp+=mwid){ - if(rm){ - *dp ^= (*dp ^ *sp--) & *mp-- & rm; - dp--; - } - for(x=0; x<dx; x++){ - *dp ^= (*dp ^ *sp--) & *mp--; - dp--; - } - if(lm){ - *dp ^= (*dp ^ *sp--) & *mp-- & lm; - dp--; - } - } - } - return 1; - } - return 0; -} -#undef DBG - -/* - * Boolean character drawing. - * Solid opaque color through a 1-bit greyscale mask. - */ -#define DBG if(0) -static int -chardraw(Memdrawparam *par) -{ - ulong bits; - int i, ddepth, dy, dx, x, bx, ex, y, npack, bsh, depth, op; - ulong v, maskwid, dstwid; - uchar *wp, *rp, *q, *wc; - ushort *ws; - ulong *wl; - uchar sp[4]; - Rectangle r, mr; - Memimage *mask, *src, *dst; - -if(0) if(drawdebug) iprint("chardraw? mf %lux md %d sf %lux dxs %d dys %d dd %d ddat %p sdat %p\n", - par->mask->flags, par->mask->depth, par->src->flags, - Dx(par->src->r), Dy(par->src->r), par->dst->depth, par->dst->data, par->src->data); - - mask = par->mask; - src = par->src; - dst = par->dst; - r = par->r; - mr = par->mr; - op = par->op; - - if((par->state&(Replsrc|Simplesrc|Replmask)) != (Replsrc|Simplesrc) - || mask->depth != 1 || src->flags&Falpha || dst->depth<8 || dst->data==src->data - || op != SoverD) - return 0; - -//if(drawdebug) iprint("chardraw..."); - - depth = mask->depth; - maskwid = mask->width*sizeof(ulong); - rp = byteaddr(mask, mr.min); - npack = 8/depth; - bsh = (mr.min.x % npack) * depth; - - wp = byteaddr(dst, r.min); - dstwid = dst->width*sizeof(ulong); -DBG print("bsh %d\n", bsh); - dy = Dy(r); - dx = Dx(r); - - ddepth = dst->depth; - - /* - * for loop counts from bsh to bsh+dx - * - * we want the bottom bits to be the amount - * to shift the pixels down, so for n≡0 (mod 8) we want - * bottom bits 7. for n≡1, 6, etc. - * the bits come from -n-1. - */ - - bx = -bsh-1; - ex = -bsh-1-dx; - bits = 0; - v = par->sdval; - - /* make little endian */ - sp[0] = v; - sp[1] = v>>8; - sp[2] = v>>16; - sp[3] = v>>24; - -//print("sp %x %x %x %x\n", sp[0], sp[1], sp[2], sp[3]); - for(y=0; y<dy; y++, rp+=maskwid, wp+=dstwid){ - q = rp; - if(bsh) - bits = *q++; - switch(ddepth){ - case 8: -//if(drawdebug) iprint("8loop..."); - wc = wp; - for(x=bx; x>ex; x--, wc++){ - i = x&7; - if(i == 8-1) - bits = *q++; -DBG print("bits %lux sh %d...", bits, i); - if((bits>>i)&1) - *wc = v; - } - break; - case 16: - ws = (ushort*)wp; - v = *(ushort*)sp; - for(x=bx; x>ex; x--, ws++){ - i = x&7; - if(i == 8-1) - bits = *q++; -DBG print("bits %lux sh %d...", bits, i); - if((bits>>i)&1) - *ws = v; - } - break; - case 24: - wc = wp; - for(x=bx; x>ex; x--, wc+=3){ - i = x&7; - if(i == 8-1) - bits = *q++; -DBG print("bits %lux sh %d...", bits, i); - if((bits>>i)&1){ - wc[0] = sp[0]; - wc[1] = sp[1]; - wc[2] = sp[2]; - } - } - break; - case 32: - wl = (ulong*)wp; - v = *(ulong*)sp; - for(x=bx; x>ex; x--, wl++){ - i = x&7; - if(i == 8-1) - bits = *q++; -DBG iprint("bits %lux sh %d...", bits, i); - if((bits>>i)&1) - *wl = v; - } - break; - } - } - -DBG print("\n"); - return 1; -} -#undef DBG - - -/* - * Fill entire byte with replicated (if necessary) copy of source pixel, - * assuming destination ldepth is >= source ldepth. - * - * This code is just plain wrong for >8bpp. - * -ulong -membyteval(Memimage *src) -{ - int i, val, bpp; - uchar uc; - - unloadmemimage(src, src->r, &uc, 1); - bpp = src->depth; - uc <<= (src->r.min.x&(7/src->depth))*src->depth; - uc &= ~(0xFF>>bpp); - // pixel value is now in high part of byte. repeat throughout byte - val = uc; - for(i=bpp; i<8; i<<=1) - val |= val>>i; - return val; -} - * - */ - -void -_memfillcolor(Memimage *i, ulong val) -{ - ulong bits; - int d, y; - uchar p[4]; - - if(val == DNofill) - return; - - bits = _rgbatoimg(i, val); - switch(i->depth){ - case 24: /* 24-bit images suck */ - for(y=i->r.min.y; y<i->r.max.y; y++) - memset24(byteaddr(i, Pt(i->r.min.x, y)), bits, Dx(i->r)); - break; - default: /* 1, 2, 4, 8, 16, 32 */ - for(d=i->depth; d<32; d*=2) - bits = (bits << d) | bits; - p[0] = bits; /* make little endian */ - p[1] = bits>>8; - p[2] = bits>>16; - p[3] = bits>>24; - bits = *(ulong*)p; - memsetl(wordaddr(i, i->r.min), bits, i->width*Dy(i->r)); - break; - } -} - diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/drawtest.c b/sys/src/cmd/unix/drawterm/libmemdraw/drawtest.c deleted file mode 100644 index d19e1182d..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/drawtest.c +++ /dev/null @@ -1,1004 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <bio.h> -#include <draw.h> -#include <memdraw.h> - -#define DBG if(0) -#define RGB2K(r,g,b) ((299*((ulong)(r))+587*((ulong)(g))+114*((ulong)(b)))/1000) - -/* - * This program tests the 'memimagedraw' primitive stochastically. - * It tests the combination aspects of it thoroughly, but since the - * three images it uses are disjoint, it makes no check of the - * correct behavior when images overlap. That is, however, much - * easier to get right and to test. - */ - -void drawonepixel(Memimage*, Point, Memimage*, Point, Memimage*, Point); -void verifyone(void); -void verifyline(void); -void verifyrect(void); -void verifyrectrepl(int, int); -void putpixel(Memimage *img, Point pt, ulong nv); -ulong rgbatopix(uchar, uchar, uchar, uchar); - -char *dchan, *schan, *mchan; -int dbpp, sbpp, mbpp; - -int drawdebug=0; -int seed; -int niters = 100; -int dbpp; /* bits per pixel in destination */ -int sbpp; /* bits per pixel in src */ -int mbpp; /* bits per pixel in mask */ -int dpm; /* pixel mask at high part of byte, in destination */ -int nbytes; /* in destination */ - -int Xrange = 64; -int Yrange = 8; - -Memimage *dst; -Memimage *src; -Memimage *mask; -Memimage *stmp; -Memimage *mtmp; -Memimage *ones; -uchar *dstbits; -uchar *srcbits; -uchar *maskbits; -ulong *savedstbits; - -void -rdb(void) -{ -} - -int -iprint(char *fmt, ...) -{ - int n; - va_list va; - char buf[1024]; - - va_start(va, fmt); - n = doprint(buf, buf+sizeof buf, fmt, va) - buf; - va_end(va); - - write(1,buf,n); - return 1; -} - -void -main(int argc, char *argv[]) -{ - memimageinit(); - seed = time(0); - - ARGBEGIN{ - case 'x': - Xrange = atoi(ARGF()); - break; - case 'y': - Yrange = atoi(ARGF()); - break; - case 'n': - niters = atoi(ARGF()); - break; - case 's': - seed = atoi(ARGF()); - break; - }ARGEND - - dchan = "r8g8b8"; - schan = "r8g8b8"; - mchan = "r8g8b8"; - switch(argc){ - case 3: mchan = argv[2]; - case 2: schan = argv[1]; - case 1: dchan = argv[0]; - case 0: break; - default: goto Usage; - Usage: - fprint(2, "usage: dtest [dchan [schan [mchan]]]\n"); - exits("usage"); - } - - fmtinstall('b', numbconv); /* binary! */ - - fprint(2, "%s -x %d -y %d -s 0x%x %s %s %s\n", argv0, Xrange, Yrange, seed, dchan, schan, mchan); - srand(seed); - - dst = allocmemimage(Rect(0, 0, Xrange, Yrange), strtochan(dchan)); - src = allocmemimage(Rect(0, 0, Xrange, Yrange), strtochan(schan)); - mask = allocmemimage(Rect(0, 0, Xrange, Yrange), strtochan(mchan)); - stmp = allocmemimage(Rect(0, 0, Xrange, Yrange), strtochan(schan)); - mtmp = allocmemimage(Rect(0, 0, Xrange, Yrange), strtochan(mchan)); - ones = allocmemimage(Rect(0, 0, Xrange, Yrange), strtochan(mchan)); -// print("chan %lux %lux %lux %lux %lux %lux\n", dst->chan, src->chan, mask->chan, stmp->chan, mtmp->chan, ones->chan); - if(dst==0 || src==0 || mask==0 || mtmp==0 || ones==0) { - Alloc: - fprint(2, "dtest: allocation failed: %r\n"); - exits("alloc"); - } - nbytes = (4*Xrange+4)*Yrange; - srcbits = malloc(nbytes); - dstbits = malloc(nbytes); - maskbits = malloc(nbytes); - savedstbits = malloc(nbytes); - if(dstbits==0 || srcbits==0 || maskbits==0 || savedstbits==0) - goto Alloc; - dbpp = dst->depth; - sbpp = src->depth; - mbpp = mask->depth; - dpm = 0xFF ^ (0xFF>>dbpp); - memset(ones->data->bdata, 0xFF, ones->width*sizeof(ulong)*Yrange); - - - fprint(2, "dtest: verify single pixel operation\n"); - verifyone(); - - fprint(2, "dtest: verify full line non-replicated\n"); - verifyline(); - - fprint(2, "dtest: verify full rectangle non-replicated\n"); - verifyrect(); - - fprint(2, "dtest: verify full rectangle source replicated\n"); - verifyrectrepl(1, 0); - - fprint(2, "dtest: verify full rectangle mask replicated\n"); - verifyrectrepl(0, 1); - - fprint(2, "dtest: verify full rectangle source and mask replicated\n"); - verifyrectrepl(1, 1); - - exits(0); -} - -/* - * Dump out an ASCII representation of an image. The label specifies - * a list of characters to put at various points in the picture. - */ -static void -Bprintr5g6b5(Biobuf *bio, char*, ulong v) -{ - int r,g,b; - r = (v>>11)&31; - g = (v>>5)&63; - b = v&31; - Bprint(bio, "%.2x%.2x%.2x", r,g,b); -} - -static void -Bprintr5g5b5a1(Biobuf *bio, char*, ulong v) -{ - int r,g,b,a; - r = (v>>11)&31; - g = (v>>6)&31; - b = (v>>1)&31; - a = v&1; - Bprint(bio, "%.2x%.2x%.2x%.2x", r,g,b,a); -} - -void -dumpimage(char *name, Memimage *img, void *vdata, Point labelpt) -{ - Biobuf b; - uchar *data; - uchar *p; - char *arg; - void (*fmt)(Biobuf*, char*, ulong); - int npr, x, y, nb, bpp; - ulong v, mask; - Rectangle r; - - fmt = nil; - arg = nil; - switch(img->depth){ - case 1: - case 2: - case 4: - fmt = (void(*)(Biobuf*,char*,ulong))Bprint; - arg = "%.1ux"; - break; - case 8: - fmt = (void(*)(Biobuf*,char*,ulong))Bprint; - arg = "%.2ux"; - break; - case 16: - arg = nil; - if(img->chan == RGB16) - fmt = Bprintr5g6b5; - else{ - fmt = (void(*)(Biobuf*,char*,ulong))Bprint; - arg = "%.4ux"; - } - break; - case 24: - fmt = (void(*)(Biobuf*,char*,ulong))Bprint; - arg = "%.6lux"; - break; - case 32: - fmt = (void(*)(Biobuf*,char*,ulong))Bprint; - arg = "%.8lux"; - break; - } - if(fmt == nil){ - fprint(2, "bad format\n"); - abort(); - } - - r = img->r; - Binit(&b, 2, OWRITE); - data = vdata; - bpp = img->depth; - Bprint(&b, "%s\t%d\tr %R clipr %R repl %d data %p *%P\n", name, r.min.x, r, img->clipr, (img->flags&Frepl) ? 1 : 0, vdata, labelpt); - mask = (1ULL<<bpp)-1; -// for(y=r.min.y; y<r.max.y; y++){ - for(y=0; y<Yrange; y++){ - nb = 0; - v = 0; - p = data+(byteaddr(img, Pt(0,y))-(uchar*)img->data->bdata); - Bprint(&b, "%-4d\t", y); -// for(x=r.min.x; x<r.max.x; x++){ - for(x=0; x<Xrange; x++){ - if(x==0) - Bprint(&b, "\t"); - - if(x != 0 && (x%8)==0) - Bprint(&b, " "); - - npr = 0; - if(x==labelpt.x && y==labelpt.y){ - Bprint(&b, "*"); - npr++; - } - if(npr == 0) - Bprint(&b, " "); - - while(nb < bpp){ - v &= (1<<nb)-1; - v |= (ulong)(*p++) << nb; - nb += 8; - } - nb -= bpp; -// print("bpp %d v %.8lux mask %.8lux nb %d\n", bpp, v, mask, nb); - fmt(&b, arg, (v>>nb)&mask); - } - Bprint(&b, "\n"); - } - Bterm(&b); -} - -/* - * Verify that the destination pixel has the specified value. - * The value is in the high bits of v, suitably masked, but must - * be extracted from the destination Memimage. - */ -void -checkone(Point p, Point sp, Point mp) -{ - int delta; - uchar *dp, *sdp; - - delta = (uchar*)byteaddr(dst, p)-(uchar*)dst->data->bdata; - dp = (uchar*)dst->data->bdata+delta; - sdp = (uchar*)savedstbits+delta; - - if(memcmp(dp, sdp, (dst->depth+7)/8) != 0) { - fprint(2, "dtest: one bad pixel drawing at dst %P from source %P mask %P\n", p, sp, mp); - fprint(2, " %.2ux %.2ux %.2ux %.2ux should be %.2ux %.2ux %.2ux %.2ux\n", - dp[0], dp[1], dp[2], dp[3], sdp[0], sdp[1], sdp[2], sdp[3]); - fprint(2, "addresses dst %p src %p mask %p\n", dp, byteaddr(src, sp), byteaddr(mask, mp)); - dumpimage("src", src, src->data->bdata, sp); - dumpimage("mask", mask, mask->data->bdata, mp); - dumpimage("origdst", dst, dstbits, p); - dumpimage("dst", dst, dst->data->bdata, p); - dumpimage("gooddst", dst, savedstbits, p); - abort(); - } -} - -/* - * Verify that the destination line has the same value as the saved line. - */ -#define RECTPTS(r) (r).min.x, (r).min.y, (r).max.x, (r).max.y -void -checkline(Rectangle r, Point sp, Point mp, int y, Memimage *stmp, Memimage *mtmp) -{ - ulong *dp; - int nb; - ulong *saved; - - dp = wordaddr(dst, Pt(0, y)); - saved = savedstbits + y*dst->width; - if(dst->depth < 8) - nb = Xrange/(8/dst->depth); - else - nb = Xrange*(dst->depth/8); - if(memcmp(dp, saved, nb) != 0){ - fprint(2, "dtest: bad line at y=%d; saved %p dp %p\n", y, saved, dp); - fprint(2, "draw dst %R src %P mask %P\n", r, sp, mp); - dumpimage("src", src, src->data->bdata, sp); - if(stmp) dumpimage("stmp", stmp, stmp->data->bdata, sp); - dumpimage("mask", mask, mask->data->bdata, mp); - if(mtmp) dumpimage("mtmp", mtmp, mtmp->data->bdata, mp); - dumpimage("origdst", dst, dstbits, r.min); - dumpimage("dst", dst, dst->data->bdata, r.min); - dumpimage("gooddst", dst, savedstbits, r.min); - abort(); - } -} - -/* - * Fill the bits of an image with random data. - * The Memimage parameter is used only to make sure - * the data is well formatted: only ucbits is written. - */ -void -fill(Memimage *img, uchar *ucbits) -{ - int i, x, y; - ushort *up; - uchar alpha, r, g, b; - void *data; - - if((img->flags&Falpha) == 0){ - up = (ushort*)ucbits; - for(i=0; i<nbytes/2; i++) - *up++ = lrand() >> 7; - if(i+i != nbytes) - *(uchar*)up = lrand() >> 7; - }else{ - data = img->data->bdata; - img->data->bdata = ucbits; - - for(x=img->r.min.x; x<img->r.max.x; x++) - for(y=img->r.min.y; y<img->r.max.y; y++){ - alpha = rand() >> 4; - r = rand()%(alpha+1); - g = rand()%(alpha+1); - b = rand()%(alpha+1); - putpixel(img, Pt(x,y), rgbatopix(r,g,b,alpha)); - } - img->data->bdata = data; - } - -} - -/* - * Mask is preset; do the rest - */ -void -verifyonemask(void) -{ - Point dp, sp, mp; - - fill(dst, dstbits); - fill(src, srcbits); - memmove(dst->data->bdata, dstbits, dst->width*sizeof(ulong)*Yrange); - memmove(src->data->bdata, srcbits, src->width*sizeof(ulong)*Yrange); - memmove(mask->data->bdata, maskbits, mask->width*sizeof(ulong)*Yrange); - - dp.x = nrand(Xrange); - dp.y = nrand(Yrange); - - sp.x = nrand(Xrange); - sp.y = nrand(Yrange); - - mp.x = nrand(Xrange); - mp.y = nrand(Yrange); - - drawonepixel(dst, dp, src, sp, mask, mp); - memmove(mask->data->bdata, maskbits, mask->width*sizeof(ulong)*Yrange); - memmove(savedstbits, dst->data->bdata, dst->width*sizeof(ulong)*Yrange); - - memmove(dst->data->bdata, dstbits, dst->width*sizeof(ulong)*Yrange); - memimagedraw(dst, Rect(dp.x, dp.y, dp.x+1, dp.y+1), src, sp, mask, mp, SoverD); - memmove(mask->data->bdata, maskbits, mask->width*sizeof(ulong)*Yrange); - - checkone(dp, sp, mp); -} - -void -verifyone(void) -{ - int i; - - /* mask all zeros */ - memset(maskbits, 0, nbytes); - for(i=0; i<niters; i++) - verifyonemask(); - - /* mask all ones */ - memset(maskbits, 0xFF, nbytes); - for(i=0; i<niters; i++) - verifyonemask(); - - /* random mask */ - for(i=0; i<niters; i++){ - fill(mask, maskbits); - verifyonemask(); - } -} - -/* - * Mask is preset; do the rest - */ -void -verifylinemask(void) -{ - Point sp, mp, tp, up; - Rectangle dr; - int x; - - fill(dst, dstbits); - fill(src, srcbits); - memmove(dst->data->bdata, dstbits, dst->width*sizeof(ulong)*Yrange); - memmove(src->data->bdata, srcbits, src->width*sizeof(ulong)*Yrange); - memmove(mask->data->bdata, maskbits, mask->width*sizeof(ulong)*Yrange); - - dr.min.x = nrand(Xrange-1); - dr.min.y = nrand(Yrange-1); - dr.max.x = dr.min.x + 1 + nrand(Xrange-1-dr.min.x); - dr.max.y = dr.min.y + 1; - - sp.x = nrand(Xrange); - sp.y = nrand(Yrange); - - mp.x = nrand(Xrange); - mp.y = nrand(Yrange); - - tp = sp; - up = mp; - for(x=dr.min.x; x<dr.max.x && tp.x<Xrange && up.x<Xrange; x++,tp.x++,up.x++) - memimagedraw(dst, Rect(x, dr.min.y, x+1, dr.min.y+1), src, tp, mask, up, SoverD); - memmove(savedstbits, dst->data->bdata, dst->width*sizeof(ulong)*Yrange); - - memmove(dst->data->bdata, dstbits, dst->width*sizeof(ulong)*Yrange); - - memimagedraw(dst, dr, src, sp, mask, mp, SoverD); - checkline(dr, drawrepl(src->r, sp), drawrepl(mask->r, mp), dr.min.y, nil, nil); -} - -void -verifyline(void) -{ - int i; - - /* mask all ones */ - memset(maskbits, 0xFF, nbytes); - for(i=0; i<niters; i++) - verifylinemask(); - - /* mask all zeros */ - memset(maskbits, 0, nbytes); - for(i=0; i<niters; i++) - verifylinemask(); - - /* random mask */ - for(i=0; i<niters; i++){ - fill(mask, maskbits); - verifylinemask(); - } -} - -/* - * Mask is preset; do the rest - */ -void -verifyrectmask(void) -{ - Point sp, mp, tp, up; - Rectangle dr; - int x, y; - - fill(dst, dstbits); - fill(src, srcbits); - memmove(dst->data->bdata, dstbits, dst->width*sizeof(ulong)*Yrange); - memmove(src->data->bdata, srcbits, src->width*sizeof(ulong)*Yrange); - memmove(mask->data->bdata, maskbits, mask->width*sizeof(ulong)*Yrange); - - dr.min.x = nrand(Xrange-1); - dr.min.y = nrand(Yrange-1); - dr.max.x = dr.min.x + 1 + nrand(Xrange-1-dr.min.x); - dr.max.y = dr.min.y + 1 + nrand(Yrange-1-dr.min.y); - - sp.x = nrand(Xrange); - sp.y = nrand(Yrange); - - mp.x = nrand(Xrange); - mp.y = nrand(Yrange); - - tp = sp; - up = mp; - for(y=dr.min.y; y<dr.max.y && tp.y<Yrange && up.y<Yrange; y++,tp.y++,up.y++){ - for(x=dr.min.x; x<dr.max.x && tp.x<Xrange && up.x<Xrange; x++,tp.x++,up.x++) - memimagedraw(dst, Rect(x, y, x+1, y+1), src, tp, mask, up, SoverD); - tp.x = sp.x; - up.x = mp.x; - } - memmove(savedstbits, dst->data->bdata, dst->width*sizeof(ulong)*Yrange); - - memmove(dst->data->bdata, dstbits, dst->width*sizeof(ulong)*Yrange); - - memimagedraw(dst, dr, src, sp, mask, mp, SoverD); - for(y=0; y<Yrange; y++) - checkline(dr, drawrepl(src->r, sp), drawrepl(mask->r, mp), y, nil, nil); -} - -void -verifyrect(void) -{ - int i; - - /* mask all zeros */ - memset(maskbits, 0, nbytes); - for(i=0; i<niters; i++) - verifyrectmask(); - - /* mask all ones */ - memset(maskbits, 0xFF, nbytes); - for(i=0; i<niters; i++) - verifyrectmask(); - - /* random mask */ - for(i=0; i<niters; i++){ - fill(mask, maskbits); - verifyrectmask(); - } -} - -Rectangle -randrect(void) -{ - Rectangle r; - - r.min.x = nrand(Xrange-1); - r.min.y = nrand(Yrange-1); - r.max.x = r.min.x + 1 + nrand(Xrange-1-r.min.x); - r.max.y = r.min.y + 1 + nrand(Yrange-1-r.min.y); - return r; -} - -/* - * Return coordinate corresponding to x withing range [minx, maxx) - */ -int -tilexy(int minx, int maxx, int x) -{ - int sx; - - sx = (x-minx) % (maxx-minx); - if(sx < 0) - sx += maxx-minx; - return sx+minx; -} - -void -replicate(Memimage *i, Memimage *tmp) -{ - Rectangle r, r1; - int x, y, nb; - - /* choose the replication window (i->r) */ - r.min.x = nrand(Xrange-1); - r.min.y = nrand(Yrange-1); - /* make it trivial more often than pure chance allows */ - switch(lrand()&0){ - case 1: - r.max.x = r.min.x + 2; - r.max.y = r.min.y + 2; - if(r.max.x < Xrange && r.max.y < Yrange) - break; - /* fall through */ - case 0: - r.max.x = r.min.x + 1; - r.max.y = r.min.y + 1; - break; - default: - if(r.min.x+3 >= Xrange) - r.max.x = Xrange; - else - r.max.x = r.min.x+3 + nrand(Xrange-(r.min.x+3)); - - if(r.min.y+3 >= Yrange) - r.max.y = Yrange; - else - r.max.y = r.min.y+3 + nrand(Yrange-(r.min.y+3)); - } - assert(r.min.x >= 0); - assert(r.max.x <= Xrange); - assert(r.min.y >= 0); - assert(r.max.y <= Yrange); - /* copy from i to tmp so we have just the replicated bits */ - nb = tmp->width*sizeof(ulong)*Yrange; - memset(tmp->data->bdata, 0, nb); - memimagedraw(tmp, r, i, r.min, ones, r.min, SoverD); - memmove(i->data->bdata, tmp->data->bdata, nb); - /* i is now a non-replicated instance of the replication */ - /* replicate it by hand through tmp */ - memset(tmp->data->bdata, 0, nb); - x = -(tilexy(r.min.x, r.max.x, 0)-r.min.x); - for(; x<Xrange; x+=Dx(r)){ - y = -(tilexy(r.min.y, r.max.y, 0)-r.min.y); - for(; y<Yrange; y+=Dy(r)){ - /* set r1 to instance of tile by translation */ - r1.min.x = x; - r1.min.y = y; - r1.max.x = r1.min.x+Dx(r); - r1.max.y = r1.min.y+Dy(r); - memimagedraw(tmp, r1, i, r.min, ones, r.min, SoverD); - } - } - i->flags |= Frepl; - i->r = r; - i->clipr = randrect(); -// fprint(2, "replicate [[%d %d] [%d %d]] [[%d %d][%d %d]]\n", r.min.x, r.min.y, r.max.x, r.max.y, -// i->clipr.min.x, i->clipr.min.y, i->clipr.max.x, i->clipr.max.y); - tmp->clipr = i->clipr; -} - -/* - * Mask is preset; do the rest - */ -void -verifyrectmaskrepl(int srcrepl, int maskrepl) -{ - Point sp, mp, tp, up; - Rectangle dr; - int x, y; - Memimage *s, *m; - -// print("verfrect %d %d\n", srcrepl, maskrepl); - src->flags &= ~Frepl; - src->r = Rect(0, 0, Xrange, Yrange); - src->clipr = src->r; - stmp->flags &= ~Frepl; - stmp->r = Rect(0, 0, Xrange, Yrange); - stmp->clipr = src->r; - mask->flags &= ~Frepl; - mask->r = Rect(0, 0, Xrange, Yrange); - mask->clipr = mask->r; - mtmp->flags &= ~Frepl; - mtmp->r = Rect(0, 0, Xrange, Yrange); - mtmp->clipr = mask->r; - - fill(dst, dstbits); - fill(src, srcbits); - - memmove(dst->data->bdata, dstbits, dst->width*sizeof(ulong)*Yrange); - memmove(src->data->bdata, srcbits, src->width*sizeof(ulong)*Yrange); - memmove(mask->data->bdata, maskbits, mask->width*sizeof(ulong)*Yrange); - - if(srcrepl){ - replicate(src, stmp); - s = stmp; - }else - s = src; - if(maskrepl){ - replicate(mask, mtmp); - m = mtmp; - }else - m = mask; - - dr = randrect(); - - sp.x = nrand(Xrange); - sp.y = nrand(Yrange); - - mp.x = nrand(Xrange); - mp.y = nrand(Yrange); - -DBG print("smalldraws\n"); - for(tp.y=sp.y,up.y=mp.y,y=dr.min.y; y<dr.max.y && tp.y<Yrange && up.y<Yrange; y++,tp.y++,up.y++) - for(tp.x=sp.x,up.x=mp.x,x=dr.min.x; x<dr.max.x && tp.x<Xrange && up.x<Xrange; x++,tp.x++,up.x++) - memimagedraw(dst, Rect(x, y, x+1, y+1), s, tp, m, up, SoverD); - memmove(savedstbits, dst->data->bdata, dst->width*sizeof(ulong)*Yrange); - - memmove(dst->data->bdata, dstbits, dst->width*sizeof(ulong)*Yrange); - -DBG print("bigdraw\n"); - memimagedraw(dst, dr, src, sp, mask, mp, SoverD); - for(y=0; y<Yrange; y++) - checkline(dr, drawrepl(src->r, sp), drawrepl(mask->r, mp), y, srcrepl?stmp:nil, maskrepl?mtmp:nil); -} - -void -verifyrectrepl(int srcrepl, int maskrepl) -{ - int i; - - /* mask all ones */ - memset(maskbits, 0xFF, nbytes); - for(i=0; i<niters; i++) - verifyrectmaskrepl(srcrepl, maskrepl); - - /* mask all zeros */ - memset(maskbits, 0, nbytes); - for(i=0; i<niters; i++) - verifyrectmaskrepl(srcrepl, maskrepl); - - /* random mask */ - for(i=0; i<niters; i++){ - fill(mask, maskbits); - verifyrectmaskrepl(srcrepl, maskrepl); - } -} - -/* - * Trivial draw implementation. - * Color values are passed around as ulongs containing ααRRGGBB - */ - -/* - * Convert v, which is nhave bits wide, into its nwant bits wide equivalent. - * Replicates to widen the value, truncates to narrow it. - */ -ulong -replbits(ulong v, int nhave, int nwant) -{ - v &= (1<<nhave)-1; - for(; nhave<nwant; nhave*=2) - v |= v<<nhave; - v >>= (nhave-nwant); - return v & ((1<<nwant)-1); -} - -/* - * Decode a pixel into the uchar* values. - */ -void -pixtorgba(ulong v, uchar *r, uchar *g, uchar *b, uchar *a) -{ - *a = v>>24; - *r = v>>16; - *g = v>>8; - *b = v; -} - -/* - * Convert uchar channels into ulong pixel. - */ -ulong -rgbatopix(uchar r, uchar g, uchar b, uchar a) -{ - return (a<<24)|(r<<16)|(g<<8)|b; -} - -/* - * Retrieve the pixel value at pt in the image. - */ -ulong -getpixel(Memimage *img, Point pt) -{ - uchar r, g, b, a, *p; - int nbits, npack, bpp; - ulong v, c, rbits, bits; - - r = g = b = 0; - a = ~0; /* default alpha is full */ - - p = byteaddr(img, pt); - v = p[0]|(p[1]<<8)|(p[2]<<16)|(p[3]<<24); - bpp = img->depth; - if(bpp<8){ - /* - * Sub-byte greyscale pixels. - * - * We want to throw away the top pt.x%npack pixels and then use the next bpp bits - * in the bottom byte of v. This madness is due to having big endian bits - * but little endian bytes. - */ - npack = 8/bpp; - v >>= 8 - bpp*(pt.x%npack+1); - v &= (1<<bpp)-1; - r = g = b = replbits(v, bpp, 8); - }else{ - /* - * General case. We need to parse the channel descriptor and do what it says. - * In all channels but the color map, we replicate to 8 bits because that's the - * precision that all calculations are done at. - * - * In the case of the color map, we leave the bits alone, in case a color map - * with less than 8 bits of index is used. This is currently disallowed, so it's - * sort of silly. - */ - - for(c=img->chan; c; c>>=8){ - nbits = NBITS(c); - bits = v & ((1<<nbits)-1); - rbits = replbits(bits, nbits, 8); - v >>= nbits; - switch(TYPE(c)){ - case CRed: - r = rbits; - break; - case CGreen: - g = rbits; - break; - case CBlue: - b = rbits; - break; - case CGrey: - r = g = b = rbits; - break; - case CAlpha: - a = rbits; - break; - case CMap: - p = img->cmap->cmap2rgb + 3*bits; - r = p[0]; - g = p[1]; - b = p[2]; - break; - case CIgnore: - break; - default: - fprint(2, "unknown channel type %lud\n", TYPE(c)); - abort(); - } - } - } - return rgbatopix(r, g, b, a); -} - -/* - * Return the greyscale equivalent of a pixel. - */ -uchar -getgrey(Memimage *img, Point pt) -{ - uchar r, g, b, a; - pixtorgba(getpixel(img, pt), &r, &g, &b, &a); - return RGB2K(r, g, b); -} - -/* - * Return the value at pt in image, if image is interpreted - * as a mask. This means the alpha channel if present, else - * the greyscale or its computed equivalent. - */ -uchar -getmask(Memimage *img, Point pt) -{ - if(img->flags&Falpha) - return getpixel(img, pt)>>24; - else - return getgrey(img, pt); -} -#undef DBG - -#define DBG if(0) -/* - * Write a pixel to img at point pt. - * - * We do this by reading a 32-bit little endian - * value from p and then writing it back - * after tweaking the appropriate bits. Because - * the data is little endian, we don't have to worry - * about what the actual depth is, as long as it is - * less than 32 bits. - */ -void -putpixel(Memimage *img, Point pt, ulong nv) -{ - uchar r, g, b, a, *p, *q; - ulong c, mask, bits, v; - int bpp, sh, npack, nbits; - - pixtorgba(nv, &r, &g, &b, &a); - - p = byteaddr(img, pt); - v = p[0]|(p[1]<<8)|(p[2]<<16)|(p[3]<<24); - bpp = img->depth; -DBG print("v %.8lux...", v); - if(bpp < 8){ - /* - * Sub-byte greyscale pixels. We need to skip the leftmost pt.x%npack pixels, - * which is equivalent to skipping the rightmost npack - pt.x%npack - 1 pixels. - */ - npack = 8/bpp; - sh = bpp*(npack - pt.x%npack - 1); - bits = RGB2K(r,g,b); -DBG print("repl %lux 8 %d = %lux...", bits, bpp, replbits(bits, 8, bpp)); - bits = replbits(bits, 8, bpp); - mask = (1<<bpp)-1; -DBG print("bits %lux mask %lux sh %d...", bits, mask, sh); - mask <<= sh; - bits <<= sh; -DBG print("(%lux & %lux) | (%lux & %lux)", v, ~mask, bits, mask); - v = (v & ~mask) | (bits & mask); - } else { - /* - * General case. We need to parse the channel descriptor again. - */ - sh = 0; - for(c=img->chan; c; c>>=8){ - nbits = NBITS(c); - switch(TYPE(c)){ - case CRed: - bits = r; - break; - case CGreen: - bits = g; - break; - case CBlue: - bits = b; - break; - case CGrey: - bits = RGB2K(r, g, b); - break; - case CAlpha: - bits = a; - break; - case CIgnore: - bits = 0; - break; - case CMap: - q = img->cmap->rgb2cmap; - bits = q[(r>>4)*16*16+(g>>4)*16+(b>>4)]; - break; - default: - SET(bits); - fprint(2, "unknown channel type %lud\n", TYPE(c)); - abort(); - } - -DBG print("repl %lux 8 %d = %lux...", bits, nbits, replbits(bits, 8, nbits)); - if(TYPE(c) != CMap) - bits = replbits(bits, 8, nbits); - mask = (1<<nbits)-1; -DBG print("bits %lux mask %lux sh %d...", bits, mask, sh); - bits <<= sh; - mask <<= sh; - v = (v & ~mask) | (bits & mask); - sh += nbits; - } - } -DBG print("v %.8lux\n", v); - p[0] = v; - p[1] = v>>8; - p[2] = v>>16; - p[3] = v>>24; -} -#undef DBG - -#define DBG if(0) -void -drawonepixel(Memimage *dst, Point dp, Memimage *src, Point sp, Memimage *mask, Point mp) -{ - uchar m, M, sr, sg, sb, sa, sk, dr, dg, db, da, dk; - - pixtorgba(getpixel(dst, dp), &dr, &dg, &db, &da); - pixtorgba(getpixel(src, sp), &sr, &sg, &sb, &sa); - m = getmask(mask, mp); - M = 255-(sa*m)/255; - -DBG print("dst %x %x %x %x src %x %x %x %x m %x = ", dr,dg,db,da, sr,sg,sb,sa, m); - if(dst->flags&Fgrey){ - /* - * We need to do the conversion to grey before the alpha calculation - * because the draw operator does this, and we need to be operating - * at the same precision so we get exactly the same answers. - */ - sk = RGB2K(sr, sg, sb); - dk = RGB2K(dr, dg, db); - dk = (sk*m + dk*M)/255; - dr = dg = db = dk; - da = (sa*m + da*M)/255; - }else{ - /* - * True color alpha calculation treats all channels (including alpha) - * the same. It might have been nice to use an array, but oh well. - */ - dr = (sr*m + dr*M)/255; - dg = (sg*m + dg*M)/255; - db = (sb*m + db*M)/255; - da = (sa*m + da*M)/255; - } - -DBG print("%x %x %x %x\n", dr,dg,db,da); - putpixel(dst, dp, rgbatopix(dr, dg, db, da)); -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/ellipse.c b/sys/src/cmd/unix/drawterm/libmemdraw/ellipse.c deleted file mode 100644 index 164ab0a1b..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/ellipse.c +++ /dev/null @@ -1,248 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -/* - * ellipse(dst, c, a, b, t, src, sp) - * draws an ellipse centered at c with semiaxes a,b>=0 - * and semithickness t>=0, or filled if t<0. point sp - * in src maps to c in dst - * - * very thick skinny ellipses are brushed with circles (slow) - * others are approximated by filling between 2 ellipses - * criterion for very thick when b<a: t/b > 0.5*x/(1-x) - * where x = b/a - */ - -typedef struct Param Param; -typedef struct State State; - -static void bellipse(int, State*, Param*); -static void erect(int, int, int, int, Param*); -static void eline(int, int, int, int, Param*); - -struct Param { - Memimage *dst; - Memimage *src; - Point c; - int t; - Point sp; - Memimage *disc; - int op; -}; - -/* - * denote residual error by e(x,y) = b^2*x^2 + a^2*y^2 - a^2*b^2 - * e(x,y) = 0 on ellipse, e(x,y) < 0 inside, e(x,y) > 0 outside - */ - -struct State { - int a; - int x; - vlong a2; /* a^2 */ - vlong b2; /* b^2 */ - vlong b2x; /* b^2 * x */ - vlong a2y; /* a^2 * y */ - vlong c1; - vlong c2; /* test criteria */ - vlong ee; /* ee = e(x+1/2,y-1/2) - (a^2+b^2)/4 */ - vlong dxe; - vlong dye; - vlong d2xe; - vlong d2ye; -}; - -static -State* -newstate(State *s, int a, int b) -{ - s->x = 0; - s->a = a; - s->a2 = (vlong)(a*a); - s->b2 = (vlong)(b*b); - s->b2x = (vlong)0; - s->a2y = s->a2*(vlong)b; - s->c1 = -((s->a2>>2) + (vlong)(a&1) + s->b2); - s->c2 = -((s->b2>>2) + (vlong)(b&1)); - s->ee = -s->a2y; - s->dxe = (vlong)0; - s->dye = s->ee<<1; - s->d2xe = s->b2<<1; - s->d2ye = s->a2<<1; - return s; -} - -/* - * return x coord of rightmost pixel on next scan line - */ -static -int -step(State *s) -{ - while(s->x < s->a) { - if(s->ee+s->b2x <= s->c1 || /* e(x+1,y-1/2) <= 0 */ - s->ee+s->a2y <= s->c2) { /* e(x+1/2,y) <= 0 (rare) */ - s->dxe += s->d2xe; - s->ee += s->dxe; - s->b2x += s->b2; - s->x++; - continue; - } - s->dye += s->d2ye; - s->ee += s->dye; - s->a2y -= s->a2; - if(s->ee-s->a2y <= s->c2) { /* e(x+1/2,y-1) <= 0 */ - s->dxe += s->d2xe; - s->ee += s->dxe; - s->b2x += s->b2; - return s->x++; - } - break; - } - return s->x; -} - -void -memellipse(Memimage *dst, Point c, int a, int b, int t, Memimage *src, Point sp, int op) -{ - State in, out; - int y, inb, inx, outx, u; - Param p; - - if(a < 0) - a = -a; - if(b < 0) - b = -b; - p.dst = dst; - p.src = src; - p.c = c; - p.t = t; - p.sp = subpt(sp, c); - p.disc = nil; - p.op = op; - - u = (t<<1)*(a-b); - if((b<a && u>b*b) || (a<b && -u>a*a)) { -/* if(b<a&&(t<<1)>b*b/a || a<b&&(t<<1)>a*a/b) # very thick */ - bellipse(b, newstate(&in, a, b), &p); - return; - } - - if(t < 0) { - inb = -1; - newstate(&out, a, y = b); - } else { - inb = b - t; - newstate(&out, a+t, y = b+t); - } - if(t > 0) - newstate(&in, a-t, inb); - inx = 0; - for( ; y>=0; y--) { - outx = step(&out); - if(y > inb) { - erect(-outx, y, outx, y, &p); - if(y != 0) - erect(-outx, -y, outx, -y, &p); - continue; - } - if(t > 0) { - inx = step(&in); - if(y == inb) - inx = 0; - } else if(inx > outx) - inx = outx; - erect(inx, y, outx, y, &p); - if(y != 0) - erect(inx, -y, outx, -y, &p); - erect(-outx, y, -inx, y, &p); - if(y != 0) - erect(-outx, -y, -inx, -y, &p); - inx = outx + 1; - } -} - -static Point p00 = {0, 0}; - -/* - * a brushed ellipse - */ -static -void -bellipse(int y, State *s, Param *p) -{ - int t, ox, oy, x, nx; - - t = p->t; - p->disc = allocmemimage(Rect(-t,-t,t+1,t+1), GREY1); - if(p->disc == nil) - return; - memfillcolor(p->disc, DTransparent); - memellipse(p->disc, p00, t, t, -1, memopaque, p00, p->op); - oy = y; - ox = 0; - nx = x = step(s); - do { - while(nx==x && y-->0) - nx = step(s); - y++; - eline(-x,-oy,-ox, -y, p); - eline(ox,-oy, x, -y, p); - eline(-x, y,-ox, oy, p); - eline(ox, y, x, oy, p); - ox = x+1; - x = nx; - y--; - oy = y; - } while(oy > 0); -} - -/* - * a rectangle with closed (not half-open) coordinates expressed - * relative to the center of the ellipse - */ -static -void -erect(int x0, int y0, int x1, int y1, Param *p) -{ - Rectangle r; - -/* print("R %d,%d %d,%d\n", x0, y0, x1, y1); */ - r = Rect(p->c.x+x0, p->c.y+y0, p->c.x+x1+1, p->c.y+y1+1); - memdraw(p->dst, r, p->src, addpt(p->sp, r.min), memopaque, p00, p->op); -} - -/* - * a brushed point similarly specified - */ -static -void -epoint(int x, int y, Param *p) -{ - Point p0; - Rectangle r; - -/* print("P%d %d,%d\n", p->t, x, y); */ - p0 = Pt(p->c.x+x, p->c.y+y); - r = Rpt(addpt(p0, p->disc->r.min), addpt(p0, p->disc->r.max)); - memdraw(p->dst, r, p->src, addpt(p->sp, r.min), p->disc, p->disc->r.min, p->op); -} - -/* - * a brushed horizontal or vertical line similarly specified - */ -static -void -eline(int x0, int y0, int x1, int y1, Param *p) -{ -/* print("L%d %d,%d %d,%d\n", p->t, x0, y0, x1, y1); */ - if(x1 > x0+1) - erect(x0+1, y0-p->t, x1-1, y1+p->t, p); - else if(y1 > y0+1) - erect(x0-p->t, y0+1, x1+p->t, y1-1, p); - epoint(x0, y0, p); - if(x1-x0 || y1-y0) - epoint(x1, y1, p); -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/fillpoly.c b/sys/src/cmd/unix/drawterm/libmemdraw/fillpoly.c deleted file mode 100644 index b2de9ad38..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/fillpoly.c +++ /dev/null @@ -1,525 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -typedef struct Seg Seg; - -struct Seg -{ - Point p0; - Point p1; - long num; - long den; - long dz; - long dzrem; - long z; - long zerr; - long d; -}; - -static void zsort(Seg **seg, Seg **ep); -static int ycompare(const void*, const void*); -static int xcompare(const void*, const void*); -static int zcompare(const void*, const void*); -static void xscan(Memimage *dst, Seg **seg, Seg *segtab, int nseg, int wind, Memimage *src, Point sp, int, int, int, int); -static void yscan(Memimage *dst, Seg **seg, Seg *segtab, int nseg, int wind, Memimage *src, Point sp, int, int); - -#ifdef NOT -static void -fillcolor(Memimage *dst, int left, int right, int y, Memimage *src, Point p) -{ - int srcval; - - USED(src); - srcval = p.x; - p.x = left; - p.y = y; - memset(byteaddr(dst, p), srcval, right-left); -} -#endif - -static void -fillline(Memimage *dst, int left, int right, int y, Memimage *src, Point p, int op) -{ - Rectangle r; - - r.min.x = left; - r.min.y = y; - r.max.x = right; - r.max.y = y+1; - p.x += left; - p.y += y; - memdraw(dst, r, src, p, memopaque, p, op); -} - -static void -fillpoint(Memimage *dst, int x, int y, Memimage *src, Point p, int op) -{ - Rectangle r; - - r.min.x = x; - r.min.y = y; - r.max.x = x+1; - r.max.y = y+1; - p.x += x; - p.y += y; - memdraw(dst, r, src, p, memopaque, p, op); -} - -void -memfillpoly(Memimage *dst, Point *vert, int nvert, int w, Memimage *src, Point sp, int op) -{ - _memfillpolysc(dst, vert, nvert, w, src, sp, 0, 0, 0, op); -} - -void -_memfillpolysc(Memimage *dst, Point *vert, int nvert, int w, Memimage *src, Point sp, int detail, int fixshift, int clipped, int op) -{ - Seg **seg, *segtab; - Point p0; - int i; - - if(nvert == 0) - return; - - seg = malloc((nvert+2)*sizeof(Seg*)); - if(seg == nil) - return; - segtab = malloc((nvert+1)*sizeof(Seg)); - if(segtab == nil) { - free(seg); - return; - } - - sp.x = (sp.x - vert[0].x) >> fixshift; - sp.y = (sp.y - vert[0].y) >> fixshift; - p0 = vert[nvert-1]; - if(!fixshift) { - p0.x <<= 1; - p0.y <<= 1; - } - for(i = 0; i < nvert; i++) { - segtab[i].p0 = p0; - p0 = vert[i]; - if(!fixshift) { - p0.x <<= 1; - p0.y <<= 1; - } - segtab[i].p1 = p0; - segtab[i].d = 1; - } - if(!fixshift) - fixshift = 1; - - xscan(dst, seg, segtab, nvert, w, src, sp, detail, fixshift, clipped, op); - if(detail) - yscan(dst, seg, segtab, nvert, w, src, sp, fixshift, op); - - free(seg); - free(segtab); -} - -static long -mod(long x, long y) -{ - long z; - - z = x%y; - if((long)(((ulong)z)^((ulong)y)) > 0 || z == 0) - return z; - return z + y; -} - -static long -sdiv(long x, long y) -{ - if((long)(((ulong)x)^((ulong)y)) >= 0 || x == 0) - return x/y; - - return (x+((y>>30)|1))/y-1; -} - -static long -smuldivmod(long x, long y, long z, long *mod) -{ - vlong vx; - - if(x == 0 || y == 0){ - *mod = 0; - return 0; - } - vx = x; - vx *= y; - *mod = vx % z; - if(*mod < 0) - *mod += z; /* z is always >0 */ - if((vx < 0) == (z < 0)) - return vx/z; - return -((-vx)/z); -} - -static void -xscan(Memimage *dst, Seg **seg, Seg *segtab, int nseg, int wind, Memimage *src, Point sp, int detail, int fixshift, int clipped, int op) -{ - long y, maxy, x, x2, xerr, xden, onehalf; - Seg **ep, **next, **p, **q, *s; - long n, i, iy, cnt, ix, ix2, minx, maxx; - Point pt; - void (*fill)(Memimage*, int, int, int, Memimage*, Point, int); - - fill = fillline; -/* - * This can only work on 8-bit destinations, since fillcolor is - * just using memset on sp.x. - * - * I'd rather not even enable it then, since then if the general - * code is too slow, someone will come up with a better improvement - * than this sleazy hack. -rsc - * - if(clipped && (src->flags&Frepl) && src->depth==8 && Dx(src->r)==1 && Dy(src->r)==1) { - fill = fillcolor; - sp.x = membyteval(src); - } - * - */ - USED(clipped); - - - for(i=0, s=segtab, p=seg; i<nseg; i++, s++) { - *p = s; - if(s->p0.y == s->p1.y) - continue; - if(s->p0.y > s->p1.y) { - pt = s->p0; - s->p0 = s->p1; - s->p1 = pt; - s->d = -s->d; - } - s->num = s->p1.x - s->p0.x; - s->den = s->p1.y - s->p0.y; - s->dz = sdiv(s->num, s->den) << fixshift; - s->dzrem = mod(s->num, s->den) << fixshift; - s->dz += sdiv(s->dzrem, s->den); - s->dzrem = mod(s->dzrem, s->den); - p++; - } - n = p-seg; - if(n == 0) - return; - *p = 0; - qsort(seg, p-seg , sizeof(Seg*), ycompare); - - onehalf = 0; - if(fixshift) - onehalf = 1 << (fixshift-1); - - minx = dst->clipr.min.x; - maxx = dst->clipr.max.x; - - y = seg[0]->p0.y; - if(y < (dst->clipr.min.y << fixshift)) - y = dst->clipr.min.y << fixshift; - iy = (y + onehalf) >> fixshift; - y = (iy << fixshift) + onehalf; - maxy = dst->clipr.max.y << fixshift; - - ep = next = seg; - - while(y<maxy) { - for(q = p = seg; p < ep; p++) { - s = *p; - if(s->p1.y < y) - continue; - s->z += s->dz; - s->zerr += s->dzrem; - if(s->zerr >= s->den) { - s->z++; - s->zerr -= s->den; - if(s->zerr < 0 || s->zerr >= s->den) - print("bad ratzerr1: %ld den %ld dzrem %ld\n", s->zerr, s->den, s->dzrem); - } - *q++ = s; - } - - for(p = next; *p; p++) { - s = *p; - if(s->p0.y >= y) - break; - if(s->p1.y < y) - continue; - s->z = s->p0.x; - s->z += smuldivmod(y - s->p0.y, s->num, s->den, &s->zerr); - if(s->zerr < 0 || s->zerr >= s->den) - print("bad ratzerr2: %ld den %ld ratdzrem %ld\n", s->zerr, s->den, s->dzrem); - *q++ = s; - } - ep = q; - next = p; - - if(ep == seg) { - if(*next == 0) - break; - iy = (next[0]->p0.y + onehalf) >> fixshift; - y = (iy << fixshift) + onehalf; - continue; - } - - zsort(seg, ep); - - for(p = seg; p < ep; p++) { - cnt = 0; - x = p[0]->z; - xerr = p[0]->zerr; - xden = p[0]->den; - ix = (x + onehalf) >> fixshift; - if(ix >= maxx) - break; - if(ix < minx) - ix = minx; - cnt += p[0]->d; - p++; - for(;;) { - if(p == ep) { - print("xscan: fill to infinity"); - return; - } - cnt += p[0]->d; - if((cnt&wind) == 0) - break; - p++; - } - x2 = p[0]->z; - ix2 = (x2 + onehalf) >> fixshift; - if(ix2 <= minx) - continue; - if(ix2 > maxx) - ix2 = maxx; - if(ix == ix2 && detail) { - if(xerr*p[0]->den + p[0]->zerr*xden > p[0]->den*xden) - x++; - ix = (x + x2) >> (fixshift+1); - ix2 = ix+1; - } - (*fill)(dst, ix, ix2, iy, src, sp, op); - } - y += (1<<fixshift); - iy++; - } -} - -static void -yscan(Memimage *dst, Seg **seg, Seg *segtab, int nseg, int wind, Memimage *src, Point sp, int fixshift, int op) -{ - long x, maxx, y, y2, yerr, yden, onehalf; - Seg **ep, **next, **p, **q, *s; - int n, i, ix, cnt, iy, iy2, miny, maxy; - Point pt; - - for(i=0, s=segtab, p=seg; i<nseg; i++, s++) { - *p = s; - if(s->p0.x == s->p1.x) - continue; - if(s->p0.x > s->p1.x) { - pt = s->p0; - s->p0 = s->p1; - s->p1 = pt; - s->d = -s->d; - } - s->num = s->p1.y - s->p0.y; - s->den = s->p1.x - s->p0.x; - s->dz = sdiv(s->num, s->den) << fixshift; - s->dzrem = mod(s->num, s->den) << fixshift; - s->dz += sdiv(s->dzrem, s->den); - s->dzrem = mod(s->dzrem, s->den); - p++; - } - n = p-seg; - if(n == 0) - return; - *p = 0; - qsort(seg, n , sizeof(Seg*), xcompare); - - onehalf = 0; - if(fixshift) - onehalf = 1 << (fixshift-1); - - miny = dst->clipr.min.y; - maxy = dst->clipr.max.y; - - x = seg[0]->p0.x; - if(x < (dst->clipr.min.x << fixshift)) - x = dst->clipr.min.x << fixshift; - ix = (x + onehalf) >> fixshift; - x = (ix << fixshift) + onehalf; - maxx = dst->clipr.max.x << fixshift; - - ep = next = seg; - - while(x<maxx) { - for(q = p = seg; p < ep; p++) { - s = *p; - if(s->p1.x < x) - continue; - s->z += s->dz; - s->zerr += s->dzrem; - if(s->zerr >= s->den) { - s->z++; - s->zerr -= s->den; - if(s->zerr < 0 || s->zerr >= s->den) - print("bad ratzerr1: %ld den %ld ratdzrem %ld\n", s->zerr, s->den, s->dzrem); - } - *q++ = s; - } - - for(p = next; *p; p++) { - s = *p; - if(s->p0.x >= x) - break; - if(s->p1.x < x) - continue; - s->z = s->p0.y; - s->z += smuldivmod(x - s->p0.x, s->num, s->den, &s->zerr); - if(s->zerr < 0 || s->zerr >= s->den) - print("bad ratzerr2: %ld den %ld ratdzrem %ld\n", s->zerr, s->den, s->dzrem); - *q++ = s; - } - ep = q; - next = p; - - if(ep == seg) { - if(*next == 0) - break; - ix = (next[0]->p0.x + onehalf) >> fixshift; - x = (ix << fixshift) + onehalf; - continue; - } - - zsort(seg, ep); - - for(p = seg; p < ep; p++) { - cnt = 0; - y = p[0]->z; - yerr = p[0]->zerr; - yden = p[0]->den; - iy = (y + onehalf) >> fixshift; - if(iy >= maxy) - break; - if(iy < miny) - iy = miny; - cnt += p[0]->d; - p++; - for(;;) { - if(p == ep) { - print("yscan: fill to infinity"); - return; - } - cnt += p[0]->d; - if((cnt&wind) == 0) - break; - p++; - } - y2 = p[0]->z; - iy2 = (y2 + onehalf) >> fixshift; - if(iy2 <= miny) - continue; - if(iy2 > maxy) - iy2 = maxy; - if(iy == iy2) { - if(yerr*p[0]->den + p[0]->zerr*yden > p[0]->den*yden) - y++; - iy = (y + y2) >> (fixshift+1); - fillpoint(dst, ix, iy, src, sp, op); - } - } - x += (1<<fixshift); - ix++; - } -} - -static void -zsort(Seg **seg, Seg **ep) -{ - int done; - Seg **q, **p, *s; - - if(ep-seg < 20) { - /* bubble sort by z - they should be almost sorted already */ - q = ep; - do { - done = 1; - q--; - for(p = seg; p < q; p++) { - if(p[0]->z > p[1]->z) { - s = p[0]; - p[0] = p[1]; - p[1] = s; - done = 0; - } - } - } while(!done); - } else { - q = ep-1; - for(p = seg; p < q; p++) { - if(p[0]->z > p[1]->z) { - qsort(seg, ep-seg, sizeof(Seg*), zcompare); - break; - } - } - } -} - -static int -ycompare(const void *a, const void *b) -{ - Seg **s0, **s1; - long y0, y1; - - s0 = (Seg**)a; - s1 = (Seg**)b; - y0 = (*s0)->p0.y; - y1 = (*s1)->p0.y; - - if(y0 < y1) - return -1; - if(y0 == y1) - return 0; - return 1; -} - -static int -xcompare(const void *a, const void *b) -{ - Seg **s0, **s1; - long x0, x1; - - s0 = (Seg**)a; - s1 = (Seg**)b; - x0 = (*s0)->p0.x; - x1 = (*s1)->p0.x; - - if(x0 < x1) - return -1; - if(x0 == x1) - return 0; - return 1; -} - -static int -zcompare(const void *a, const void *b) -{ - Seg **s0, **s1; - long z0, z1; - - s0 = (Seg**)a; - s1 = (Seg**)b; - z0 = (*s0)->z; - z1 = (*s1)->z; - - if(z0 < z1) - return -1; - if(z0 == z1) - return 0; - return 1; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/hwdraw.c b/sys/src/cmd/unix/drawterm/libmemdraw/hwdraw.c deleted file mode 100644 index 3f36250f2..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/hwdraw.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -hwdraw(Memdrawparam *p) -{ - USED(p); - return 0; /* could not satisfy request */ -} - diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/iprint.c b/sys/src/cmd/unix/drawterm/libmemdraw/iprint.c deleted file mode 100644 index 923b6b448..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/iprint.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -iprint(char *fmt,...) -{ - USED(fmt); - return -1; -} - diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/line.c b/sys/src/cmd/unix/drawterm/libmemdraw/line.c deleted file mode 100644 index ca83e3d61..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/line.c +++ /dev/null @@ -1,487 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -enum -{ - Arrow1 = 8, - Arrow2 = 10, - Arrow3 = 3, -}; - -#ifdef NOT -static -int -lmin(int a, int b) -{ - if(a < b) - return a; - return b; -} -#endif - -static -int -lmax(int a, int b) -{ - if(a > b) - return a; - return b; -} - -#ifdef NOTUSED -/* - * Rather than line clip, we run the Bresenham loop over the full line, - * and clip on each pixel. This is more expensive but means that - * lines look the same regardless of how the windowing has tiled them. - * For speed, we check for clipping outside the loop and make the - * test easy when possible. - */ - -static -void -horline1(Memimage *dst, Point p0, Point p1, int srcval, Rectangle clipr) -{ - int x, y, dy, deltay, deltax, maxx; - int dd, easy, e, bpp, m, m0; - uchar *d; - - deltax = p1.x - p0.x; - deltay = p1.y - p0.y; - dd = dst->width*sizeof(ulong); - dy = 1; - if(deltay < 0){ - dd = -dd; - deltay = -deltay; - dy = -1; - } - maxx = lmin(p1.x, clipr.max.x-1); - bpp = dst->depth; - m0 = 0xFF^(0xFF>>bpp); - m = m0 >> (p0.x&(7/dst->depth))*bpp; - easy = ptinrect(p0, clipr) && ptinrect(p1, clipr); - e = 2*deltay - deltax; - y = p0.y; - d = byteaddr(dst, p0); - deltay *= 2; - deltax = deltay - 2*deltax; - for(x=p0.x; x<=maxx; x++){ - if(easy || (clipr.min.x<=x && clipr.min.y<=y && y<clipr.max.y)) - *d ^= (*d^srcval) & m; - if(e > 0){ - y += dy; - d += dd; - e += deltax; - }else - e += deltay; - d++; - m >>= bpp; - if(m == 0) - m = m0; - } -} - -static -void -verline1(Memimage *dst, Point p0, Point p1, int srcval, Rectangle clipr) -{ - int x, y, deltay, deltax, maxy; - int easy, e, bpp, m, m0, dd; - uchar *d; - - deltax = p1.x - p0.x; - deltay = p1.y - p0.y; - dd = 1; - if(deltax < 0){ - dd = -1; - deltax = -deltax; - } - maxy = lmin(p1.y, clipr.max.y-1); - bpp = dst->depth; - m0 = 0xFF^(0xFF>>bpp); - m = m0 >> (p0.x&(7/dst->depth))*bpp; - easy = ptinrect(p0, clipr) && ptinrect(p1, clipr); - e = 2*deltax - deltay; - x = p0.x; - d = byteaddr(dst, p0); - deltax *= 2; - deltay = deltax - 2*deltay; - for(y=p0.y; y<=maxy; y++){ - if(easy || (clipr.min.y<=y && clipr.min.x<=x && x<clipr.max.x)) - *d ^= (*d^srcval) & m; - if(e > 0){ - x += dd; - d += dd; - e += deltay; - }else - e += deltax; - d += dst->width*sizeof(ulong); - m >>= bpp; - if(m == 0) - m = m0; - } -} - -static -void -horliner(Memimage *dst, Point p0, Point p1, Memimage *src, Point dsrc, Rectangle clipr) -{ - int x, y, sx, sy, deltay, deltax, minx, maxx; - int bpp, m, m0; - uchar *d, *s; - - deltax = p1.x - p0.x; - deltay = p1.y - p0.y; - sx = drawreplxy(src->r.min.x, src->r.max.x, p0.x+dsrc.x); - minx = lmax(p0.x, clipr.min.x); - maxx = lmin(p1.x, clipr.max.x-1); - bpp = dst->depth; - m0 = 0xFF^(0xFF>>bpp); - m = m0 >> (minx&(7/dst->depth))*bpp; - for(x=minx; x<=maxx; x++){ - y = p0.y + (deltay*(x-p0.x)+deltax/2)/deltax; - if(clipr.min.y<=y && y<clipr.max.y){ - d = byteaddr(dst, Pt(x, y)); - sy = drawreplxy(src->r.min.y, src->r.max.y, y+dsrc.y); - s = byteaddr(src, Pt(sx, sy)); - *d ^= (*d^*s) & m; - } - if(++sx >= src->r.max.x) - sx = src->r.min.x; - m >>= bpp; - if(m == 0) - m = m0; - } -} - -static -void -verliner(Memimage *dst, Point p0, Point p1, Memimage *src, Point dsrc, Rectangle clipr) -{ - int x, y, sx, sy, deltay, deltax, miny, maxy; - int bpp, m, m0; - uchar *d, *s; - - deltax = p1.x - p0.x; - deltay = p1.y - p0.y; - sy = drawreplxy(src->r.min.y, src->r.max.y, p0.y+dsrc.y); - miny = lmax(p0.y, clipr.min.y); - maxy = lmin(p1.y, clipr.max.y-1); - bpp = dst->depth; - m0 = 0xFF^(0xFF>>bpp); - for(y=miny; y<=maxy; y++){ - if(deltay == 0) /* degenerate line */ - x = p0.x; - else - x = p0.x + (deltax*(y-p0.y)+deltay/2)/deltay; - if(clipr.min.x<=x && x<clipr.max.x){ - m = m0 >> (x&(7/dst->depth))*bpp; - d = byteaddr(dst, Pt(x, y)); - sx = drawreplxy(src->r.min.x, src->r.max.x, x+dsrc.x); - s = byteaddr(src, Pt(sx, sy)); - *d ^= (*d^*s) & m; - } - if(++sy >= src->r.max.y) - sy = src->r.min.y; - } -} - -static -void -horline(Memimage *dst, Point p0, Point p1, Memimage *src, Point dsrc, Rectangle clipr) -{ - int x, y, deltay, deltax, minx, maxx; - int bpp, m, m0; - uchar *d, *s; - - deltax = p1.x - p0.x; - deltay = p1.y - p0.y; - minx = lmax(p0.x, clipr.min.x); - maxx = lmin(p1.x, clipr.max.x-1); - bpp = dst->depth; - m0 = 0xFF^(0xFF>>bpp); - m = m0 >> (minx&(7/dst->depth))*bpp; - for(x=minx; x<=maxx; x++){ - y = p0.y + (deltay*(x-p0.x)+deltay/2)/deltax; - if(clipr.min.y<=y && y<clipr.max.y){ - d = byteaddr(dst, Pt(x, y)); - s = byteaddr(src, addpt(dsrc, Pt(x, y))); - *d ^= (*d^*s) & m; - } - m >>= bpp; - if(m == 0) - m = m0; - } -} - -static -void -verline(Memimage *dst, Point p0, Point p1, Memimage *src, Point dsrc, Rectangle clipr) -{ - int x, y, deltay, deltax, miny, maxy; - int bpp, m, m0; - uchar *d, *s; - - deltax = p1.x - p0.x; - deltay = p1.y - p0.y; - miny = lmax(p0.y, clipr.min.y); - maxy = lmin(p1.y, clipr.max.y-1); - bpp = dst->depth; - m0 = 0xFF^(0xFF>>bpp); - for(y=miny; y<=maxy; y++){ - if(deltay == 0) /* degenerate line */ - x = p0.x; - else - x = p0.x + deltax*(y-p0.y)/deltay; - if(clipr.min.x<=x && x<clipr.max.x){ - m = m0 >> (x&(7/dst->depth))*bpp; - d = byteaddr(dst, Pt(x, y)); - s = byteaddr(src, addpt(dsrc, Pt(x, y))); - *d ^= (*d^*s) & m; - } - } -} -#endif /* NOTUSED */ - -static Memimage* -membrush(int radius) -{ - static Memimage *brush; - static int brushradius; - - if(brush==nil || brushradius!=radius){ - freememimage(brush); - brush = allocmemimage(Rect(0, 0, 2*radius+1, 2*radius+1), memopaque->chan); - if(brush != nil){ - memfillcolor(brush, DTransparent); /* zeros */ - memellipse(brush, Pt(radius, radius), radius, radius, -1, memopaque, Pt(radius, radius), S); - } - brushradius = radius; - } - return brush; -} - -static -void -discend(Point p, int radius, Memimage *dst, Memimage *src, Point dsrc, int op) -{ - Memimage *disc; - Rectangle r; - - disc = membrush(radius); - if(disc != nil){ - r.min.x = p.x - radius; - r.min.y = p.y - radius; - r.max.x = p.x + radius+1; - r.max.y = p.y + radius+1; - memdraw(dst, r, src, addpt(r.min, dsrc), disc, Pt(0,0), op); - } -} - -static -void -arrowend(Point tip, Point *pp, int end, int sin, int cos, int radius) -{ - int x1, x2, x3; - - /* before rotation */ - if(end == Endarrow){ - x1 = Arrow1; - x2 = Arrow2; - x3 = Arrow3; - }else{ - x1 = (end>>5) & 0x1FF; /* distance along line from end of line to tip */ - x2 = (end>>14) & 0x1FF; /* distance along line from barb to tip */ - x3 = (end>>23) & 0x1FF; /* distance perpendicular from edge of line to barb */ - } - - /* comments follow track of right-facing arrowhead */ - pp->x = tip.x+((2*radius+1)*sin/2-x1*cos); /* upper side of shaft */ - pp->y = tip.y-((2*radius+1)*cos/2+x1*sin); - pp++; - pp->x = tip.x+((2*radius+2*x3+1)*sin/2-x2*cos); /* upper barb */ - pp->y = tip.y-((2*radius+2*x3+1)*cos/2+x2*sin); - pp++; - pp->x = tip.x; - pp->y = tip.y; - pp++; - pp->x = tip.x+(-(2*radius+2*x3+1)*sin/2-x2*cos); /* lower barb */ - pp->y = tip.y-(-(2*radius+2*x3+1)*cos/2+x2*sin); - pp++; - pp->x = tip.x+(-(2*radius+1)*sin/2-x1*cos); /* lower side of shaft */ - pp->y = tip.y+((2*radius+1)*cos/2-x1*sin); -} - -void -_memimageline(Memimage *dst, Point p0, Point p1, int end0, int end1, int radius, Memimage *src, Point sp, Rectangle clipr, int op) -{ - /* - * BUG: We should really really pick off purely horizontal and purely - * vertical lines and handle them separately with calls to memimagedraw - * on rectangles. - */ - - int hor; - int sin, cos, dx, dy, t; - Rectangle oclipr, r; - Point q, pts[10], *pp, d; - - if(radius < 0) - return; - if(rectclip(&clipr, dst->r) == 0) - return; - if(rectclip(&clipr, dst->clipr) == 0) - return; - d = subpt(sp, p0); - if(rectclip(&clipr, rectsubpt(src->clipr, d)) == 0) - return; - if((src->flags&Frepl)==0 && rectclip(&clipr, rectsubpt(src->r, d))==0) - return; - /* this means that only verline() handles degenerate lines (p0==p1) */ - hor = (abs(p1.x-p0.x) > abs(p1.y-p0.y)); - /* - * Clipping is a little peculiar. We can't use Sutherland-Cohen - * clipping because lines are wide. But this is probably just fine: - * we do all math with the original p0 and p1, but clip when deciding - * what pixels to draw. This means the layer code can call this routine, - * using clipr to define the region being written, and get the same set - * of pixels regardless of the dicing. - */ - if((hor && p0.x>p1.x) || (!hor && p0.y>p1.y)){ - q = p0; - p0 = p1; - p1 = q; - t = end0; - end0 = end1; - end1 = t; - } - - if((p0.x == p1.x || p0.y == p1.y) && (end0&0x1F) == Endsquare && (end1&0x1F) == Endsquare){ - r.min = p0; - r.max = p1; - if(p0.x == p1.x){ - r.min.x -= radius; - r.max.x += radius+1; - } - else{ - r.min.y -= radius; - r.max.y += radius+1; - } - oclipr = dst->clipr; - dst->clipr = clipr; - memimagedraw(dst, r, src, sp, memopaque, sp, op); - dst->clipr = oclipr; - return; - } - -/* Hard: */ - /* draw thick line using polygon fill */ - icossin2(p1.x-p0.x, p1.y-p0.y, &cos, &sin); - dx = (sin*(2*radius+1))/2; - dy = (cos*(2*radius+1))/2; - pp = pts; - oclipr = dst->clipr; - dst->clipr = clipr; - q.x = ICOSSCALE*p0.x+ICOSSCALE/2-cos/2; - q.y = ICOSSCALE*p0.y+ICOSSCALE/2-sin/2; - switch(end0 & 0x1F){ - case Enddisc: - discend(p0, radius, dst, src, d, op); - /* fall through */ - case Endsquare: - default: - pp->x = q.x-dx; - pp->y = q.y+dy; - pp++; - pp->x = q.x+dx; - pp->y = q.y-dy; - pp++; - break; - case Endarrow: - arrowend(q, pp, end0, -sin, -cos, radius); - _memfillpolysc(dst, pts, 5, ~0, src, addpt(pts[0], mulpt(d, ICOSSCALE)), 1, 10, 1, op); - pp[1] = pp[4]; - pp += 2; - } - q.x = ICOSSCALE*p1.x+ICOSSCALE/2+cos/2; - q.y = ICOSSCALE*p1.y+ICOSSCALE/2+sin/2; - switch(end1 & 0x1F){ - case Enddisc: - discend(p1, radius, dst, src, d, op); - /* fall through */ - case Endsquare: - default: - pp->x = q.x+dx; - pp->y = q.y-dy; - pp++; - pp->x = q.x-dx; - pp->y = q.y+dy; - pp++; - break; - case Endarrow: - arrowend(q, pp, end1, sin, cos, radius); - _memfillpolysc(dst, pp, 5, ~0, src, addpt(pts[0], mulpt(d, ICOSSCALE)), 1, 10, 1, op); - pp[1] = pp[4]; - pp += 2; - } - _memfillpolysc(dst, pts, pp-pts, ~0, src, addpt(pts[0], mulpt(d, ICOSSCALE)), 0, 10, 1, op); - dst->clipr = oclipr; - return; -} - -void -memimageline(Memimage *dst, Point p0, Point p1, int end0, int end1, int radius, Memimage *src, Point sp, int op) -{ - _memimageline(dst, p0, p1, end0, end1, radius, src, sp, dst->clipr, op); -} - -/* - * Simple-minded conservative code to compute bounding box of line. - * Result is probably a little larger than it needs to be. - */ -static -void -addbbox(Rectangle *r, Point p) -{ - if(r->min.x > p.x) - r->min.x = p.x; - if(r->min.y > p.y) - r->min.y = p.y; - if(r->max.x < p.x+1) - r->max.x = p.x+1; - if(r->max.y < p.y+1) - r->max.y = p.y+1; -} - -int -memlineendsize(int end) -{ - int x3; - - if((end&0x3F) != Endarrow) - return 0; - if(end == Endarrow) - x3 = Arrow3; - else - x3 = (end>>23) & 0x1FF; - return x3; -} - -Rectangle -memlinebbox(Point p0, Point p1, int end0, int end1, int radius) -{ - Rectangle r, r1; - int extra; - - r.min.x = 10000000; - r.min.y = 10000000; - r.max.x = -10000000; - r.max.y = -10000000; - extra = lmax(memlineendsize(end0), memlineendsize(end1)); - r1 = insetrect(canonrect(Rpt(p0, p1)), -(radius+extra)); - addbbox(&r, r1.min); - addbbox(&r, r1.max); - return r; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/load.c b/sys/src/cmd/unix/drawterm/libmemdraw/load.c deleted file mode 100644 index 4d724d36e..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/load.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -_loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - int y, l, lpart, rpart, mx, m, mr; - uchar *q; - - if(!rectinrect(r, i->r)) - return -1; - l = bytesperline(r, i->depth); - if(ndata < l*Dy(r)) - return -1; - ndata = l*Dy(r); - q = byteaddr(i, r.min); - mx = 7/i->depth; - lpart = (r.min.x & mx) * i->depth; - rpart = (r.max.x & mx) * i->depth; - m = 0xFF >> lpart; - /* may need to do bit insertion on edges */ - if(l == 1){ /* all in one byte */ - if(rpart) - m ^= 0xFF >> rpart; - for(y=r.min.y; y<r.max.y; y++){ - *q ^= (*data^*q) & m; - q += i->width*sizeof(ulong); - data++; - } - return ndata; - } - if(lpart==0 && rpart==0){ /* easy case */ - for(y=r.min.y; y<r.max.y; y++){ - memmove(q, data, l); - q += i->width*sizeof(ulong); - data += l; - } - return ndata; - } - mr = 0xFF ^ (0xFF >> rpart); - if(lpart!=0 && rpart==0){ - for(y=r.min.y; y<r.max.y; y++){ - *q ^= (*data^*q) & m; - if(l > 1) - memmove(q+1, data+1, l-1); - q += i->width*sizeof(ulong); - data += l; - } - return ndata; - } - if(lpart==0 && rpart!=0){ - for(y=r.min.y; y<r.max.y; y++){ - if(l > 1) - memmove(q, data, l-1); - q[l-1] ^= (data[l-1]^q[l-1]) & mr; - q += i->width*sizeof(ulong); - data += l; - } - return ndata; - } - for(y=r.min.y; y<r.max.y; y++){ - *q ^= (*data^*q) & m; - if(l > 2) - memmove(q+1, data+1, l-2); - q[l-1] ^= (data[l-1]^q[l-1]) & mr; - q += i->width*sizeof(ulong); - data += l; - } - return ndata; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/mkcmap.c b/sys/src/cmd/unix/drawterm/libmemdraw/mkcmap.c deleted file mode 100644 index e8d5efc39..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/mkcmap.c +++ /dev/null @@ -1,79 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -/* -struct Memcmap -{ - uchar cmap2rgb[3*256]; - uchar rgb2cmap[16*16*16]; -}; -*/ - -static Memcmap* -mkcmap(void) -{ - static Memcmap def; - - int i, rgb, r, g, b; - - for(i=0; i<256; i++){ - rgb = cmap2rgb(i); - r = (rgb>>16)&0xff; - g = (rgb>>8)&0xff; - b = rgb&0xff; - def.cmap2rgb[3*i] = r; - def.cmap2rgb[3*i+1] = g; - def.cmap2rgb[3*i+2] = b; - } - - for(r=0; r<16; r++) - for(g=0; g<16; g++) - for(b=0; b<16; b++) - def.rgb2cmap[r*16*16+g*16+b] = rgb2cmap(r*0x11, g*0x11, b*0x11); - return &def; -} - -void -main(int argc, char **argv) -{ - Memcmap *c; - int i, j, inferno; - - inferno = 0; - ARGBEGIN{ - case 'i': - inferno = 1; - }ARGEND - - memimageinit(); - c = mkcmap(); - if(!inferno) - print("#include <u.h>\n#include <libc.h>\n"); - else - print("#include \"lib9.h\"\n"); - print("#include <draw.h>\n"); - print("#include <memdraw.h>\n\n"); - print("static Memcmap def = {\n"); - print("/* cmap2rgb */ {\n"); - for(i=0; i<sizeof(c->cmap2rgb); ){ - print("\t"); - for(j=0; j<16; j++, i++) - print("0x%2.2ux,", c->cmap2rgb[i]); - print("\n"); - } - print("},\n"); - print("/* rgb2cmap */ {\n"); - for(i=0; i<sizeof(c->rgb2cmap);){ - print("\t"); - for(j=0; j<16; j++, i++) - print("0x%2.2ux,", c->rgb2cmap[i]); - print("\n"); - } - print("}\n"); - print("};\n"); - print("Memcmap *memdefcmap = &def;\n"); - print("void _memmkcmap(void){}\n"); - exits(0); -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/openmemsubfont.c b/sys/src/cmd/unix/drawterm/libmemdraw/openmemsubfont.c deleted file mode 100644 index c8d926e4a..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/openmemsubfont.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -Memsubfont* -openmemsubfont(char *name) -{ - Memsubfont *sf; - Memimage *i; - Fontchar *fc; - int fd, n; - char hdr[3*12+4+1]; - uchar *p; - - fd = open(name, OREAD); - if(fd < 0) - return nil; - p = nil; - i = readmemimage(fd); - if(i == nil) - goto Err; - if(read(fd, hdr, 3*12) != 3*12){ - werrstr("openmemsubfont: header read error: %r"); - goto Err; - } - n = atoi(hdr); - p = malloc(6*(n+1)); - if(p == nil) - goto Err; - if(read(fd, p, 6*(n+1)) != 6*(n+1)){ - werrstr("openmemsubfont: fontchar read error: %r"); - goto Err; - } - fc = malloc(sizeof(Fontchar)*(n+1)); - if(fc == nil) - goto Err; - _unpackinfo(fc, p, n); - sf = allocmemsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i); - if(sf == nil){ - free(fc); - goto Err; - } - free(p); - return sf; -Err: - close(fd); - if (i != nil) - freememimage(i); - if (p != nil) - free(p); - return nil; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/poly.c b/sys/src/cmd/unix/drawterm/libmemdraw/poly.c deleted file mode 100644 index 572f1544c..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/poly.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -void -mempoly(Memimage *dst, Point *vert, int nvert, int end0, int end1, int radius, Memimage *src, Point sp, int op) -{ - int i, e0, e1; - Point d; - - if(nvert < 2) - return; - d = subpt(sp, vert[0]); - for(i=1; i<nvert; i++){ - e0 = e1 = Enddisc; - if(i == 1) - e0 = end0; - if(i == nvert-1) - e1 = end1; - memline(dst, vert[i-1], vert[i], e0, e1, radius, src, addpt(d, vert[i-1]), op); - } -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/read.c b/sys/src/cmd/unix/drawterm/libmemdraw/read.c deleted file mode 100644 index 12be6530b..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/read.c +++ /dev/null @@ -1,111 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -Memimage* -readmemimage(int fd) -{ - char hdr[5*12+1]; - int dy; - ulong chan; - uint l, n; - int m, j; - int new, miny, maxy; - Rectangle r; - uchar *tmp; - int ldepth, chunk; - Memimage *i; - - if(readn(fd, hdr, 11) != 11){ - werrstr("readimage: short header"); - return nil; - } - if(memcmp(hdr, "compressed\n", 11) == 0) - return creadmemimage(fd); - if(readn(fd, hdr+11, 5*12-11) != 5*12-11){ - werrstr("readimage: short header (2)"); - return nil; - } - - /* - * distinguish new channel descriptor from old ldepth. - * channel descriptors have letters as well as numbers, - * while ldepths are a single digit formatted as %-11d. - */ - new = 0; - for(m=0; m<10; m++){ - if(hdr[m] != ' '){ - new = 1; - break; - } - } - if(hdr[11] != ' '){ - werrstr("readimage: bad format"); - return nil; - } - if(new){ - hdr[11] = '\0'; - if((chan = strtochan(hdr)) == 0){ - werrstr("readimage: bad channel string %s", hdr); - return nil; - } - }else{ - ldepth = ((int)hdr[10])-'0'; - if(ldepth<0 || ldepth>3){ - werrstr("readimage: bad ldepth %d", ldepth); - return nil; - } - chan = drawld2chan[ldepth]; - } - - r.min.x = atoi(hdr+1*12); - r.min.y = atoi(hdr+2*12); - r.max.x = atoi(hdr+3*12); - r.max.y = atoi(hdr+4*12); - if(r.min.x>r.max.x || r.min.y>r.max.y){ - werrstr("readimage: bad rectangle"); - return nil; - } - - miny = r.min.y; - maxy = r.max.y; - - l = bytesperline(r, chantodepth(chan)); - i = allocmemimage(r, chan); - if(i == nil) - return nil; - chunk = 32*1024; - if(chunk < l) - chunk = l; - tmp = malloc(chunk); - if(tmp == nil) - goto Err; - while(maxy > miny){ - dy = maxy - miny; - if(dy*l > chunk) - dy = chunk/l; - if(dy <= 0){ - werrstr("readmemimage: image too wide for buffer"); - goto Err; - } - n = dy*l; - m = readn(fd, tmp, n); - if(m != n){ - werrstr("readmemimage: read count %d not %d: %r", m, n); - Err: - freememimage(i); - free(tmp); - return nil; - } - if(!new) /* an old image: must flip all the bits */ - for(j=0; j<chunk; j++) - tmp[j] ^= 0xFF; - - if(loadmemimage(i, Rect(r.min.x, miny, r.max.x, miny+dy), tmp, chunk) <= 0) - goto Err; - miny += dy; - } - free(tmp); - return i; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/string.c b/sys/src/cmd/unix/drawterm/libmemdraw/string.c deleted file mode 100644 index d42ec60e5..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/string.c +++ /dev/null @@ -1,68 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -Point -memimagestring(Memimage *b, Point p, Memimage *color, Point cp, Memsubfont *f, char *cs) -{ - int w, width; - uchar *s; - Rune c; - Fontchar *i; - - s = (uchar*)cs; - for(; (c=*s); p.x+=width, cp.x+=width){ - width = 0; - if(c < Runeself) - s++; - else{ - w = chartorune(&c, (char*)s); - if(w == 0){ - s++; - continue; - } - s += w; - } - if(c >= f->n) - continue; -// i = f->info+c; - i = &(f->info[c]); - width = i->width; - memdraw(b, Rect(p.x+i->left, p.y+i->top, p.x+i->left+(i[1].x-i[0].x), p.y+i->bottom), - color, cp, f->bits, Pt(i->x, i->top), SoverD); - } - return p; -} - -Point -memsubfontwidth(Memsubfont *f, char *cs) -{ - Rune c; - Point p; - uchar *s; - Fontchar *i; - int w, width; - - p = Pt(0, f->height); - s = (uchar*)cs; - for(; (c=*s); p.x+=width){ - width = 0; - if(c < Runeself) - s++; - else{ - w = chartorune(&c, (char*)s); - if(w == 0){ - s++; - continue; - } - s += w; - } - if(c >= f->n) - continue; - i = f->info+c; - width = i->width; - } - return p; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/subfont.c b/sys/src/cmd/unix/drawterm/libmemdraw/subfont.c deleted file mode 100644 index e2bdee5c0..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/subfont.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -Memsubfont* -allocmemsubfont(char *name, int n, int height, int ascent, Fontchar *info, Memimage *i) -{ - Memsubfont *f; - - f = malloc(sizeof(Memsubfont)); - if(f == 0) - return 0; - f->n = n; - f->height = height; - f->ascent = ascent; - f->info = info; - f->bits = i; - if(name) - f->name = strdup(name); - else - f->name = 0; - return f; -} - -void -freememsubfont(Memsubfont *f) -{ - if(f == 0) - return; - free(f->info); /* note: f->info must have been malloc'ed! */ - freememimage(f->bits); - free(f); -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/times b/sys/src/cmd/unix/drawterm/libmemdraw/times deleted file mode 100644 index 41beff4d9..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/times +++ /dev/null @@ -1,19 +0,0 @@ -draw1: 6M for draw 0,0,100,100 no repl -draw3: 4M for draw 0,0,100,100 no repl -just read src, dst - 250k -mask reading - 650k -write dst - 100k -alpha calculation - 3000k - -olddraw: 10M for draw 0, 0, 1000, 1000 no repl all ldepth 3 - 44M for draw 0, 0, 1000, 1000 src, mask ldepth 2 dst ldepth 3 -draw4: 160M for draw 0, 0, 1000, 1000 no repl all r8g8b8 - null loop: 10k - src, dst reading: 13-15M each - mask reading: 30M - alpha calculation loop: 90M - null alpha loop: 2M - minimal loop control +20M - alpha calculation with divides +190M - alpha calculation wtih shifts +70M - writeback: 11M diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/unload.c b/sys/src/cmd/unix/drawterm/libmemdraw/unload.c deleted file mode 100644 index b3f25c93a..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/unload.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -int -unloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata) -{ - int y, l; - uchar *q; - - if(!rectinrect(r, i->r)) - return -1; - l = bytesperline(r, i->depth); - if(ndata < l*Dy(r)) - return -1; - ndata = l*Dy(r); - q = byteaddr(i, r.min); - for(y=r.min.y; y<r.max.y; y++){ - memmove(data, q, l); - q += i->width*sizeof(ulong); - data += l; - } - return ndata; -} diff --git a/sys/src/cmd/unix/drawterm/libmemdraw/write.c b/sys/src/cmd/unix/drawterm/libmemdraw/write.c deleted file mode 100644 index a8816ed04..000000000 --- a/sys/src/cmd/unix/drawterm/libmemdraw/write.c +++ /dev/null @@ -1,183 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> - -#define CHUNK 8000 - -#define HSHIFT 3 /* HSHIFT==5 runs slightly faster, but hash table is 64x bigger */ -#define NHASH (1<<(HSHIFT*NMATCH)) -#define HMASK (NHASH-1) -#define hupdate(h, c) ((((h)<<HSHIFT)^(c))&HMASK) -typedef struct Hlist Hlist; -struct Hlist{ - uchar *s; - Hlist *next, *prev; -}; - -int -writememimage(int fd, Memimage *i) -{ - uchar *outbuf, *outp, *eout; /* encoded data, pointer, end */ - uchar *loutp; /* start of encoded line */ - Hlist *hash; /* heads of hash chains of past strings */ - Hlist *chain, *hp; /* hash chain members, pointer */ - Hlist *cp; /* next Hlist to fall out of window */ - int h; /* hash value */ - uchar *line, *eline; /* input line, end pointer */ - uchar *data, *edata; /* input buffer, end pointer */ - ulong n; /* length of input buffer */ - ulong nb; /* # of bytes returned by unloadimage */ - int bpl; /* input line length */ - int offs, runlen; /* offset, length of consumed data */ - uchar dumpbuf[NDUMP]; /* dump accumulator */ - int ndump; /* length of dump accumulator */ - int miny, dy; /* y values while unloading input */ - int ncblock; /* size of compressed blocks */ - Rectangle r; - uchar *p, *q, *s, *es, *t; - char hdr[11+5*12+1]; - char cbuf[20]; - - r = i->r; - bpl = bytesperline(r, i->depth); - n = Dy(r)*bpl; - data = malloc(n); - ncblock = _compblocksize(r, i->depth); - outbuf = malloc(ncblock); - hash = malloc(NHASH*sizeof(Hlist)); - chain = malloc(NMEM*sizeof(Hlist)); - if(data == 0 || outbuf == 0 || hash == 0 || chain == 0){ - ErrOut: - free(data); - free(outbuf); - free(hash); - free(chain); - return -1; - } - for(miny = r.min.y; miny != r.max.y; miny += dy){ - dy = r.max.y-miny; - if(dy*bpl > CHUNK) - dy = CHUNK/bpl; - nb = unloadmemimage(i, Rect(r.min.x, miny, r.max.x, miny+dy), - data+(miny-r.min.y)*bpl, dy*bpl); - if(nb != dy*bpl) - goto ErrOut; - } - sprint(hdr, "compressed\n%11s %11d %11d %11d %11d ", - chantostr(cbuf, i->chan), r.min.x, r.min.y, r.max.x, r.max.y); - if(write(fd, hdr, 11+5*12) != 11+5*12) - goto ErrOut; - edata = data+n; - eout = outbuf+ncblock; - line = data; - r.max.y = r.min.y; - while(line != edata){ - memset(hash, 0, NHASH*sizeof(Hlist)); - memset(chain, 0, NMEM*sizeof(Hlist)); - cp = chain; - h = 0; - outp = outbuf; - for(n = 0; n != NMATCH; n++) - h = hupdate(h, line[n]); - loutp = outbuf; - while(line != edata){ - ndump = 0; - eline = line+bpl; - for(p = line; p != eline; ){ - if(eline-p < NRUN) - es = eline; - else - es = p+NRUN; - q = 0; - runlen = 0; - for(hp = hash[h].next; hp; hp = hp->next){ - s = p + runlen; - if(s >= es) - continue; - t = hp->s + runlen; - for(; s >= p; s--) - if(*s != *t--) - goto matchloop; - t += runlen+2; - s += runlen+2; - for(; s < es; s++) - if(*s != *t++) - break; - n = s-p; - if(n > runlen){ - runlen = n; - q = hp->s; - if(n == NRUN) - break; - } - matchloop: ; - } - if(runlen < NMATCH){ - if(ndump == NDUMP){ - if(eout-outp < ndump+1) - goto Bfull; - *outp++ = ndump-1+128; - memmove(outp, dumpbuf, ndump); - outp += ndump; - ndump = 0; - } - dumpbuf[ndump++] = *p; - runlen = 1; - } - else{ - if(ndump != 0){ - if(eout-outp < ndump+1) - goto Bfull; - *outp++ = ndump-1+128; - memmove(outp, dumpbuf, ndump); - outp += ndump; - ndump = 0; - } - offs = p-q-1; - if(eout-outp < 2) - goto Bfull; - *outp++ = ((runlen-NMATCH)<<2) + (offs>>8); - *outp++ = offs&255; - } - for(q = p+runlen; p != q; p++){ - if(cp->prev) - cp->prev->next = 0; - cp->next = hash[h].next; - cp->prev = &hash[h]; - if(cp->next) - cp->next->prev = cp; - cp->prev->next = cp; - cp->s = p; - if(++cp == &chain[NMEM]) - cp = chain; - if(edata-p > NMATCH) - h = hupdate(h, p[NMATCH]); - } - } - if(ndump != 0){ - if(eout-outp < ndump+1) - goto Bfull; - *outp++ = ndump-1+128; - memmove(outp, dumpbuf, ndump); - outp += ndump; - } - line = eline; - loutp = outp; - r.max.y++; - } - Bfull: - if(loutp == outbuf) - goto ErrOut; - n = loutp-outbuf; - sprint(hdr, "%11d %11ld ", r.max.y, n); - write(fd, hdr, 2*12); - write(fd, outbuf, n); - r.min.y = r.max.y; - } - free(data); - free(outbuf); - free(hash); - free(chain); - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/Makefile b/sys/src/cmd/unix/drawterm/libmemlayer/Makefile deleted file mode 100644 index ceccbddae..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libmemlayer.a - -OFILES=\ - draw.$O\ - lalloc.$O\ - layerop.$O\ - ldelete.$O\ - lhide.$O\ - line.$O\ - load.$O\ - lorigin.$O\ - lsetrefresh.$O\ - ltofront.$O\ - ltorear.$O\ - unload.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/draw.c b/sys/src/cmd/unix/drawterm/libmemlayer/draw.c deleted file mode 100644 index c352a0b2c..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/draw.c +++ /dev/null @@ -1,192 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -struct Draw -{ - Point deltas; - Point deltam; - Memlayer *dstlayer; - Memimage *src; - Memimage *mask; - int op; -}; - -static -void -ldrawop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave) -{ - struct Draw *d; - Point p0, p1; - Rectangle oclipr, srcr, r, mr; - int ok; - - d = etc; - if(insave && d->dstlayer->save==nil) - return; - - p0 = addpt(screenr.min, d->deltas); - p1 = addpt(screenr.min, d->deltam); - - if(insave){ - r = rectsubpt(screenr, d->dstlayer->delta); - clipr = rectsubpt(clipr, d->dstlayer->delta); - }else - r = screenr; - - /* now in logical coordinates */ - - /* clipr may have narrowed what we should draw on, so clip if necessary */ - if(!rectinrect(r, clipr)){ - oclipr = dst->clipr; - dst->clipr = clipr; - ok = drawclip(dst, &r, d->src, &p0, d->mask, &p1, &srcr, &mr); - dst->clipr = oclipr; - if(!ok) - return; - } - memdraw(dst, r, d->src, p0, d->mask, p1, d->op); -} - -void -memdraw(Memimage *dst, Rectangle r, Memimage *src, Point p0, Memimage *mask, Point p1, int op) -{ - struct Draw d; - Rectangle srcr, tr, mr; - Memlayer *dl, *sl; - - if(drawdebug) - iprint("memdraw %p %R %p %P %p %P\n", dst, r, src, p0, mask, p1); - - if(mask == nil) - mask = memopaque; - - if(mask->layer){ -if(drawdebug) iprint("mask->layer != nil\n"); - return; /* too hard, at least for now */ - } - - Top: - if(dst->layer==nil && src->layer==nil){ - memimagedraw(dst, r, src, p0, mask, p1, op); - return; - } - - if(drawclip(dst, &r, src, &p0, mask, &p1, &srcr, &mr) == 0){ -if(drawdebug) iprint("drawclip dstcr %R srccr %R maskcr %R\n", dst->clipr, src->clipr, mask->clipr); - return; - } - - /* - * Convert to screen coordinates. - */ - dl = dst->layer; - if(dl != nil){ - r.min.x += dl->delta.x; - r.min.y += dl->delta.y; - r.max.x += dl->delta.x; - r.max.y += dl->delta.y; - } - Clearlayer: - if(dl!=nil && dl->clear){ - if(src == dst){ - p0.x += dl->delta.x; - p0.y += dl->delta.y; - src = dl->screen->image; - } - dst = dl->screen->image; - goto Top; - } - - sl = src->layer; - if(sl != nil){ - p0.x += sl->delta.x; - p0.y += sl->delta.y; - srcr.min.x += sl->delta.x; - srcr.min.y += sl->delta.y; - srcr.max.x += sl->delta.x; - srcr.max.y += sl->delta.y; - } - - /* - * Now everything is in screen coordinates. - * mask is an image. dst and src are images or obscured layers. - */ - - /* - * if dst and src are the same layer, just draw in save area and expose. - */ - if(dl!=nil && dst==src){ - if(dl->save == nil) - return; /* refresh function makes this case unworkable */ - if(rectXrect(r, srcr)){ - tr = r; - if(srcr.min.x < tr.min.x){ - p1.x += tr.min.x - srcr.min.x; - tr.min.x = srcr.min.x; - } - if(srcr.min.y < tr.min.y){ - p1.y += tr.min.x - srcr.min.x; - tr.min.y = srcr.min.y; - } - if(srcr.max.x > tr.max.x) - tr.max.x = srcr.max.x; - if(srcr.max.y > tr.max.y) - tr.max.y = srcr.max.y; - memlhide(dst, tr); - }else{ - memlhide(dst, r); - memlhide(dst, srcr); - } - memdraw(dl->save, rectsubpt(r, dl->delta), dl->save, - subpt(srcr.min, src->layer->delta), mask, p1, op); - memlexpose(dst, r); - return; - } - - if(sl){ - if(sl->clear){ - src = sl->screen->image; - if(dl != nil){ - r.min.x -= dl->delta.x; - r.min.y -= dl->delta.y; - r.max.x -= dl->delta.x; - r.max.y -= dl->delta.y; - } - goto Top; - } - /* relatively rare case; use save area */ - if(sl->save == nil) - return; /* refresh function makes this case unworkable */ - memlhide(src, srcr); - /* convert back to logical coordinates */ - p0.x -= sl->delta.x; - p0.y -= sl->delta.y; - srcr.min.x -= sl->delta.x; - srcr.min.y -= sl->delta.y; - srcr.max.x -= sl->delta.x; - srcr.max.y -= sl->delta.y; - src = src->layer->save; - } - - /* - * src is now an image. dst may be an image or a clear layer - */ - if(dst->layer==nil) - goto Top; - if(dst->layer->clear) - goto Clearlayer; - - /* - * dst is an obscured layer - */ - d.deltas = subpt(p0, r.min); - d.deltam = subpt(p1, r.min); - d.dstlayer = dl; - d.src = src; - d.op = op; - d.mask = mask; - _memlayerop(ldrawop, dst, r, r, &d); -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/lalloc.c b/sys/src/cmd/unix/drawterm/libmemlayer/lalloc.c deleted file mode 100644 index 8f2e966eb..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/lalloc.c +++ /dev/null @@ -1,79 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -Memimage* -memlalloc(Memscreen *s, Rectangle screenr, Refreshfn refreshfn, void *refreshptr, ulong val) -{ - Memlayer *l; - Memimage *n; - static Memimage *paint; - - if(paint == nil){ - paint = allocmemimage(Rect(0,0,1,1), RGBA32); - if(paint == nil) - return nil; - paint->flags |= Frepl; - paint->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF); - } - - n = allocmemimaged(screenr, s->image->chan, s->image->data, s->image->X); - if(n == nil) - return nil; - l = malloc(sizeof(Memlayer)); - if(l == nil){ - free(n); - return nil; - } - - l->screen = s; - if(refreshfn) - l->save = nil; - else{ - l->save = allocmemimage(screenr, s->image->chan); - if(l->save == nil){ - free(l); - free(n); - return nil; - } - /* allocmemimage doesn't initialize memory; this paints save area */ - if(val != DNofill) - memfillcolor(l->save, val); - } - l->refreshfn = refreshfn; - l->refreshptr = nil; /* don't set it until we're done */ - l->screenr = screenr; - l->delta = Pt(0,0); - - n->data->ref++; - n->zero = s->image->zero; - n->width = s->image->width; - n->layer = l; - - /* start with new window behind all existing ones */ - l->front = s->rearmost; - l->rear = nil; - if(s->rearmost) - s->rearmost->layer->rear = n; - s->rearmost = n; - if(s->frontmost == nil) - s->frontmost = n; - l->clear = 0; - - /* now pull new window to front */ - _memltofrontfill(n, val != DNofill); - l->refreshptr = refreshptr; - - /* - * paint with requested color; previously exposed areas are already right - * if this window has backing store, but just painting the whole thing is simplest. - */ - if(val != DNofill){ - memsetchan(paint, n->chan); - memfillcolor(paint, val); - memdraw(n, n->r, paint, n->r.min, nil, n->r.min, S); - } - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/layerop.c b/sys/src/cmd/unix/drawterm/libmemlayer/layerop.c deleted file mode 100644 index 27fdcfc56..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/layerop.c +++ /dev/null @@ -1,112 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -#define RECUR(a,b,c,d) _layerop(fn, i, Rect(a.x, b.y, c.x, d.y), clipr, etc, front->layer->rear); - -static void -_layerop( - void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), - Memimage *i, - Rectangle r, - Rectangle clipr, - void *etc, - Memimage *front) -{ - Rectangle fr; - - Top: - if(front == i){ - /* no one is in front of this part of window; use the screen */ - fn(i->layer->screen->image, r, clipr, etc, 0); - return; - } - fr = front->layer->screenr; - if(rectXrect(r, fr) == 0){ - /* r doesn't touch this window; continue on next rearmost */ - // assert(front && front->layer && front->layer->screen && front->layer->rear); - front = front->layer->rear; - goto Top; - } - if(fr.max.y < r.max.y){ - RECUR(r.min, fr.max, r.max, r.max); - r.max.y = fr.max.y; - } - if(r.min.y < fr.min.y){ - RECUR(r.min, r.min, r.max, fr.min); - r.min.y = fr.min.y; - } - if(fr.max.x < r.max.x){ - RECUR(fr.max, r.min, r.max, r.max); - r.max.x = fr.max.x; - } - if(r.min.x < fr.min.x){ - RECUR(r.min, r.min, fr.min, r.max); - r.min.x = fr.min.x; - } - /* r is covered by front, so put in save area */ - (*fn)(i->layer->save, r, clipr, etc, 1); -} - -/* - * Assumes incoming rectangle has already been clipped to i's logical r and clipr - */ -void -_memlayerop( - void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), - Memimage *i, - Rectangle screenr, /* clipped to window boundaries */ - Rectangle clipr, /* clipped also to clipping rectangles of hierarchy */ - void *etc) -{ - Memlayer *l; - Rectangle r, scr; - - l = i->layer; - if(!rectclip(&screenr, l->screenr)) - return; - if(l->clear){ - fn(l->screen->image, screenr, clipr, etc, 0); - return; - } - r = screenr; - scr = l->screen->image->clipr; - - /* - * Do the piece on the screen - */ - if(rectclip(&screenr, scr)) - _layerop(fn, i, screenr, clipr, etc, l->screen->frontmost); - if(rectinrect(r, scr)) - return; - - /* - * Do the piece off the screen - */ - if(!rectXrect(r, scr)){ - /* completely offscreen; easy */ - fn(l->save, r, clipr, etc, 1); - return; - } - if(r.min.y < scr.min.y){ - /* above screen */ - fn(l->save, Rect(r.min.x, r.min.y, r.max.x, scr.min.y), clipr, etc, 1); - r.min.y = scr.min.y; - } - if(r.max.y > scr.max.y){ - /* below screen */ - fn(l->save, Rect(r.min.x, scr.max.y, r.max.x, r.max.y), clipr, etc, 1); - r.max.y = scr.max.y; - } - if(r.min.x < scr.min.x){ - /* left of screen */ - fn(l->save, Rect(r.min.x, r.min.y, scr.min.x, r.max.y), clipr, etc, 1); - r.min.x = scr.min.x; - } - if(r.max.x > scr.max.x){ - /* right of screen */ - fn(l->save, Rect(scr.max.x, r.min.y, r.max.x, r.max.y), clipr, etc, 1); - } -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/ldelete.c b/sys/src/cmd/unix/drawterm/libmemlayer/ldelete.c deleted file mode 100644 index 34cd6eadb..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/ldelete.c +++ /dev/null @@ -1,67 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -void -memldelete(Memimage *i) -{ - Memscreen *s; - Memlayer *l; - - l = i->layer; - /* free backing store and disconnect refresh, to make pushback fast */ - freememimage(l->save); - l->save = nil; - l->refreshptr = nil; - memltorear(i); - - /* window is now the rearmost; clean up screen structures and deallocate */ - s = i->layer->screen; - if(s->fill){ - i->clipr = i->r; - memdraw(i, i->r, s->fill, i->r.min, nil, i->r.min, S); - } - if(l->front){ - l->front->layer->rear = nil; - s->rearmost = l->front; - }else{ - s->frontmost = nil; - s->rearmost = nil; - } - free(l); - freememimage(i); -} - -/* - * Just free the data structures, don't do graphics - */ -void -memlfree(Memimage *i) -{ - Memlayer *l; - - l = i->layer; - freememimage(l->save); - free(l); - freememimage(i); -} - -void -_memlsetclear(Memscreen *s) -{ - Memimage *i, *j; - Memlayer *l; - - for(i=s->rearmost; i; i=i->layer->front){ - l = i->layer; - l->clear = rectinrect(l->screenr, l->screen->image->clipr); - if(l->clear) - for(j=l->front; j; j=j->layer->front) - if(rectXrect(l->screenr, j->layer->screenr)){ - l->clear = 0; - break; - } - } -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/lhide.c b/sys/src/cmd/unix/drawterm/libmemlayer/lhide.c deleted file mode 100644 index d6aaa55fe..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/lhide.c +++ /dev/null @@ -1,67 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -/* - * Hide puts that portion of screenr now on the screen into the window's save area. - * Expose puts that portion of screenr now in the save area onto the screen. - * - * Hide and Expose both require that the layer structures in the screen - * match the geometry they are being asked to update, that is, they update the - * save area (hide) or screen (expose) based on what those structures tell them. - * This means they must be called at the correct time during window shuffles. - */ - -static -void -lhideop(Memimage *src, Rectangle screenr, Rectangle clipr, void *etc, int insave) -{ - Rectangle r; - Memlayer *l; - - USED(clipr.min.x); - USED(insave); - l = etc; - if(src != l->save){ /* do nothing if src is already in save area */ - r = rectsubpt(screenr, l->delta); - memdraw(l->save, r, src, screenr.min, nil, screenr.min, S); - } -} - -void -memlhide(Memimage *i, Rectangle screenr) -{ - if(i->layer->save == nil) - return; - if(rectclip(&screenr, i->layer->screen->image->r) == 0) - return; - _memlayerop(lhideop, i, screenr, screenr, i->layer); -} - -static -void -lexposeop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave) -{ - Memlayer *l; - Rectangle r; - - USED(clipr.min.x); - if(insave) /* if dst is save area, don't bother */ - return; - l = etc; - r = rectsubpt(screenr, l->delta); - if(l->save) - memdraw(dst, screenr, l->save, r.min, nil, r.min, S); - else - l->refreshfn(dst, r, l->refreshptr); -} - -void -memlexpose(Memimage *i, Rectangle screenr) -{ - if(rectclip(&screenr, i->layer->screen->image->r) == 0) - return; - _memlayerop(lexposeop, i, screenr, screenr, i->layer); -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/line.c b/sys/src/cmd/unix/drawterm/libmemlayer/line.c deleted file mode 100644 index 8c09a5359..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/line.c +++ /dev/null @@ -1,122 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -struct Lline -{ - Point p0; - Point p1; - Point delta; - int end0; - int end1; - int radius; - Point sp; - Memlayer *dstlayer; - Memimage *src; - int op; -}; - -static void llineop(Memimage*, Rectangle, Rectangle, void*, int); - -static -void -_memline(Memimage *dst, Point p0, Point p1, int end0, int end1, int radius, Memimage *src, Point sp, Rectangle clipr, int op) -{ - Rectangle r; - struct Lline ll; - Point d; - int srcclipped; - Memlayer *dl; - - if(radius < 0) - return; - if(src->layer) /* can't draw line with layered source */ - return; - srcclipped = 0; - - Top: - dl = dst->layer; - if(dl == nil){ - _memimageline(dst, p0, p1, end0, end1, radius, src, sp, clipr, op); - return; - } - if(!srcclipped){ - d = subpt(sp, p0); - if(rectclip(&clipr, rectsubpt(src->clipr, d)) == 0) - return; - if((src->flags&Frepl)==0 && rectclip(&clipr, rectsubpt(src->r, d))==0) - return; - srcclipped = 1; - } - - /* dst is known to be a layer */ - p0.x += dl->delta.x; - p0.y += dl->delta.y; - p1.x += dl->delta.x; - p1.y += dl->delta.y; - clipr.min.x += dl->delta.x; - clipr.min.y += dl->delta.y; - clipr.max.x += dl->delta.x; - clipr.max.y += dl->delta.y; - if(dl->clear){ - dst = dst->layer->screen->image; - goto Top; - } - - /* XXX */ - /* this is not the correct set of tests */ -// if(log2[dst->depth] != log2[src->depth] || log2[dst->depth]!=3) -// return; - - /* can't use sutherland-cohen clipping because lines are wide */ - r = memlinebbox(p0, p1, end0, end1, radius); - /* - * r is now a bounding box for the line; - * use it as a clipping rectangle for subdivision - */ - if(rectclip(&r, clipr) == 0) - return; - ll.p0 = p0; - ll.p1 = p1; - ll.end0 = end0; - ll.end1 = end1; - ll.sp = sp; - ll.dstlayer = dst->layer; - ll.src = src; - ll.radius = radius; - ll.delta = dl->delta; - ll.op = op; - _memlayerop(llineop, dst, r, r, &ll); -} - -static -void -llineop(Memimage *dst, Rectangle screenr, Rectangle clipr, void *etc, int insave) -{ - struct Lline *ll; - Point p0, p1; - - USED(screenr.min.x); - ll = etc; - if(insave && ll->dstlayer->save==nil) - return; - if(!rectclip(&clipr, screenr)) - return; - if(insave){ - p0 = subpt(ll->p0, ll->delta); - p1 = subpt(ll->p1, ll->delta); - clipr = rectsubpt(clipr, ll->delta); - }else{ - p0 = ll->p0; - p1 = ll->p1; - } - _memline(dst, p0, p1, ll->end0, ll->end1, ll->radius, ll->src, ll->sp, clipr, ll->op); -} - -void -memline(Memimage *dst, Point p0, Point p1, int end0, int end1, int radius, Memimage *src, Point sp, int op) -{ - _memline(dst, p0, p1, end0, end1, radius, src, sp, dst->clipr, op); -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/load.c b/sys/src/cmd/unix/drawterm/libmemlayer/load.c deleted file mode 100644 index d211564be..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/load.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -int -memload(Memimage *dst, Rectangle r, uchar *data, int n, int iscompressed) -{ - int (*loadfn)(Memimage*, Rectangle, uchar*, int); - Memimage *tmp; - Memlayer *dl; - Rectangle lr; - int dx; - - loadfn = loadmemimage; - if(iscompressed) - loadfn = cloadmemimage; - - Top: - dl = dst->layer; - if(dl == nil) - return loadfn(dst, r, data, n); - - /* - * Convert to screen coordinates. - */ - lr = r; - r.min.x += dl->delta.x; - r.min.y += dl->delta.y; - r.max.x += dl->delta.x; - r.max.y += dl->delta.y; - dx = dl->delta.x&(7/dst->depth); - if(dl->clear && dx==0){ - dst = dl->screen->image; - goto Top; - } - - /* - * dst is an obscured layer or data is unaligned - */ - if(dl->save && dx==0){ - n = loadfn(dl->save, lr, data, n); - if(n > 0) - memlexpose(dst, r); - return n; - } - tmp = allocmemimage(lr, dst->chan); - if(tmp == nil) - return -1; - n = loadfn(tmp, lr, data, n); - memdraw(dst, lr, tmp, lr.min, nil, lr.min, S); - freememimage(tmp); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/lorigin.c b/sys/src/cmd/unix/drawterm/libmemlayer/lorigin.c deleted file mode 100644 index 0926ee8d2..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/lorigin.c +++ /dev/null @@ -1,107 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -/* - * Place i so i->r.min = log, i->layer->screenr.min == scr. -*/ -int -memlorigin(Memimage *i, Point log, Point scr) -{ - Memlayer *l; - Memscreen *s; - Memimage *t, *shad, *nsave; - Rectangle x, newr, oldr; - Point delta; - int overlap, eqlog, eqscr, wasclear; - - l = i->layer; - s = l->screen; - oldr = l->screenr; - newr = Rect(scr.x, scr.y, scr.x+Dx(oldr), scr.y+Dy(oldr)); - eqscr = eqpt(scr, oldr.min); - eqlog = eqpt(log, i->r.min); - if(eqscr && eqlog) - return 0; - nsave = nil; - if(eqlog==0 && l->save!=nil){ - nsave = allocmemimage(Rect(log.x, log.y, log.x+Dx(oldr), log.y+Dy(oldr)), i->chan); - if(nsave == nil) - return -1; - } - - /* - * Bring it to front and move logical coordinate system. - */ - memltofront(i); - wasclear = l->clear; - if(nsave){ - if(!wasclear) - memimagedraw(nsave, nsave->r, l->save, l->save->r.min, nil, Pt(0,0), S); - freememimage(l->save); - l->save = nsave; - } - delta = subpt(log, i->r.min); - i->r = rectaddpt(i->r, delta); - i->clipr = rectaddpt(i->clipr, delta); - l->delta = subpt(l->screenr.min, i->r.min); - if(eqscr) - return 0; - - /* - * To clean up old position, make a shadow window there, don't paint it, - * push it behind this one, and (later) delete it. Because the refresh function - * for this fake window is a no-op, this will cause no graphics action except - * to restore the background and expose the windows previously hidden. - */ - shad = memlalloc(s, oldr, memlnorefresh, nil, DNofill); - if(shad == nil) - return -1; - s->frontmost = i; - if(s->rearmost == i) - s->rearmost = shad; - else - l->rear->layer->front = shad; - shad->layer->front = i; - shad->layer->rear = l->rear; - l->rear = shad; - l->front = nil; - shad->layer->clear = 0; - - /* - * Shadow is now holding down the fort at the old position. - * Move the window and hide things obscured by new position. - */ - for(t=l->rear->layer->rear; t!=nil; t=t->layer->rear){ - x = newr; - overlap = rectclip(&x, t->layer->screenr); - if(overlap){ - memlhide(t, x); - t->layer->clear = 0; - } - } - l->screenr = newr; - l->delta = subpt(scr, i->r.min); - l->clear = rectinrect(newr, l->screen->image->clipr); - - /* - * Everything's covered. Copy to new position and delete shadow window. - */ - if(wasclear) - memdraw(s->image, newr, s->image, oldr.min, nil, Pt(0,0), S); - else - memlexpose(i, newr); - memldelete(shad); - - return 1; -} - -void -memlnorefresh(Memimage *l, Rectangle r, void *v) -{ - USED(l); - USED(r.min.x); - USED(v); -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/lsetrefresh.c b/sys/src/cmd/unix/drawterm/libmemlayer/lsetrefresh.c deleted file mode 100644 index 526bd668a..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/lsetrefresh.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -int -memlsetrefresh(Memimage *i, Refreshfn fn, void *ptr) -{ - Memlayer *l; - - l = i->layer; - if(l->refreshfn!=0 && fn!=0){ /* just change functions */ - l->refreshfn = fn; - l->refreshptr = ptr; - return 1; - } - - if(l->refreshfn == 0){ /* is using backup image; just free it */ - freememimage(l->save); - l->save = nil; - l->refreshfn = fn; - l->refreshptr = ptr; - return 1; - } - - l->save = allocmemimage(i->r, i->chan); - if(l->save == nil) - return 0; - /* easiest way is just to update the entire save area */ - l->refreshfn(i, i->r, l->refreshptr); - l->refreshfn = 0; - l->refreshptr = nil; - return 1; -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/ltofront.c b/sys/src/cmd/unix/drawterm/libmemlayer/ltofront.c deleted file mode 100644 index 447b40bdf..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/ltofront.c +++ /dev/null @@ -1,80 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -/* - * Pull i towards top of screen, just behind front -*/ -static -void -_memltofront(Memimage *i, Memimage *front, int fill) -{ - Memlayer *l; - Memscreen *s; - Memimage *f, *ff, *rr; - Rectangle x; - int overlap; - - l = i->layer; - s = l->screen; - while(l->front != front){ - f = l->front; - x = l->screenr; - overlap = rectclip(&x, f->layer->screenr); - if(overlap){ - memlhide(f, x); - f->layer->clear = 0; - } - /* swap l and f in screen's list */ - ff = f->layer->front; - rr = l->rear; - if(ff == nil) - s->frontmost = i; - else - ff->layer->rear = i; - if(rr == nil) - s->rearmost = f; - else - rr->layer->front = f; - l->front = ff; - l->rear = f; - f->layer->front = i; - f->layer->rear = rr; - if(overlap && fill) - memlexpose(i, x); - } -} - -void -_memltofrontfill(Memimage *i, int fill) -{ - _memltofront(i, nil, fill); - _memlsetclear(i->layer->screen); -} - -void -memltofront(Memimage *i) -{ - _memltofront(i, nil, 1); - _memlsetclear(i->layer->screen); -} - -void -memltofrontn(Memimage **ip, int n) -{ - Memimage *i, *front; - Memscreen *s; - - if(n == 0) - return; - front = nil; - while(--n >= 0){ - i = *ip++; - _memltofront(i, front, 1); - front = i; - } - s = front->layer->screen; - _memlsetclear(s); -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/ltorear.c b/sys/src/cmd/unix/drawterm/libmemlayer/ltorear.c deleted file mode 100644 index d53e8cc95..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/ltorear.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -void -_memltorear(Memimage *i, Memimage *rear) -{ - Memlayer *l; - Memscreen *s; - Memimage *f, *r, *rr; - Rectangle x; - int overlap; - - l = i->layer; - s = l->screen; - while(l->rear != rear){ - r = l->rear; - x = l->screenr; - overlap = rectclip(&x, r->layer->screenr); - if(overlap){ - memlhide(i, x); - l->clear = 0; - } - /* swap l and r in screen's list */ - rr = r->layer->rear; - f = l->front; - if(rr == nil) - s->rearmost = i; - else - rr->layer->front = i; - if(f == nil) - s->frontmost = r; - else - f->layer->rear = r; - l->rear = rr; - l->front = r; - r->layer->rear = i; - r->layer->front = f; - if(overlap) - memlexpose(r, x); - } -} - -void -memltorear(Memimage *i) -{ - _memltorear(i, nil); - _memlsetclear(i->layer->screen); -} - -void -memltorearn(Memimage **ip, int n) -{ - Memimage *i, *rear; - Memscreen *s; - - if(n == 0) - return; - rear = nil; - while(--n >= 0){ - i = *ip++; - _memltorear(i, rear); - rear = i; - } - s = rear->layer->screen; - _memlsetclear(s); -} diff --git a/sys/src/cmd/unix/drawterm/libmemlayer/unload.c b/sys/src/cmd/unix/drawterm/libmemlayer/unload.c deleted file mode 100644 index b95341177..000000000 --- a/sys/src/cmd/unix/drawterm/libmemlayer/unload.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <draw.h> -#include <memdraw.h> -#include <memlayer.h> - -int -memunload(Memimage *src, Rectangle r, uchar *data, int n) -{ - Memimage *tmp; - Memlayer *dl; - Rectangle lr; - int dx; - - Top: - dl = src->layer; - if(dl == nil) - return unloadmemimage(src, r, data, n); - - /* - * Convert to screen coordinates. - */ - lr = r; - r.min.x += dl->delta.x; - r.min.y += dl->delta.y; - r.max.x += dl->delta.x; - r.max.y += dl->delta.y; - dx = dl->delta.x&(7/src->depth); - if(dl->clear && dx==0){ - src = dl->screen->image; - goto Top; - } - - /* - * src is an obscured layer or data is unaligned - */ - if(dl->save && dx==0){ - if(dl->refreshfn != 0) - return -1; /* can't unload window if it's not Refbackup */ - if(n > 0) - memlhide(src, r); - n = unloadmemimage(dl->save, lr, data, n); - return n; - } - tmp = allocmemimage(lr, src->chan); - if(tmp == nil) - return -1; - memdraw(tmp, lr, src, lr.min, nil, lr.min, S); - n = unloadmemimage(tmp, lr, data, n); - freememimage(tmp); - return n; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/Makefile b/sys/src/cmd/unix/drawterm/libmp/Makefile deleted file mode 100644 index 402d39d31..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -ROOT=.. -include ../Make.config -# N.B. This is used only for secstore. It needn't be fast. - -LIB=libmp.a - -OFILES=\ - betomp.$O\ - crt.$O\ - letomp.$O\ - mpadd.$O\ - mpaux.$O\ - mpcmp.$O\ - mpdigdiv.$O\ - mpdiv.$O\ - mpeuclid.$O\ - mpexp.$O\ - mpextendedgcd.$O\ - mpfmt.$O\ - mpinvert.$O\ - mpleft.$O\ - mpmod.$O\ - mpmul.$O\ - mprand.$O\ - mpright.$O\ - mpsub.$O\ - mptobe.$O\ - mptoi.$O\ - mptole.$O\ - mptoui.$O\ - mptouv.$O\ - mptov.$O\ - mpvecadd.$O\ - mpveccmp.$O\ - mpvecdigmuladd.$O\ - mpvecsub.$O\ - strtomp.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/libmp/betomp.c b/sys/src/cmd/unix/drawterm/libmp/betomp.c deleted file mode 100644 index 95935fcdf..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/betomp.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// convert a big-endian byte array (most significant byte first) to an mpint -mpint* -betomp(uchar *p, uint n, mpint *b) -{ - int m, s; - mpdigit x; - - if(b == nil) - b = mpnew(0); - - // dump leading zeros - while(*p == 0 && n > 1){ - p++; - n--; - } - - // get the space - mpbits(b, n*8); - b->top = DIGITS(n*8); - m = b->top-1; - - // first digit might not be Dbytes long - s = ((n-1)*8)%Dbits; - x = 0; - for(; n > 0; n--){ - x |= ((mpdigit)(*p++)) << s; - s -= 8; - if(s < 0){ - b->p[m--] = x; - s = Dbits-8; - x = 0; - } - } - - return b; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/crt.c b/sys/src/cmd/unix/drawterm/libmp/crt.c deleted file mode 100644 index ddf26ed57..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/crt.c +++ /dev/null @@ -1,122 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// chinese remainder theorem -// -// handbook of applied cryptography, menezes et al, 1997, pp 610 - 613 - -struct CRTpre -{ - int n; // number of moduli - mpint **m; // pointer to moduli - mpint **c; // precomputed coefficients - mpint **p; // precomputed products - mpint *a[1]; // local storage -}; - -// setup crt info, returns a newly created structure -CRTpre* -crtpre(int n, mpint **m) -{ - CRTpre *crt; - int i, j; - mpint *u; - - crt = malloc(sizeof(CRTpre)+sizeof(mpint)*3*n); - if(crt == nil) - sysfatal("crtpre: %r"); - crt->m = crt->a; - crt->c = crt->a+n; - crt->p = crt->c+n; - crt->n = n; - - // make a copy of the moduli - for(i = 0; i < n; i++) - crt->m[i] = mpcopy(m[i]); - - // precompute the products - u = mpcopy(mpone); - for(i = 0; i < n; i++){ - mpmul(u, m[i], u); - crt->p[i] = mpcopy(u); - } - - // precompute the coefficients - for(i = 1; i < n; i++){ - crt->c[i] = mpcopy(mpone); - for(j = 0; j < i; j++){ - mpinvert(m[j], m[i], u); - mpmul(u, crt->c[i], u); - mpmod(u, m[i], crt->c[i]); - } - } - - mpfree(u); - - return crt; -} - -void -crtprefree(CRTpre *crt) -{ - int i; - - for(i = 0; i < crt->n; i++){ - if(i != 0) - mpfree(crt->c[i]); - mpfree(crt->p[i]); - mpfree(crt->m[i]); - } - free(crt); -} - -// convert to residues, returns a newly created structure -CRTres* -crtin(CRTpre *crt, mpint *x) -{ - int i; - CRTres *res; - - res = malloc(sizeof(CRTres)+sizeof(mpint)*crt->n); - if(res == nil) - sysfatal("crtin: %r"); - res->n = crt->n; - for(i = 0; i < res->n; i++){ - res->r[i] = mpnew(0); - mpmod(x, crt->m[i], res->r[i]); - } - return res; -} - -// garners algorithm for converting residue form to linear -void -crtout(CRTpre *crt, CRTres *res, mpint *x) -{ - mpint *u; - int i; - - u = mpnew(0); - mpassign(res->r[0], x); - - for(i = 1; i < crt->n; i++){ - mpsub(res->r[i], x, u); - mpmul(u, crt->c[i], u); - mpmod(u, crt->m[i], u); - mpmul(u, crt->p[i-1], u); - mpadd(x, u, x); - } - - mpfree(u); -} - -// free the residue -void -crtresfree(CRTres *res) -{ - int i; - - for(i = 0; i < res->n; i++) - mpfree(res->r[i]); - free(res); -} diff --git a/sys/src/cmd/unix/drawterm/libmp/crttest.c b/sys/src/cmd/unix/drawterm/libmp/crttest.c deleted file mode 100644 index b58e17363..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/crttest.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -void -testcrt(mpint **p) -{ - CRTpre *crt; - CRTres *res; - mpint *m, *x, *y; - int i; - - fmtinstall('B', mpconv); - - // get a modulus and a test number - m = mpnew(1024+160); - mpmul(p[0], p[1], m); - x = mpnew(1024+160); - mpadd(m, mpone, x); - - // do the precomputation for crt conversion - crt = crtpre(2, p); - - // convert x to residues - res = crtin(crt, x); - - // convert back - y = mpnew(1024+160); - crtout(crt, res, y); - print("x %B\ny %B\n", x, y); - mpfree(m); - mpfree(x); - mpfree(y); -} - -void -main(void) -{ - int i; - mpint *p[2]; - long start; - - start = time(0); - for(i = 0; i < 10; i++){ - p[0] = mpnew(1024); - p[1] = mpnew(1024); - DSAprimes(p[0], p[1], nil); - testcrt(p); - mpfree(p[0]); - mpfree(p[1]); - } - print("%d secs with more\n", time(0)-start); - exits(0); -} diff --git a/sys/src/cmd/unix/drawterm/libmp/dat.h b/sys/src/cmd/unix/drawterm/libmp/dat.h deleted file mode 100644 index f935fa36d..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/dat.h +++ /dev/null @@ -1,15 +0,0 @@ -#define mpdighi (mpdigit)(1U<<(Dbits-1)) -#define DIGITS(x) ((Dbits - 1 + (x))/Dbits) - -// for converting between int's and mpint's -#define MAXUINT ((uint)-1) -#define MAXINT (MAXUINT>>1) -#define MININT (MAXINT+1) - -// for converting between vlongs's and mpint's -// #define MAXUVLONG (~0ULL) -// #define MAXVLONG (MAXUVLONG>>1) -// #define MINVLONG (MAXVLONG+1ULL) -#define MAXUVLONG ((uvlong) ~0) -#define MAXVLONG (MAXUVLONG>>1) -#define MINVLONG (MAXVLONG+((uvlong) 1)) diff --git a/sys/src/cmd/unix/drawterm/libmp/letomp.c b/sys/src/cmd/unix/drawterm/libmp/letomp.c deleted file mode 100644 index 5b8ee9249..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/letomp.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// convert a little endian byte array (least significant byte first) to an mpint -mpint* -letomp(uchar *s, uint n, mpint *b) -{ - int i=0, m = 0; - mpdigit x=0; - - if(b == nil) - b = mpnew(0); - mpbits(b, 8*n); - b->top = DIGITS(8*n); - for(; n > 0; n--){ - x |= ((mpdigit)(*s++)) << i; - i += 8; - if(i == Dbits){ - b->p[m++] = x; - i = 0; - x = 0; - } - } - if(i > 0) - b->p[m++] = x; - b->top = m; - return b; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpadd.c b/sys/src/cmd/unix/drawterm/libmp/mpadd.c deleted file mode 100644 index 6022a64ef..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpadd.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// sum = abs(b1) + abs(b2), i.e., add the magnitudes -void -mpmagadd(mpint *b1, mpint *b2, mpint *sum) -{ - int m, n; - mpint *t; - - // get the sizes right - if(b2->top > b1->top){ - t = b1; - b1 = b2; - b2 = t; - } - n = b1->top; - m = b2->top; - if(n == 0){ - mpassign(mpzero, sum); - return; - } - if(m == 0){ - mpassign(b1, sum); - return; - } - mpbits(sum, (n+1)*Dbits); - sum->top = n+1; - - mpvecadd(b1->p, n, b2->p, m, sum->p); - sum->sign = 1; - - mpnorm(sum); -} - -// sum = b1 + b2 -void -mpadd(mpint *b1, mpint *b2, mpint *sum) -{ - int sign; - - if(b1->sign != b2->sign){ - if(b1->sign < 0) - mpmagsub(b2, b1, sum); - else - mpmagsub(b1, b2, sum); - } else { - sign = b1->sign; - mpmagadd(b1, b2, sum); - if(sum->top != 0) - sum->sign = sign; - } -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpaux.c b/sys/src/cmd/unix/drawterm/libmp/mpaux.c deleted file mode 100644 index 9d3313810..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpaux.c +++ /dev/null @@ -1,185 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -static mpdigit _mptwodata[1] = { 2 }; -static mpint _mptwo = -{ - 1, - 1, - 1, - _mptwodata, - MPstatic -}; -mpint *mptwo = &_mptwo; - -static mpdigit _mponedata[1] = { 1 }; -static mpint _mpone = -{ - 1, - 1, - 1, - _mponedata, - MPstatic -}; -mpint *mpone = &_mpone; - -static mpdigit _mpzerodata[1] = { 0 }; -static mpint _mpzero = -{ - 1, - 1, - 0, - _mpzerodata, - MPstatic -}; -mpint *mpzero = &_mpzero; - -static int mpmindigits = 33; - -// set minimum digit allocation -void -mpsetminbits(int n) -{ - if(n == 0) - n = 1; - mpmindigits = DIGITS(n); -} - -// allocate an n bit 0'd number -mpint* -mpnew(int n) -{ - mpint *b; - - b = mallocz(sizeof(mpint), 1); - if(b == nil) - sysfatal("mpnew: %r"); - n = DIGITS(n); - if(n < mpmindigits) - n = mpmindigits; - n = n; - b->p = (mpdigit*)mallocz(n*Dbytes, 1); - if(b->p == nil) - sysfatal("mpnew: %r"); - b->size = n; - b->sign = 1; - - return b; -} - -// guarantee at least n significant bits -void -mpbits(mpint *b, int m) -{ - int n; - - n = DIGITS(m); - if(b->size >= n){ - if(b->top >= n) - return; - memset(&b->p[b->top], 0, Dbytes*(n - b->top)); - b->top = n; - return; - } - b->p = (mpdigit*)realloc(b->p, n*Dbytes); - if(b->p == nil) - sysfatal("mpbits: %r"); - memset(&b->p[b->top], 0, Dbytes*(n - b->top)); - b->size = n; - b->top = n; -} - -void -mpfree(mpint *b) -{ - if(b == nil) - return; - if(b->flags & MPstatic) - sysfatal("freeing mp constant"); - memset(b->p, 0, b->top*Dbytes); // information hiding - free(b->p); - free(b); -} - -void -mpnorm(mpint *b) -{ - int i; - - for(i = b->top-1; i >= 0; i--) - if(b->p[i] != 0) - break; - b->top = i+1; - if(b->top == 0) - b->sign = 1; -} - -mpint* -mpcopy(mpint *old) -{ - mpint *new; - - new = mpnew(Dbits*old->size); - new->top = old->top; - new->sign = old->sign; - memmove(new->p, old->p, Dbytes*old->top); - return new; -} - -void -mpassign(mpint *old, mpint *new) -{ - mpbits(new, Dbits*old->top); - new->sign = old->sign; - new->top = old->top; - memmove(new->p, old->p, Dbytes*old->top); -} - -// number of significant bits in mantissa -int -mpsignif(mpint *n) -{ - int i, j; - mpdigit d; - - if(n->top == 0) - return 0; - for(i = n->top-1; i >= 0; i--){ - d = n->p[i]; - for(j = Dbits-1; j >= 0; j--){ - if(d & (((mpdigit)1)<<j)) - return i*Dbits + j + 1; - } - } - return 0; -} - -// k, where n = 2**k * q for odd q -int -mplowbits0(mpint *n) -{ - int k, bit, digit; - mpdigit d; - - if(n->top==0) - return 0; - k = 0; - bit = 0; - digit = 0; - d = n->p[0]; - for(;;){ - if(d & (1<<bit)) - break; - k++; - bit++; - if(bit==Dbits){ - if(++digit >= n->top) - return 0; - d = n->p[digit]; - bit = 0; - } - } - return k; -} - diff --git a/sys/src/cmd/unix/drawterm/libmp/mpcmp.c b/sys/src/cmd/unix/drawterm/libmp/mpcmp.c deleted file mode 100644 index 38af08197..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpcmp.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// return 1, 0, -1 as abs(b1)-abs(b2) is neg, 0, pos -int -mpmagcmp(mpint *b1, mpint *b2) -{ - int i; - - i = b1->top - b2->top; - if(i) - return i; - - return mpveccmp(b1->p, b1->top, b2->p, b2->top); -} - -// return neg, 0, pos as b1-b2 is neg, 0, pos -int -mpcmp(mpint *b1, mpint *b2) -{ - if(b1->sign != b2->sign) - return b1->sign - b2->sign; - if(b1->sign < 0) - return mpmagcmp(b2, b1); - else - return mpmagcmp(b1, b2); -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpdigdiv.c b/sys/src/cmd/unix/drawterm/libmp/mpdigdiv.c deleted file mode 100644 index 4a73bb3a4..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpdigdiv.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// -// divide two digits by one and return quotient -// -void -mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient) -{ - mpdigit hi, lo, q, x, y; - int i; - - hi = dividend[1]; - lo = dividend[0]; - - // return highest digit value if the result >= 2**32 - if(hi >= divisor || divisor == 0){ - divisor = 0; - *quotient = ~divisor; - return; - } - - // at this point we know that hi < divisor - // just shift and subtract till we're done - q = 0; - x = divisor; - for(i = Dbits-1; hi > 0 && i >= 0; i--){ - x >>= 1; - if(x > hi) - continue; - y = divisor<<i; - if(x == hi && y > lo) - continue; - if(y > lo) - hi--; - lo -= y; - hi -= x; - q |= 1<<i; - } - q += lo/divisor; - *quotient = q; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpdiv.c b/sys/src/cmd/unix/drawterm/libmp/mpdiv.c deleted file mode 100644 index 92aee03f4..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpdiv.c +++ /dev/null @@ -1,112 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// division ala knuth, seminumerical algorithms, pp 237-238 -// the numbers are stored backwards to what knuth expects so j -// counts down rather than up. - -void -mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) -{ - int j, s, vn, sign; - mpdigit qd, *up, *vp, *qp; - mpint *u, *v, *t; - - // divide bv zero - if(divisor->top == 0) - abort(); - - // quick check - if(mpmagcmp(dividend, divisor) < 0){ - if(remainder != nil) - mpassign(dividend, remainder); - if(quotient != nil) - mpassign(mpzero, quotient); - return; - } - - // D1: shift until divisor, v, has hi bit set (needed to make trial - // divisor accurate) - qd = divisor->p[divisor->top-1]; - for(s = 0; (qd & mpdighi) == 0; s++) - qd <<= 1; - u = mpnew((dividend->top+2)*Dbits + s); - if(s == 0 && divisor != quotient && divisor != remainder) { - mpassign(dividend, u); - v = divisor; - } else { - mpleft(dividend, s, u); - v = mpnew(divisor->top*Dbits); - mpleft(divisor, s, v); - } - up = u->p+u->top-1; - vp = v->p+v->top-1; - vn = v->top; - - // D1a: make sure high digit of dividend is less than high digit of divisor - if(*up >= *vp){ - *++up = 0; - u->top++; - } - - // storage for multiplies - t = mpnew(4*Dbits); - - qp = nil; - if(quotient != nil){ - mpbits(quotient, (u->top - v->top)*Dbits); - quotient->top = u->top - v->top; - qp = quotient->p+quotient->top-1; - } - - // D2, D7: loop on length of dividend - for(j = u->top; j > vn; j--){ - - // D3: calculate trial divisor - mpdigdiv(up-1, *vp, &qd); - - // D3a: rule out trial divisors 2 greater than real divisor - if(vn > 1) for(;;){ - memset(t->p, 0, 3*Dbytes); // mpvecdigmuladd adds to what's there - mpvecdigmuladd(vp-1, 2, qd, t->p); - if(mpveccmp(t->p, 3, up-2, 3) > 0) - qd--; - else - break; - } - - // D4: u -= v*qd << j*Dbits - sign = mpvecdigmulsub(v->p, vn, qd, up-vn); - if(sign < 0){ - - // D6: trial divisor was too high, add back borrowed - // value and decrease divisor - mpvecadd(up-vn, vn+1, v->p, vn, up-vn); - qd--; - } - - // D5: save quotient digit - if(qp != nil) - *qp-- = qd; - - // push top of u down one - u->top--; - *up-- = 0; - } - if(qp != nil){ - mpnorm(quotient); - if(dividend->sign != divisor->sign) - quotient->sign = -1; - } - - if(remainder != nil){ - mpright(u, s, remainder); // u is the remainder shifted - remainder->sign = dividend->sign; - } - - mpfree(t); - mpfree(u); - if(v != divisor) - mpfree(v); -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpeuclid.c b/sys/src/cmd/unix/drawterm/libmp/mpeuclid.c deleted file mode 100644 index b44e8ae63..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpeuclid.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "os.h" -#include <mp.h> - -// extended euclid -// -// For a and b it solves, d = gcd(a,b) and finds x and y s.t. -// ax + by = d -// -// Handbook of Applied Cryptography, Menezes et al, 1997, pg 67 - -void -mpeuclid(mpint *a, mpint *b, mpint *d, mpint *x, mpint *y) -{ - mpint *tmp, *x0, *x1, *x2, *y0, *y1, *y2, *q, *r; - - if(mpcmp(a, b) < 0){ - tmp = a; - a = b; - b = tmp; - tmp = x; - x = y; - y = tmp; - } - - if(b->top == 0){ - mpassign(a, d); - mpassign(mpone, x); - mpassign(mpzero, y); - return; - } - - a = mpcopy(a); - b = mpcopy(b); - x0 = mpnew(0); - x1 = mpcopy(mpzero); - x2 = mpcopy(mpone); - y0 = mpnew(0); - y1 = mpcopy(mpone); - y2 = mpcopy(mpzero); - q = mpnew(0); - r = mpnew(0); - - while(b->top != 0 && b->sign > 0){ - // q = a/b - // r = a mod b - mpdiv(a, b, q, r); - // x0 = x2 - qx1 - mpmul(q, x1, x0); - mpsub(x2, x0, x0); - // y0 = y2 - qy1 - mpmul(q, y1, y0); - mpsub(y2, y0, y0); - // rotate values - tmp = a; - a = b; - b = r; - r = tmp; - tmp = x2; - x2 = x1; - x1 = x0; - x0 = tmp; - tmp = y2; - y2 = y1; - y1 = y0; - y0 = tmp; - } - - mpassign(a, d); - mpassign(x2, x); - mpassign(y2, y); - - mpfree(x0); - mpfree(x1); - mpfree(x2); - mpfree(y0); - mpfree(y1); - mpfree(y2); - mpfree(q); - mpfree(r); - mpfree(a); - mpfree(b); -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpexp.c b/sys/src/cmd/unix/drawterm/libmp/mpexp.c deleted file mode 100644 index 745057289..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpexp.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// res = b**e -// -// knuth, vol 2, pp 398-400 - -enum { - Freeb= 0x1, - Freee= 0x2, - Freem= 0x4, -}; - -//int expdebug; - -void -mpexp(mpint *b, mpint *e, mpint *m, mpint *res) -{ - mpint *t[2]; - int tofree; - mpdigit d, bit; - int i, j; - - t[0] = mpcopy(b); - t[1] = res; - - tofree = 0; - if(res == b){ - b = mpcopy(b); - tofree |= Freeb; - } - if(res == e){ - e = mpcopy(e); - tofree |= Freee; - } - if(res == m){ - m = mpcopy(m); - tofree |= Freem; - } - - // skip first bit - i = e->top-1; - d = e->p[i]; - for(bit = mpdighi; (bit & d) == 0; bit >>= 1) - ; - bit >>= 1; - - j = 0; - for(;;){ - for(; bit != 0; bit >>= 1){ - mpmul(t[j], t[j], t[j^1]); - if(bit & d) - mpmul(t[j^1], b, t[j]); - else - j ^= 1; - if(m != nil && t[j]->top > m->top){ - mpmod(t[j], m, t[j^1]); - j ^= 1; - } - } - if(--i < 0) - break; - bit = mpdighi; - d = e->p[i]; - } - if(m != nil){ - mpmod(t[j], m, t[j^1]); - j ^= 1; - } - if(t[j] == res){ - mpfree(t[j^1]); - } else { - mpassign(t[j], res); - mpfree(t[j]); - } - - if(tofree){ - if(tofree & Freeb) - mpfree(b); - if(tofree & Freee) - mpfree(e); - if(tofree & Freem) - mpfree(m); - } -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpextendedgcd.c b/sys/src/cmd/unix/drawterm/libmp/mpextendedgcd.c deleted file mode 100644 index 9d1557eb5..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpextendedgcd.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "os.h" -#include <mp.h> - -#define iseven(a) (((a)->p[0] & 1) == 0) - -// extended binary gcd -// -// For a anv b it solves, v = gcd(a,b) and finds x and y s.t. -// ax + by = v -// -// Handbook of Applied Cryptography, Menezes et al, 1997, pg 608. -void -mpextendedgcd(mpint *a, mpint *b, mpint *v, mpint *x, mpint *y) -{ - mpint *u, *A, *B, *C, *D; - int g; - - if(a->top == 0){ - mpassign(b, v); - mpassign(mpone, y); - mpassign(mpzero, x); - return; - } - if(b->top == 0){ - mpassign(a, v); - mpassign(mpone, x); - mpassign(mpzero, y); - return; - } - - g = 0; - a = mpcopy(a); - b = mpcopy(b); - - while(iseven(a) && iseven(b)){ - mpright(a, 1, a); - mpright(b, 1, b); - g++; - } - - u = mpcopy(a); - mpassign(b, v); - A = mpcopy(mpone); - B = mpcopy(mpzero); - C = mpcopy(mpzero); - D = mpcopy(mpone); - - for(;;) { -// print("%B %B %B %B %B %B\n", u, v, A, B, C, D); - while(iseven(u)){ - mpright(u, 1, u); - if(!iseven(A) || !iseven(B)) { - mpadd(A, b, A); - mpsub(B, a, B); - } - mpright(A, 1, A); - mpright(B, 1, B); - } - -// print("%B %B %B %B %B %B\n", u, v, A, B, C, D); - while(iseven(v)){ - mpright(v, 1, v); - if(!iseven(C) || !iseven(D)) { - mpadd(C, b, C); - mpsub(D, a, D); - } - mpright(C, 1, C); - mpright(D, 1, D); - } - -// print("%B %B %B %B %B %B\n", u, v, A, B, C, D); - if(mpcmp(u, v) >= 0){ - mpsub(u, v, u); - mpsub(A, C, A); - mpsub(B, D, B); - } else { - mpsub(v, u, v); - mpsub(C, A, C); - mpsub(D, B, D); - } - - if(u->top == 0) - break; - - } - mpassign(C, x); - mpassign(D, y); - mpleft(v, g, v); - - mpfree(A); - mpfree(B); - mpfree(C); - mpfree(D); - mpfree(u); - mpfree(a); - mpfree(b); -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpfmt.c b/sys/src/cmd/unix/drawterm/libmp/mpfmt.c deleted file mode 100644 index f7c42a7bc..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpfmt.c +++ /dev/null @@ -1,193 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> -#include "dat.h" - -static int -to64(mpint *b, char *buf, int len) -{ - uchar *p; - int n, rv; - - p = nil; - n = mptobe(b, nil, 0, &p); - if(n < 0) - return -1; - rv = enc64(buf, len, p, n); - free(p); - return rv; -} - -static int -to32(mpint *b, char *buf, int len) -{ - uchar *p; - int n, rv; - - // leave room for a multiple of 5 buffer size - n = b->top*Dbytes + 5; - p = malloc(n); - if(p == nil) - return -1; - n = mptobe(b, p, n, nil); - if(n < 0) - return -1; - - // round up buffer size, enc32 only accepts a multiple of 5 - if(n%5) - n += 5 - (n%5); - rv = enc32(buf, len, p, n); - free(p); - return rv; -} - -static char set16[] = "0123456789ABCDEF"; - -static int -to16(mpint *b, char *buf, int len) -{ - mpdigit *p, x; - int i, j; - char *out, *eout; - - if(len < 1) - return -1; - - out = buf; - eout = buf+len; - for(p = &b->p[b->top-1]; p >= b->p; p--){ - x = *p; - for(i = Dbits-4; i >= 0; i -= 4){ - j = 0xf & (x>>i); - if(j != 0 || out != buf){ - if(out >= eout) - return -1; - *out++ = set16[j]; - } - } - } - if(out == buf) - *out++ = '0'; - if(out >= eout) - return -1; - *out = 0; - return 0; -} - -static char* -modbillion(int rem, ulong r, char *out, char *buf) -{ - ulong rr; - int i; - - for(i = 0; i < 9; i++){ - rr = r%10; - r /= 10; - if(out <= buf) - return nil; - *--out = '0' + rr; - if(rem == 0 && r == 0) - break; - } - return out; -} - -static int -to10(mpint *b, char *buf, int len) -{ - mpint *d, *r, *billion; - char *out; - - if(len < 1) - return -1; - - d = mpcopy(b); - r = mpnew(0); - billion = uitomp(1000000000, nil); - out = buf+len; - *--out = 0; - do { - mpdiv(d, billion, d, r); - out = modbillion(d->top, r->p[0], out, buf); - if(out == nil) - break; - } while(d->top != 0); - mpfree(d); - mpfree(r); - mpfree(billion); - - if(out == nil) - return -1; - len -= out-buf; - if(out != buf) - memmove(buf, out, len); - return 0; -} - -int -mpfmt(Fmt *fmt) -{ - mpint *b; - char *p; - - b = va_arg(fmt->args, mpint*); - if(b == nil) - return fmtstrcpy(fmt, "*"); - - p = mptoa(b, fmt->prec, nil, 0); - fmt->flags &= ~FmtPrec; - - if(p == nil) - return fmtstrcpy(fmt, "*"); - else{ - fmtstrcpy(fmt, p); - free(p); - return 0; - } -} - -char* -mptoa(mpint *b, int base, char *buf, int len) -{ - char *out; - int rv, alloced; - - alloced = 0; - if(buf == nil){ - len = ((b->top+1)*Dbits+2)/3 + 1; - buf = malloc(len); - if(buf == nil) - return nil; - alloced = 1; - } - - if(len < 2) - return nil; - - out = buf; - if(b->sign < 0){ - *out++ = '-'; - len--; - } - switch(base){ - case 64: - rv = to64(b, out, len); - break; - case 32: - rv = to32(b, out, len); - break; - default: - case 16: - rv = to16(b, out, len); - break; - case 10: - rv = to10(b, out, len); - break; - } - if(rv < 0){ - if(alloced) - free(buf); - return nil; - } - return buf; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpinvert.c b/sys/src/cmd/unix/drawterm/libmp/mpinvert.c deleted file mode 100644 index ee2630702..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpinvert.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "os.h" -#include <mp.h> - -#define iseven(a) (((a)->p[0] & 1) == 0) - -// use extended gcd to find the multiplicative inverse -// res = b**-1 mod m -void -mpinvert(mpint *b, mpint *m, mpint *res) -{ - mpint *dc1, *dc2; // don't care - - dc1 = mpnew(0); - dc2 = mpnew(0); - mpextendedgcd(b, m, dc1, res, dc2); - if(mpcmp(dc1, mpone) != 0) - abort(); - mpmod(res, m, res); - mpfree(dc1); - mpfree(dc2); -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpleft.c b/sys/src/cmd/unix/drawterm/libmp/mpleft.c deleted file mode 100644 index 23ff9daa4..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpleft.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// res = b << shift -void -mpleft(mpint *b, int shift, mpint *res) -{ - int d, l, r, i, otop; - mpdigit this, last; - - // a negative left shift is a right shift - if(shift < 0){ - mpright(b, -shift, res); - return; - } - - // b and res may be the same so remember the old top - otop = b->top; - - // shift - mpbits(res, otop*Dbits + shift); // overkill - res->top = DIGITS(otop*Dbits + shift); - d = shift/Dbits; - l = shift - d*Dbits; - r = Dbits - l; - - if(l == 0){ - for(i = otop-1; i >= 0; i--) - res->p[i+d] = b->p[i]; - } else { - last = 0; - for(i = otop-1; i >= 0; i--) { - this = b->p[i]; - res->p[i+d+1] = (last<<l) | (this>>r); - last = this; - } - res->p[d] = last<<l; - } - for(i = 0; i < d; i++) - res->p[i] = 0; - - // normalize - while(res->top > 0 && res->p[res->top-1] == 0) - res->top--; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpmod.c b/sys/src/cmd/unix/drawterm/libmp/mpmod.c deleted file mode 100644 index 91bebfa27..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpmod.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// remainder = b mod m -// -// knuth, vol 2, pp 398-400 - -void -mpmod(mpint *b, mpint *m, mpint *remainder) -{ - mpdiv(b, m, nil, remainder); - if(remainder->sign < 0) - mpadd(m, remainder, remainder); -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpmul.c b/sys/src/cmd/unix/drawterm/libmp/mpmul.c deleted file mode 100644 index dedd474a7..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpmul.c +++ /dev/null @@ -1,156 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// -// from knuth's 1969 seminumberical algorithms, pp 233-235 and pp 258-260 -// -// mpvecmul is an assembly language routine that performs the inner -// loop. -// -// the karatsuba trade off is set empiricly by measuring the algs on -// a 400 MHz Pentium II. -// - -// karatsuba like (see knuth pg 258) -// prereq: p is already zeroed -static void -mpkaratsuba(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p) -{ - mpdigit *t, *u0, *u1, *v0, *v1, *u0v0, *u1v1, *res, *diffprod; - int u0len, u1len, v0len, v1len, reslen; - int sign, n; - - // divide each piece in half - n = alen/2; - if(alen&1) - n++; - u0len = n; - u1len = alen-n; - if(blen > n){ - v0len = n; - v1len = blen-n; - } else { - v0len = blen; - v1len = 0; - } - u0 = a; - u1 = a + u0len; - v0 = b; - v1 = b + v0len; - - // room for the partial products - t = mallocz(Dbytes*5*(2*n+1), 1); - if(t == nil) - sysfatal("mpkaratsuba: %r"); - u0v0 = t; - u1v1 = t + (2*n+1); - diffprod = t + 2*(2*n+1); - res = t + 3*(2*n+1); - reslen = 4*n+1; - - // t[0] = (u1-u0) - sign = 1; - if(mpveccmp(u1, u1len, u0, u0len) < 0){ - sign = -1; - mpvecsub(u0, u0len, u1, u1len, u0v0); - } else - mpvecsub(u1, u1len, u0, u1len, u0v0); - - // t[1] = (v0-v1) - if(mpveccmp(v0, v0len, v1, v1len) < 0){ - sign *= -1; - mpvecsub(v1, v1len, v0, v1len, u1v1); - } else - mpvecsub(v0, v0len, v1, v1len, u1v1); - - // t[4:5] = (u1-u0)*(v0-v1) - mpvecmul(u0v0, u0len, u1v1, v0len, diffprod); - - // t[0:1] = u1*v1 - memset(t, 0, 2*(2*n+1)*Dbytes); - if(v1len > 0) - mpvecmul(u1, u1len, v1, v1len, u1v1); - - // t[2:3] = u0v0 - mpvecmul(u0, u0len, v0, v0len, u0v0); - - // res = u0*v0<<n + u0*v0 - mpvecadd(res, reslen, u0v0, u0len+v0len, res); - mpvecadd(res+n, reslen-n, u0v0, u0len+v0len, res+n); - - // res += u1*v1<<n + u1*v1<<2*n - if(v1len > 0){ - mpvecadd(res+n, reslen-n, u1v1, u1len+v1len, res+n); - mpvecadd(res+2*n, reslen-2*n, u1v1, u1len+v1len, res+2*n); - } - - // res += (u1-u0)*(v0-v1)<<n - if(sign < 0) - mpvecsub(res+n, reslen-n, diffprod, u0len+v0len, res+n); - else - mpvecadd(res+n, reslen-n, diffprod, u0len+v0len, res+n); - memmove(p, res, (alen+blen)*Dbytes); - - free(t); -} - -#define KARATSUBAMIN 32 - -void -mpvecmul(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p) -{ - int i; - mpdigit d; - mpdigit *t; - - // both mpvecdigmuladd and karatsuba are fastest when a is the longer vector - if(alen < blen){ - i = alen; - alen = blen; - blen = i; - t = a; - a = b; - b = t; - } - if(blen == 0){ - memset(p, 0, Dbytes*(alen+blen)); - return; - } - - if(alen >= KARATSUBAMIN && blen > 1){ - // O(n^1.585) - mpkaratsuba(a, alen, b, blen, p); - } else { - // O(n^2) - for(i = 0; i < blen; i++){ - d = b[i]; - if(d != 0) - mpvecdigmuladd(a, alen, d, &p[i]); - } - } -} - -void -mpmul(mpint *b1, mpint *b2, mpint *prod) -{ - mpint *oprod; - - oprod = nil; - if(prod == b1 || prod == b2){ - oprod = prod; - prod = mpnew(0); - } - - prod->top = 0; - mpbits(prod, (b1->top+b2->top+1)*Dbits); - mpvecmul(b1->p, b1->top, b2->p, b2->top, prod->p); - prod->top = b1->top+b2->top+1; - prod->sign = b1->sign*b2->sign; - mpnorm(prod); - - if(oprod != nil){ - mpassign(prod, oprod); - mpfree(prod); - } -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mprand.c b/sys/src/cmd/unix/drawterm/libmp/mprand.c deleted file mode 100644 index fd288f24e..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mprand.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> -#include "dat.h" - -mpint* -mprand(int bits, void (*gen)(uchar*, int), mpint *b) -{ - int n, m; - mpdigit mask; - uchar *p; - - n = DIGITS(bits); - if(b == nil) - b = mpnew(bits); - else - mpbits(b, bits); - - p = malloc(n*Dbytes); - if(p == nil) - return nil; - (*gen)(p, n*Dbytes); - betomp(p, n*Dbytes, b); - free(p); - - // make sure we don't give too many bits - m = bits%Dbits; - n--; - if(m > 0){ - mask = 1; - mask <<= m; - mask--; - b->p[n] &= mask; - } - - for(; n >= 0; n--) - if(b->p[n] != 0) - break; - b->top = n+1; - b->sign = 1; - return b; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpright.c b/sys/src/cmd/unix/drawterm/libmp/mpright.c deleted file mode 100644 index 6c42de168..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpright.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// res = b >> shift -void -mpright(mpint *b, int shift, mpint *res) -{ - int d, l, r, i; - mpdigit this, last; - - // a negative right shift is a left shift - if(shift < 0){ - mpleft(b, -shift, res); - return; - } - - if(res != b) - mpbits(res, b->top*Dbits - shift); - d = shift/Dbits; - r = shift - d*Dbits; - l = Dbits - r; - - // special case digit shifts - if(r == 0){ - for(i = 0; i < b->top-d; i++) - res->p[i] = b->p[i+d]; - } else { - last = b->p[d]; - for(i = 0; i < b->top-d-1; i++){ - this = b->p[i+d+1]; - res->p[i] = (this<<l) | (last>>r); - last = this; - } - res->p[i++] = last>>r; - } - while(i > 0 && res->p[i-1] == 0) - i--; - res->top = i; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpsub.c b/sys/src/cmd/unix/drawterm/libmp/mpsub.c deleted file mode 100644 index 3fe6ca095..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpsub.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// diff = abs(b1) - abs(b2), i.e., subtract the magnitudes -void -mpmagsub(mpint *b1, mpint *b2, mpint *diff) -{ - int n, m, sign; - mpint *t; - - // get the sizes right - if(mpmagcmp(b1, b2) < 0){ - sign = -1; - t = b1; - b1 = b2; - b2 = t; - } else - sign = 1; - n = b1->top; - m = b2->top; - if(m == 0){ - mpassign(b1, diff); - diff->sign = sign; - return; - } - mpbits(diff, n*Dbits); - - mpvecsub(b1->p, n, b2->p, m, diff->p); - diff->sign = sign; - diff->top = n; - mpnorm(diff); -} - -// diff = b1 - b2 -void -mpsub(mpint *b1, mpint *b2, mpint *diff) -{ - int sign; - - if(b1->sign != b2->sign){ - sign = b1->sign; - mpmagadd(b1, b2, diff); - diff->sign = sign; - return; - } - - sign = b1->sign; - mpmagsub(b1, b2, diff); - if(diff->top != 0) - diff->sign *= sign; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mptobe.c b/sys/src/cmd/unix/drawterm/libmp/mptobe.c deleted file mode 100644 index e08ae56be..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mptobe.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// convert an mpint into a big endian byte array (most significant byte first) -// return number of bytes converted -// if p == nil, allocate and result array -int -mptobe(mpint *b, uchar *p, uint n, uchar **pp) -{ - int i, j, suppress; - mpdigit x; - uchar *e, *s, c; - - if(p == nil){ - n = (b->top+1)*Dbytes; - p = malloc(n); - } - if(p == nil) - return -1; - if(pp != nil) - *pp = p; - memset(p, 0, n); - - // special case 0 - if(b->top == 0){ - if(n < 1) - return -1; - else - return 1; - } - - s = p; - e = s+n; - suppress = 1; - for(i = b->top-1; i >= 0; i--){ - x = b->p[i]; - for(j = Dbits-8; j >= 0; j -= 8){ - c = x>>j; - if(c == 0 && suppress) - continue; - if(p >= e) - return -1; - *p++ = c; - suppress = 0; - } - } - - // guarantee at least one byte - if(s == p){ - if(p >= e) - return -1; - *p++ = 0; - } - - return p - s; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mptoi.c b/sys/src/cmd/unix/drawterm/libmp/mptoi.c deleted file mode 100644 index e636e246a..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mptoi.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -/* - * this code assumes that mpdigit is at least as - * big as an int. - */ - -mpint* -itomp(int i, mpint *b) -{ - if(b == nil) - b = mpnew(0); - mpassign(mpzero, b); - if(i != 0) - b->top = 1; - if(i < 0){ - b->sign = -1; - *b->p = -i; - } else - *b->p = i; - return b; -} - -int -mptoi(mpint *b) -{ - uint x; - - x = *b->p; - if(b->sign > 0){ - if(b->top > 1 || (x > MAXINT)) - x = (int)MAXINT; - else - x = (int)x; - } else { - if(b->top > 1 || x > MAXINT+1) - x = (int)MININT; - else - x = -(int)x; - } - return x; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mptole.c b/sys/src/cmd/unix/drawterm/libmp/mptole.c deleted file mode 100644 index 9421d5f66..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mptole.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// convert an mpint into a little endian byte array (least significant byte first) - -// return number of bytes converted -// if p == nil, allocate and result array -int -mptole(mpint *b, uchar *p, uint n, uchar **pp) -{ - int i, j; - mpdigit x; - uchar *e, *s; - - if(p == nil){ - n = (b->top+1)*Dbytes; - p = malloc(n); - } - if(pp != nil) - *pp = p; - if(p == nil) - return -1; - memset(p, 0, n); - - // special case 0 - if(b->top == 0){ - if(n < 1) - return -1; - else - return 0; - } - - s = p; - e = s+n; - for(i = 0; i < b->top-1; i++){ - x = b->p[i]; - for(j = 0; j < Dbytes; j++){ - if(p >= e) - return -1; - *p++ = x; - x >>= 8; - } - } - x = b->p[i]; - while(x > 0){ - if(p >= e) - return -1; - *p++ = x; - x >>= 8; - } - - return p - s; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mptoui.c b/sys/src/cmd/unix/drawterm/libmp/mptoui.c deleted file mode 100644 index 9d80c1dfc..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mptoui.c +++ /dev/null @@ -1,35 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -/* - * this code assumes that mpdigit is at least as - * big as an int. - */ - -mpint* -uitomp(uint i, mpint *b) -{ - if(b == nil) - b = mpnew(0); - mpassign(mpzero, b); - if(i != 0) - b->top = 1; - *b->p = i; - return b; -} - -uint -mptoui(mpint *b) -{ - uint x; - - x = *b->p; - if(b->sign < 0){ - x = 0; - } else { - if(b->top > 1 || x > MAXUINT) - x = MAXUINT; - } - return x; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mptouv.c b/sys/src/cmd/unix/drawterm/libmp/mptouv.c deleted file mode 100644 index 76f93dd7f..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mptouv.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -#define VLDIGITS (sizeof(vlong)/sizeof(mpdigit)) - -/* - * this code assumes that a vlong is an integral number of - * mpdigits long. - */ -mpint* -uvtomp(uvlong v, mpint *b) -{ - int s; - - if(b == nil) - b = mpnew(VLDIGITS*sizeof(mpdigit)); - else - mpbits(b, VLDIGITS*sizeof(mpdigit)); - mpassign(mpzero, b); - if(v == 0) - return b; - for(s = 0; s < VLDIGITS && v != 0; s++){ - b->p[s] = v; - v >>= sizeof(mpdigit)*8; - } - b->top = s; - return b; -} - -uvlong -mptouv(mpint *b) -{ - uvlong v; - int s; - - if(b->top == 0) - return (vlong) 0; - - mpnorm(b); - if(b->top > VLDIGITS) - return MAXVLONG; - - v = (uvlong) 0; - for(s = 0; s < b->top; s++) - v |= b->p[s]<<(s*sizeof(mpdigit)*8); - - return v; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mptov.c b/sys/src/cmd/unix/drawterm/libmp/mptov.c deleted file mode 100644 index fd371d82a..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mptov.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -#define VLDIGITS (sizeof(vlong)/sizeof(mpdigit)) - -/* - * this code assumes that a vlong is an integral number of - * mpdigits long. - */ -mpint* -vtomp(vlong v, mpint *b) -{ - int s; - uvlong uv; - - if(b == nil) - b = mpnew(VLDIGITS*sizeof(mpdigit)); - else - mpbits(b, VLDIGITS*sizeof(mpdigit)); - mpassign(mpzero, b); - if(v == 0) - return b; - if(v < 0){ - b->sign = -1; - uv = -v; - } else - uv = v; - for(s = 0; s < VLDIGITS && uv != 0; s++){ - b->p[s] = uv; - uv >>= sizeof(mpdigit)*8; - } - b->top = s; - return b; -} - -vlong -mptov(mpint *b) -{ - uvlong v; - int s; - - if(b->top == 0) - return (vlong) 0; - - mpnorm(b); - if(b->top > VLDIGITS){ - if(b->sign > 0) - return (vlong)MAXVLONG; - else - return (vlong)MINVLONG; - } - - v = (uvlong) 0; - for(s = 0; s < b->top; s++) - v |= b->p[s]<<(s*sizeof(mpdigit)*8); - - if(b->sign > 0){ - if(v > MAXVLONG) - v = MAXVLONG; - } else { - if(v > MINVLONG) - v = MINVLONG; - else - v = -(vlong)v; - } - - return (vlong)v; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpvecadd.c b/sys/src/cmd/unix/drawterm/libmp/mpvecadd.c deleted file mode 100644 index 98fdcc901..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpvecadd.c +++ /dev/null @@ -1,35 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// prereq: alen >= blen, sum has at least blen+1 digits -void -mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) -{ - int i, carry; - mpdigit x, y; - - carry = 0; - for(i = 0; i < blen; i++){ - x = *a++; - y = *b++; - x += carry; - if(x < carry) - carry = 1; - else - carry = 0; - x += y; - if(x < y) - carry++; - *sum++ = x; - } - for(; i < alen; i++){ - x = *a++ + carry; - if(x < carry) - carry = 1; - else - carry = 0; - *sum++ = x; - } - *sum = carry; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpveccmp.c b/sys/src/cmd/unix/drawterm/libmp/mpveccmp.c deleted file mode 100644 index 9dcc59822..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpveccmp.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// prereq: alen >= blen -int -mpveccmp(mpdigit *a, int alen, mpdigit *b, int blen) -{ - mpdigit x; - - while(alen > blen) - if(a[--alen] != 0) - return 1; - while(blen > alen) - if(b[--blen] != 0) - return -1; - while(alen > 0){ - --alen; - x = a[alen] - b[alen]; - if(x == 0) - continue; - if(x > a[alen]) - return -1; - else - return 1; - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpvecdigmuladd.c b/sys/src/cmd/unix/drawterm/libmp/mpvecdigmuladd.c deleted file mode 100644 index 6b6c68379..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpvecdigmuladd.c +++ /dev/null @@ -1,103 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -#define LO(x) ((x) & ((1<<(Dbits/2))-1)) -#define HI(x) ((x) >> (Dbits/2)) - -static void -mpdigmul(mpdigit a, mpdigit b, mpdigit *p) -{ - mpdigit x, ah, al, bh, bl, p1, p2, p3, p4; - int carry; - - // half digits - ah = HI(a); - al = LO(a); - bh = HI(b); - bl = LO(b); - - // partial products - p1 = ah*bl; - p2 = bh*al; - p3 = bl*al; - p4 = ah*bh; - - // p = ((p1+p2)<<(Dbits/2)) + (p4<<Dbits) + p3 - carry = 0; - x = p1<<(Dbits/2); - p3 += x; - if(p3 < x) - carry++; - x = p2<<(Dbits/2); - p3 += x; - if(p3 < x) - carry++; - p4 += carry + HI(p1) + HI(p2); // can't carry out of the high digit - p[0] = p3; - p[1] = p4; -} - -// prereq: p must have room for n+1 digits -void -mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p) -{ - int i; - mpdigit carry, x, y, part[2]; - - carry = 0; - part[1] = 0; - for(i = 0; i < n; i++){ - x = part[1] + carry; - if(x < carry) - carry = 1; - else - carry = 0; - y = *p; - mpdigmul(*b++, m, part); - x += part[0]; - if(x < part[0]) - carry++; - x += y; - if(x < y) - carry++; - *p++ = x; - } - *p = part[1] + carry; -} - -// prereq: p must have room for n+1 digits -int -mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p) -{ - int i; - mpdigit x, y, part[2], borrow; - - borrow = 0; - part[1] = 0; - for(i = 0; i < n; i++){ - x = *p; - y = x - borrow; - if(y > x) - borrow = 1; - else - borrow = 0; - x = part[1]; - mpdigmul(*b++, m, part); - x += part[0]; - if(x < part[0]) - borrow++; - x = y - x; - if(x > y) - borrow++; - *p++ = x; - } - - x = *p; - y = x - borrow - part[1]; - *p = y; - if(y > x) - return -1; - else - return 1; -} diff --git a/sys/src/cmd/unix/drawterm/libmp/mpvecsub.c b/sys/src/cmd/unix/drawterm/libmp/mpvecsub.c deleted file mode 100644 index db93b65bb..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/mpvecsub.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "os.h" -#include <mp.h> -#include "dat.h" - -// prereq: a >= b, alen >= blen, diff has at least alen digits -void -mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff) -{ - int i, borrow; - mpdigit x, y; - - borrow = 0; - for(i = 0; i < blen; i++){ - x = *a++; - y = *b++; - y += borrow; - if(y < borrow) - borrow = 1; - else - borrow = 0; - if(x < y) - borrow++; - *diff++ = x - y; - } - for(; i < alen; i++){ - x = *a++; - y = x - borrow; - if(y > x) - borrow = 1; - else - borrow = 0; - *diff++ = y; - } -} diff --git a/sys/src/cmd/unix/drawterm/libmp/os.h b/sys/src/cmd/unix/drawterm/libmp/os.h deleted file mode 100644 index dae875d66..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/os.h +++ /dev/null @@ -1,3 +0,0 @@ -#include <u.h> -#include <libc.h> - diff --git a/sys/src/cmd/unix/drawterm/libmp/reduce b/sys/src/cmd/unix/drawterm/libmp/reduce deleted file mode 100644 index a857a28cc..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/reduce +++ /dev/null @@ -1,16 +0,0 @@ -O=$1 -shift -objtype=$1 -shift - -ls -p ../$objtype/*.[cs] >[2]/dev/null | sed 's/..$//' > /tmp/reduce.$pid -# -# if empty directory, just return the input files -# -if (! ~ $status '|') { - echo $* - rm /tmp/reduce.$pid - exit 0 -} -echo $* | tr ' ' \012 | grep -v -f /tmp/reduce.$pid | tr \012 ' ' -rm /tmp/reduce.$pid diff --git a/sys/src/cmd/unix/drawterm/libmp/strtomp.c b/sys/src/cmd/unix/drawterm/libmp/strtomp.c deleted file mode 100644 index bc1de226c..000000000 --- a/sys/src/cmd/unix/drawterm/libmp/strtomp.c +++ /dev/null @@ -1,205 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> -#include "dat.h" - -static struct { - int inited; - - uchar t64[256]; - uchar t32[256]; - uchar t16[256]; - uchar t10[256]; -} tab; - -enum { - INVAL= 255 -}; - -static char set64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -static char set32[] = "23456789abcdefghijkmnpqrstuvwxyz"; -static char set16[] = "0123456789ABCDEF0123456789abcdef"; -static char set10[] = "0123456789"; - -static void -init(void) -{ - char *p; - - memset(tab.t64, INVAL, sizeof(tab.t64)); - memset(tab.t32, INVAL, sizeof(tab.t32)); - memset(tab.t16, INVAL, sizeof(tab.t16)); - memset(tab.t10, INVAL, sizeof(tab.t10)); - - for(p = set64; *p; p++) - tab.t64[(uchar)*p] = p-set64; - for(p = set32; *p; p++) - tab.t32[(uchar)*p] = p-set32; - for(p = set16; *p; p++) - tab.t16[(uchar)*p] = (p-set16)%16; - for(p = set10; *p; p++) - tab.t10[(uchar)*p] = (p-set10); - - tab.inited = 1; -} - -static char* -from16(char *a, mpint *b) -{ - char *p, *next; - int i; - mpdigit x; - - b->top = 0; - for(p = a; *p; p++) - if(tab.t16[(uchar)*p] == INVAL) - break; - mpbits(b, (p-a)*4); - b->top = 0; - next = p; - while(p > a){ - x = 0; - for(i = 0; i < Dbits; i += 4){ - if(p <= a) - break; - x |= tab.t16[(uchar)*--p]<<i; - } - b->p[b->top++] = x; - } - return next; -} - -static ulong mppow10[] = { - 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 -}; - -static char* -from10(char *a, mpint *b) -{ - ulong x, y; - mpint *pow, *r; - int i; - - pow = mpnew(0); - r = mpnew(0); - - b->top = 0; - for(;;){ - // do a billion at a time in native arithmetic - x = 0; - for(i = 0; i < 9; i++){ - y = tab.t10[(uchar)*a]; - if(y == INVAL) - break; - a++; - x *= 10; - x += y; - } - if(i == 0) - break; - - // accumulate into mpint - uitomp(mppow10[i], pow); - uitomp(x, r); - mpmul(b, pow, b); - mpadd(b, r, b); - if(i != 9) - break; - } - mpfree(pow); - mpfree(r); - return a; -} - -static char* -from64(char *a, mpint *b) -{ - char *buf = a; - uchar *p; - int n, m; - - for(; tab.t64[(uchar)*a] != INVAL; a++) - ; - n = a-buf; - mpbits(b, n*6); - p = malloc(n); - if(p == nil) - return a; - m = dec64(p, n, buf, n); - betomp(p, m, b); - free(p); - return a; -} - -static char* -from32(char *a, mpint *b) -{ - char *buf = a; - uchar *p; - int n, m; - - for(; tab.t64[(uchar)*a] != INVAL; a++) - ; - n = a-buf; - mpbits(b, n*5); - p = malloc(n); - if(p == nil) - return a; - m = dec32(p, n, buf, n); - betomp(p, m, b); - free(p); - return a; -} - -mpint* -strtomp(char *a, char **pp, int base, mpint *b) -{ - int sign; - char *e; - - if(b == nil) - b = mpnew(0); - - if(tab.inited == 0) - init(); - - while(*a==' ' || *a=='\t') - a++; - - sign = 1; - for(;; a++){ - switch(*a){ - case '-': - sign *= -1; - continue; - } - break; - } - - switch(base){ - case 10: - e = from10(a, b); - break; - default: - case 16: - e = from16(a, b); - break; - case 32: - e = from32(a, b); - break; - case 64: - e = from64(a, b); - break; - } - - // if no characters parsed, there wasn't a number to convert - if(e == a) - return nil; - - mpnorm(b); - b->sign = sign; - if(pp != nil) - *pp = e; - - return b; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/Makefile b/sys/src/cmd/unix/drawterm/libsec/Makefile deleted file mode 100644 index 0afa2a9a3..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=libsec.a - -OFILES=\ - aes.$O\ - blowfish.$O\ - decodepem.$O\ - des.$O\ - des3CBC.$O\ - des3ECB.$O\ - desCBC.$O\ - desECB.$O\ - desmodes.$O\ - dsaalloc.$O\ - dsagen.$O\ - dsaprimes.$O\ - dsaprivtopub.$O\ - dsasign.$O\ - dsaverify.$O\ - egalloc.$O\ - egdecrypt.$O\ - egencrypt.$O\ - eggen.$O\ - egprivtopub.$O\ - egsign.$O\ - egverify.$O\ - fastrand.$O\ - genprime.$O\ - genrandom.$O\ - gensafeprime.$O\ - genstrongprime.$O\ - hmac.$O\ - md4.$O\ - md5.$O\ - md5pickle.$O\ - nfastrand.$O\ - prng.$O\ - probably_prime.$O\ - rc4.$O\ - rsaalloc.$O\ - rsadecrypt.$O\ - rsaencrypt.$O\ - rsafill.$O\ - rsagen.$O\ - rsaprivtopub.$O\ - sha1.$O\ - sha1pickle.$O\ - smallprimes.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - diff --git a/sys/src/cmd/unix/drawterm/libsec/aes.c b/sys/src/cmd/unix/drawterm/libsec/aes.c deleted file mode 100644 index 02aeaaed7..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/aes.c +++ /dev/null @@ -1,1549 +0,0 @@ -/* - * this code is derived from the following source, - * and modified to fit into the plan 9 libsec interface. - * most of the changes are confined to the top section, - * with the exception of converting Te4 and Td4 into u8 rather than u32 arrays. - * - * rijndael-alg-fst.c - * - * @version 3.0 (December 2000) - * - * Optimised ANSI C code for the Rijndael cipher (now AES) - * - * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> - * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> - * @author Paulo Barreto <paulo.barreto@terra.com.br> - * - * This code is hereby placed in the public domain. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -typedef uchar u8; -typedef u32int u32; -#define FULL_UNROLL - -static const u32 Td0[256]; -static const u32 Td1[256]; -static const u32 Td2[256]; -static const u32 Td3[256]; -static const u8 Te4[256]; - -static int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); - -#ifdef NOT -static int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); -#endif -static int rijndaelKeySetup(u32 erk[/*4*(Nr + 1)*/], u32 drk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); -static void rijndaelEncrypt(const u32int rk[], int Nr, const uchar pt[16], uchar ct[16]); -static void rijndaelDecrypt(const u32int rk[], int Nr, const uchar ct[16], uchar pt[16]); - -void -setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec) -{ - memset(s, 0, sizeof(*s)); - if(keybytes > AESmaxkey) - keybytes = AESmaxkey; - memmove(s->key, key, keybytes); - s->keybytes = keybytes; - s->rounds = rijndaelKeySetup(s->ekey, s->dkey, s->key, keybytes * 8); - if(ivec != nil) - memmove(s->ivec, ivec, AESbsize); - if(keybytes==16 || keybytes==24 || keybytes==32) - s->setup = 0xcafebabe; - // else rijndaelKeySetup was invalid -} - -// Define by analogy with desCBCencrypt; AES modes are not standardized yet. -// Because of the way that non-multiple-of-16 buffers are handled, -// the decryptor must be fed buffers of the same size as the encryptor. -void -aesCBCencrypt(uchar *p, int len, AESstate *s) -{ - uchar *p2, *ip, *eip; - uchar q[AESbsize]; - - for(; len >= AESbsize; len -= AESbsize){ - p2 = p; - ip = s->ivec; - for(eip = ip+AESbsize; ip < eip; ) - *p2++ ^= *ip++; - rijndaelEncrypt(s->ekey, s->rounds, p, q); - memmove(s->ivec, q, AESbsize); - memmove(p, q, AESbsize); - p += AESbsize; - } - - if(len > 0){ - ip = s->ivec; - rijndaelEncrypt(s->ekey, s->rounds, ip, q); - memmove(s->ivec, q, AESbsize); - for(eip = ip+len; ip < eip; ) - *p++ ^= *ip++; - } -} - -void -aesCBCdecrypt(uchar *p, int len, AESstate *s) -{ - uchar *ip, *eip, *tp; - uchar tmp[AESbsize], q[AESbsize]; - - for(; len >= AESbsize; len -= AESbsize){ - memmove(tmp, p, AESbsize); - rijndaelDecrypt(s->dkey, s->rounds, p, q); - memmove(p, q, AESbsize); - tp = tmp; - ip = s->ivec; - for(eip = ip+AESbsize; ip < eip; ){ - *p++ ^= *ip; - *ip++ = *tp++; - } - } - - if(len > 0){ - ip = s->ivec; - rijndaelEncrypt(s->ekey, s->rounds, ip, q); - memmove(s->ivec, q, AESbsize); - for(eip = ip+len; ip < eip; ) - *p++ ^= *ip++; - } -} - -/* - * this function has been changed for plan 9. - * Expand the cipher key into the encryption and decryption key schedules. - * - * @return the number of rounds for the given cipher key size. - */ -static int rijndaelKeySetup(u32 erk[/*4*(Nr + 1)*/], u32 drk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { - int Nr, i; - - /* expand the cipher key: */ - Nr = rijndaelKeySetupEnc(erk, cipherKey, keyBits); - - /* - * invert the order of the round keys and - * apply the inverse MixColumn transform to all round keys but the first and the last - */ - drk[0 ] = erk[4*Nr ]; - drk[1 ] = erk[4*Nr + 1]; - drk[2 ] = erk[4*Nr + 2]; - drk[3 ] = erk[4*Nr + 3]; - drk[4*Nr ] = erk[0 ]; - drk[4*Nr + 1] = erk[1 ]; - drk[4*Nr + 2] = erk[2 ]; - drk[4*Nr + 3] = erk[3 ]; - erk += 4 * Nr; - for (i = 1; i < Nr; i++) { - drk += 4; - erk -= 4; - drk[0] = - Td0[Te4[(erk[0] >> 24) ]] ^ - Td1[Te4[(erk[0] >> 16) & 0xff]] ^ - Td2[Te4[(erk[0] >> 8) & 0xff]] ^ - Td3[Te4[(erk[0] ) & 0xff]]; - drk[1] = - Td0[Te4[(erk[1] >> 24) ]] ^ - Td1[Te4[(erk[1] >> 16) & 0xff]] ^ - Td2[Te4[(erk[1] >> 8) & 0xff]] ^ - Td3[Te4[(erk[1] ) & 0xff]]; - drk[2] = - Td0[Te4[(erk[2] >> 24) ]] ^ - Td1[Te4[(erk[2] >> 16) & 0xff]] ^ - Td2[Te4[(erk[2] >> 8) & 0xff]] ^ - Td3[Te4[(erk[2] ) & 0xff]]; - drk[3] = - Td0[Te4[(erk[3] >> 24) ]] ^ - Td1[Te4[(erk[3] >> 16) & 0xff]] ^ - Td2[Te4[(erk[3] >> 8) & 0xff]] ^ - Td3[Te4[(erk[3] ) & 0xff]]; - } - return Nr; -} - -/* -Te0[x] = S [x].[02, 01, 01, 03]; -Te1[x] = S [x].[03, 02, 01, 01]; -Te2[x] = S [x].[01, 03, 02, 01]; -Te3[x] = S [x].[01, 01, 03, 02]; -Te4[x] = S [x] - -Td0[x] = Si[x].[0e, 09, 0d, 0b]; -Td1[x] = Si[x].[0b, 0e, 09, 0d]; -Td2[x] = Si[x].[0d, 0b, 0e, 09]; -Td3[x] = Si[x].[09, 0d, 0b, 0e]; -Td4[x] = Si[x] -*/ - -static const u32 Te0[256] = { - 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, - 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, - 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, - 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, - 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, - 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, - 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, - 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, - 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, - 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, - 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, - 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, - 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, - 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, - 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, - 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, - 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, - 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, - 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, - 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, - 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, - 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, - 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, - 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, - 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, - 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, - 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, - 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, - 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, - 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, - 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, - 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, - 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, - 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, - 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, - 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, - 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, - 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, - 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, - 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, - 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, - 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, - 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, - 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, - 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, - 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, - 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, - 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, - 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, - 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, - 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, - 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, - 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, - 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, - 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, - 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, - 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, - 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, - 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, - 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, - 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, - 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, - 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, - 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, -}; -static const u32 Te1[256] = { - 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, - 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, - 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, - 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, - 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, - 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, - 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, - 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, - 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, - 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, - 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, - 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, - 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, - 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, - 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, - 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, - 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, - 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, - 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, - 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, - 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, - 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, - 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, - 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, - 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, - 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, - 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, - 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, - 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, - 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, - 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, - 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, - 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, - 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, - 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, - 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, - 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, - 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, - 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, - 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, - 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, - 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, - 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, - 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, - 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, - 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, - 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, - 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, - 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, - 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, - 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, - 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, - 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, - 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, - 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, - 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, - 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, - 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, - 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, - 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, - 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, - 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, - 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, - 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, -}; -static const u32 Te2[256] = { - 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, - 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, - 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, - 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, - 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, - 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, - 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, - 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, - 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, - 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, - 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, - 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, - 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, - 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, - 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, - 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, - 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, - 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, - 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, - 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, - 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, - 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, - 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, - 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, - 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, - 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, - 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, - 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, - 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, - 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, - 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, - 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, - 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, - 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, - 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, - 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, - 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, - 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, - 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, - 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, - 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, - 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, - 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, - 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, - 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, - 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, - 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, - 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, - 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, - 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, - 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, - 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, - 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, - 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, - 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, - 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, - 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, - 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, - 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, - 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, - 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, - 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, - 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, - 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, -}; -static const u32 Te3[256] = { - - 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, - 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, - 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, - 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, - 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, - 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, - 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, - 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, - 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, - 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, - 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, - 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, - 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, - 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, - 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, - 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, - 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, - 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, - 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, - 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, - 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, - 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, - 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, - 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, - 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, - 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, - 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, - 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, - 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, - 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, - 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, - 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, - 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, - 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, - 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, - 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, - 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, - 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, - 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, - 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, - 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, - 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, - 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, - 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, - 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, - 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, - 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, - 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, - 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, - 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, - 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, - 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, - 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, - 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, - 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, - 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, - 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, - 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, - 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, - 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, - 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, - 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, - 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, - 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, -}; -static const u8 Te4[256] = { - 0x63U, 0x7cU, 0x77U, 0x7bU, - 0xf2U, 0x6bU, 0x6fU, 0xc5U, - 0x30U, 0x01U, 0x67U, 0x2bU, - 0xfeU, 0xd7U, 0xabU, 0x76U, - 0xcaU, 0x82U, 0xc9U, 0x7dU, - 0xfaU, 0x59U, 0x47U, 0xf0U, - 0xadU, 0xd4U, 0xa2U, 0xafU, - 0x9cU, 0xa4U, 0x72U, 0xc0U, - 0xb7U, 0xfdU, 0x93U, 0x26U, - 0x36U, 0x3fU, 0xf7U, 0xccU, - 0x34U, 0xa5U, 0xe5U, 0xf1U, - 0x71U, 0xd8U, 0x31U, 0x15U, - 0x04U, 0xc7U, 0x23U, 0xc3U, - 0x18U, 0x96U, 0x05U, 0x9aU, - 0x07U, 0x12U, 0x80U, 0xe2U, - 0xebU, 0x27U, 0xb2U, 0x75U, - 0x09U, 0x83U, 0x2cU, 0x1aU, - 0x1bU, 0x6eU, 0x5aU, 0xa0U, - 0x52U, 0x3bU, 0xd6U, 0xb3U, - 0x29U, 0xe3U, 0x2fU, 0x84U, - 0x53U, 0xd1U, 0x00U, 0xedU, - 0x20U, 0xfcU, 0xb1U, 0x5bU, - 0x6aU, 0xcbU, 0xbeU, 0x39U, - 0x4aU, 0x4cU, 0x58U, 0xcfU, - 0xd0U, 0xefU, 0xaaU, 0xfbU, - 0x43U, 0x4dU, 0x33U, 0x85U, - 0x45U, 0xf9U, 0x02U, 0x7fU, - 0x50U, 0x3cU, 0x9fU, 0xa8U, - 0x51U, 0xa3U, 0x40U, 0x8fU, - 0x92U, 0x9dU, 0x38U, 0xf5U, - 0xbcU, 0xb6U, 0xdaU, 0x21U, - 0x10U, 0xffU, 0xf3U, 0xd2U, - 0xcdU, 0x0cU, 0x13U, 0xecU, - 0x5fU, 0x97U, 0x44U, 0x17U, - 0xc4U, 0xa7U, 0x7eU, 0x3dU, - 0x64U, 0x5dU, 0x19U, 0x73U, - 0x60U, 0x81U, 0x4fU, 0xdcU, - 0x22U, 0x2aU, 0x90U, 0x88U, - 0x46U, 0xeeU, 0xb8U, 0x14U, - 0xdeU, 0x5eU, 0x0bU, 0xdbU, - 0xe0U, 0x32U, 0x3aU, 0x0aU, - 0x49U, 0x06U, 0x24U, 0x5cU, - 0xc2U, 0xd3U, 0xacU, 0x62U, - 0x91U, 0x95U, 0xe4U, 0x79U, - 0xe7U, 0xc8U, 0x37U, 0x6dU, - 0x8dU, 0xd5U, 0x4eU, 0xa9U, - 0x6cU, 0x56U, 0xf4U, 0xeaU, - 0x65U, 0x7aU, 0xaeU, 0x08U, - 0xbaU, 0x78U, 0x25U, 0x2eU, - 0x1cU, 0xa6U, 0xb4U, 0xc6U, - 0xe8U, 0xddU, 0x74U, 0x1fU, - 0x4bU, 0xbdU, 0x8bU, 0x8aU, - 0x70U, 0x3eU, 0xb5U, 0x66U, - 0x48U, 0x03U, 0xf6U, 0x0eU, - 0x61U, 0x35U, 0x57U, 0xb9U, - 0x86U, 0xc1U, 0x1dU, 0x9eU, - 0xe1U, 0xf8U, 0x98U, 0x11U, - 0x69U, 0xd9U, 0x8eU, 0x94U, - 0x9bU, 0x1eU, 0x87U, 0xe9U, - 0xceU, 0x55U, 0x28U, 0xdfU, - 0x8cU, 0xa1U, 0x89U, 0x0dU, - 0xbfU, 0xe6U, 0x42U, 0x68U, - 0x41U, 0x99U, 0x2dU, 0x0fU, - 0xb0U, 0x54U, 0xbbU, 0x16U, -}; -static const u32 Td0[256] = { - 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, - 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, - 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, - 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, - 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, - 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, - 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, - 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, - 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, - 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, - 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, - 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, - 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, - 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, - 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, - 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, - 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, - 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, - 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, - 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, - 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, - 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, - 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, - 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, - 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, - 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, - 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, - 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, - 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, - 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, - 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, - 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, - 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, - 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, - 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, - 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, - 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, - 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, - 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, - 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, - 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, - 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, - 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, - 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, - 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, - 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, - 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, - 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, - 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, - 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, - 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, - 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, - 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, - 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, - 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, - 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, - 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, - 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, - 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, - 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, - 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, - 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, - 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, - 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, -}; -static const u32 Td1[256] = { - 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, - 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, - 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, - 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, - 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, - 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, - 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, - 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, - 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, - 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, - 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, - 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, - 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, - 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, - 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, - 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, - 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, - 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, - 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, - 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, - 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, - 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, - 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, - 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, - 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, - 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, - 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, - 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, - 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, - 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, - 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, - 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, - 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, - 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, - 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, - 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, - 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, - 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, - 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, - 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, - 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, - 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, - 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, - 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, - 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, - 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, - 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, - 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, - 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, - 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, - 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, - 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, - 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, - 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, - 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, - 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, - 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, - 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, - 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, - 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, - 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, - 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, - 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, - 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, -}; -static const u32 Td2[256] = { - 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, - 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, - 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, - 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, - 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, - 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, - 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, - 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, - 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, - 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, - 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, - 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, - 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, - 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, - 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, - 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, - 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, - 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, - 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, - 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, - - 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, - 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, - 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, - 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, - 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, - 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, - 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, - 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, - 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, - 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, - 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, - 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, - 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, - 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, - 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, - 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, - 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, - 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, - 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, - 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, - 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, - 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, - 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, - 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, - 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, - 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, - 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, - 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, - 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, - 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, - 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, - 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, - 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, - 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, - 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, - 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, - 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, - 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, - 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, - 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, - 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, - 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, - 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, - 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, -}; -static const u32 Td3[256] = { - 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, - 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, - 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, - 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, - 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, - 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, - 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, - 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, - 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, - 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, - 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, - 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, - 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, - 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, - 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, - 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, - 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, - 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, - 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, - 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, - 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, - 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, - 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, - 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, - 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, - 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, - 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, - 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, - 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, - 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, - 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, - 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, - 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, - 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, - 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, - 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, - 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, - 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, - 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, - 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, - 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, - 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, - 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, - 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, - 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, - 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, - 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, - 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, - 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, - 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, - 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, - 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, - 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, - 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, - 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, - 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, - 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, - 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, - 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, - 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, - 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, - 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, - 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, - 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, -}; -static const u8 Td4[256] = { - 0x52U, 0x09U, 0x6aU, 0xd5U, - 0x30U, 0x36U, 0xa5U, 0x38U, - 0xbfU, 0x40U, 0xa3U, 0x9eU, - 0x81U, 0xf3U, 0xd7U, 0xfbU, - 0x7cU, 0xe3U, 0x39U, 0x82U, - 0x9bU, 0x2fU, 0xffU, 0x87U, - 0x34U, 0x8eU, 0x43U, 0x44U, - 0xc4U, 0xdeU, 0xe9U, 0xcbU, - 0x54U, 0x7bU, 0x94U, 0x32U, - 0xa6U, 0xc2U, 0x23U, 0x3dU, - 0xeeU, 0x4cU, 0x95U, 0x0bU, - 0x42U, 0xfaU, 0xc3U, 0x4eU, - 0x08U, 0x2eU, 0xa1U, 0x66U, - 0x28U, 0xd9U, 0x24U, 0xb2U, - 0x76U, 0x5bU, 0xa2U, 0x49U, - 0x6dU, 0x8bU, 0xd1U, 0x25U, - 0x72U, 0xf8U, 0xf6U, 0x64U, - 0x86U, 0x68U, 0x98U, 0x16U, - 0xd4U, 0xa4U, 0x5cU, 0xccU, - 0x5dU, 0x65U, 0xb6U, 0x92U, - 0x6cU, 0x70U, 0x48U, 0x50U, - 0xfdU, 0xedU, 0xb9U, 0xdaU, - 0x5eU, 0x15U, 0x46U, 0x57U, - 0xa7U, 0x8dU, 0x9dU, 0x84U, - 0x90U, 0xd8U, 0xabU, 0x00U, - 0x8cU, 0xbcU, 0xd3U, 0x0aU, - 0xf7U, 0xe4U, 0x58U, 0x05U, - 0xb8U, 0xb3U, 0x45U, 0x06U, - 0xd0U, 0x2cU, 0x1eU, 0x8fU, - 0xcaU, 0x3fU, 0x0fU, 0x02U, - 0xc1U, 0xafU, 0xbdU, 0x03U, - 0x01U, 0x13U, 0x8aU, 0x6bU, - 0x3aU, 0x91U, 0x11U, 0x41U, - 0x4fU, 0x67U, 0xdcU, 0xeaU, - 0x97U, 0xf2U, 0xcfU, 0xceU, - 0xf0U, 0xb4U, 0xe6U, 0x73U, - 0x96U, 0xacU, 0x74U, 0x22U, - 0xe7U, 0xadU, 0x35U, 0x85U, - 0xe2U, 0xf9U, 0x37U, 0xe8U, - 0x1cU, 0x75U, 0xdfU, 0x6eU, - 0x47U, 0xf1U, 0x1aU, 0x71U, - 0x1dU, 0x29U, 0xc5U, 0x89U, - 0x6fU, 0xb7U, 0x62U, 0x0eU, - 0xaaU, 0x18U, 0xbeU, 0x1bU, - 0xfcU, 0x56U, 0x3eU, 0x4bU, - 0xc6U, 0xd2U, 0x79U, 0x20U, - 0x9aU, 0xdbU, 0xc0U, 0xfeU, - 0x78U, 0xcdU, 0x5aU, 0xf4U, - 0x1fU, 0xddU, 0xa8U, 0x33U, - 0x88U, 0x07U, 0xc7U, 0x31U, - 0xb1U, 0x12U, 0x10U, 0x59U, - 0x27U, 0x80U, 0xecU, 0x5fU, - 0x60U, 0x51U, 0x7fU, 0xa9U, - 0x19U, 0xb5U, 0x4aU, 0x0dU, - 0x2dU, 0xe5U, 0x7aU, 0x9fU, - 0x93U, 0xc9U, 0x9cU, 0xefU, - 0xa0U, 0xe0U, 0x3bU, 0x4dU, - 0xaeU, 0x2aU, 0xf5U, 0xb0U, - 0xc8U, 0xebU, 0xbbU, 0x3cU, - 0x83U, 0x53U, 0x99U, 0x61U, - 0x17U, 0x2bU, 0x04U, 0x7eU, - 0xbaU, 0x77U, 0xd6U, 0x26U, - 0xe1U, 0x69U, 0x14U, 0x63U, - 0x55U, 0x21U, 0x0cU, 0x7dU, -}; -static const u32 rcon[] = { - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ -}; - -#define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) - -#ifdef _MSC_VER -#define GETU32(p) SWAP(*((u32 *)(p))) -#define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } -#else -#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) -#define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } -#endif - -/** - * Expand the cipher key into the encryption key schedule. - * - * @return the number of rounds for the given cipher key size. - */ -static int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { - int i = 0; - u32 temp; - - rk[0] = GETU32(cipherKey ); - rk[1] = GETU32(cipherKey + 4); - rk[2] = GETU32(cipherKey + 8); - rk[3] = GETU32(cipherKey + 12); - if (keyBits == 128) { - for (;;) { - temp = rk[3]; - rk[4] = rk[0] ^ - (Te4[(temp >> 16) & 0xff] << 24) ^ - (Te4[(temp >> 8) & 0xff] << 16) ^ - (Te4[(temp ) & 0xff] << 8) ^ - (Te4[(temp >> 24) ] ) ^ - rcon[i]; - rk[5] = rk[1] ^ rk[4]; - rk[6] = rk[2] ^ rk[5]; - rk[7] = rk[3] ^ rk[6]; - if (++i == 10) { - return 10; - } - rk += 4; - } - } - rk[4] = GETU32(cipherKey + 16); - rk[5] = GETU32(cipherKey + 20); - if (keyBits == 192) { - for (;;) { - temp = rk[ 5]; - rk[ 6] = rk[ 0] ^ - (Te4[(temp >> 16) & 0xff] << 24) ^ - (Te4[(temp >> 8) & 0xff] << 16) ^ - (Te4[(temp ) & 0xff] << 8) ^ - (Te4[(temp >> 24) ] ) ^ - rcon[i]; - rk[ 7] = rk[ 1] ^ rk[ 6]; - rk[ 8] = rk[ 2] ^ rk[ 7]; - rk[ 9] = rk[ 3] ^ rk[ 8]; - if (++i == 8) { - return 12; - } - rk[10] = rk[ 4] ^ rk[ 9]; - rk[11] = rk[ 5] ^ rk[10]; - rk += 6; - } - } - rk[6] = GETU32(cipherKey + 24); - rk[7] = GETU32(cipherKey + 28); - if (keyBits == 256) { - for (;;) { - temp = rk[ 7]; - rk[ 8] = rk[ 0] ^ - (Te4[(temp >> 16) & 0xff] << 24) ^ - (Te4[(temp >> 8) & 0xff] << 16) ^ - (Te4[(temp ) & 0xff] << 8) ^ - (Te4[(temp >> 24) ] ) ^ - rcon[i]; - rk[ 9] = rk[ 1] ^ rk[ 8]; - rk[10] = rk[ 2] ^ rk[ 9]; - rk[11] = rk[ 3] ^ rk[10]; - if (++i == 7) { - return 14; - } - temp = rk[11]; - rk[12] = rk[ 4] ^ - (Te4[(temp >> 24) ] << 24) ^ - (Te4[(temp >> 16) & 0xff] << 16) ^ - (Te4[(temp >> 8) & 0xff] << 8) ^ - (Te4[(temp ) & 0xff] ); - rk[13] = rk[ 5] ^ rk[12]; - rk[14] = rk[ 6] ^ rk[13]; - rk[15] = rk[ 7] ^ rk[14]; - - rk += 8; - } - } - return 0; -} - -/** - * Expand the cipher key into the decryption key schedule. - * - * @return the number of rounds for the given cipher key size. - */ -#ifdef NOTUSED -static int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { - int Nr, i, j; - u32 temp; - - /* expand the cipher key: */ - Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); - /* invert the order of the round keys: */ - for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { - temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; - temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; - temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; - temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; - } - /* apply the inverse MixColumn transform to all round keys but the first and the last: */ - for (i = 1; i < Nr; i++) { - rk += 4; - rk[0] = - Td0[Te4[(rk[0] >> 24) ]] ^ - Td1[Te4[(rk[0] >> 16) & 0xff]] ^ - Td2[Te4[(rk[0] >> 8) & 0xff]] ^ - Td3[Te4[(rk[0] ) & 0xff]]; - rk[1] = - Td0[Te4[(rk[1] >> 24) ]] ^ - Td1[Te4[(rk[1] >> 16) & 0xff]] ^ - Td2[Te4[(rk[1] >> 8) & 0xff]] ^ - Td3[Te4[(rk[1] ) & 0xff]]; - rk[2] = - Td0[Te4[(rk[2] >> 24) ]] ^ - Td1[Te4[(rk[2] >> 16) & 0xff]] ^ - Td2[Te4[(rk[2] >> 8) & 0xff]] ^ - Td3[Te4[(rk[2] ) & 0xff]]; - rk[3] = - Td0[Te4[(rk[3] >> 24) ]] ^ - Td1[Te4[(rk[3] >> 16) & 0xff]] ^ - Td2[Te4[(rk[3] >> 8) & 0xff]] ^ - Td3[Te4[(rk[3] ) & 0xff]]; - } - return Nr; -} -#endif - -static void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) { - u32 s0, s1, s2, s3, t0, t1, t2, t3; -#ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(pt ) ^ rk[0]; - s1 = GETU32(pt + 4) ^ rk[1]; - s2 = GETU32(pt + 8) ^ rk[2]; - s3 = GETU32(pt + 12) ^ rk[3]; -#ifdef FULL_UNROLL - /* round 1: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; - /* round 2: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; - if (Nr > 10) { - /* round 10: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; - if (Nr > 12) { - /* round 12: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; - } - } - rk += Nr << 2; -#else /* !FULL_UNROLL */ - /* - * Nr - 1 full rounds: - */ - r = Nr >> 1; - for (;;) { - t0 = - Te0[(s0 >> 24) ] ^ - Te1[(s1 >> 16) & 0xff] ^ - Te2[(s2 >> 8) & 0xff] ^ - Te3[(s3 ) & 0xff] ^ - rk[4]; - t1 = - Te0[(s1 >> 24) ] ^ - Te1[(s2 >> 16) & 0xff] ^ - Te2[(s3 >> 8) & 0xff] ^ - Te3[(s0 ) & 0xff] ^ - rk[5]; - t2 = - Te0[(s2 >> 24) ] ^ - Te1[(s3 >> 16) & 0xff] ^ - Te2[(s0 >> 8) & 0xff] ^ - Te3[(s1 ) & 0xff] ^ - rk[6]; - t3 = - Te0[(s3 >> 24) ] ^ - Te1[(s0 >> 16) & 0xff] ^ - Te2[(s1 >> 8) & 0xff] ^ - Te3[(s2 ) & 0xff] ^ - rk[7]; - - rk += 8; - if (--r == 0) { - break; - } - - s0 = - Te0[(t0 >> 24) ] ^ - Te1[(t1 >> 16) & 0xff] ^ - Te2[(t2 >> 8) & 0xff] ^ - Te3[(t3 ) & 0xff] ^ - rk[0]; - s1 = - Te0[(t1 >> 24) ] ^ - Te1[(t2 >> 16) & 0xff] ^ - Te2[(t3 >> 8) & 0xff] ^ - Te3[(t0 ) & 0xff] ^ - rk[1]; - s2 = - Te0[(t2 >> 24) ] ^ - Te1[(t3 >> 16) & 0xff] ^ - Te2[(t0 >> 8) & 0xff] ^ - Te3[(t1 ) & 0xff] ^ - rk[2]; - s3 = - Te0[(t3 >> 24) ] ^ - Te1[(t0 >> 16) & 0xff] ^ - Te2[(t1 >> 8) & 0xff] ^ - Te3[(t2 ) & 0xff] ^ - rk[3]; - } -#endif /* ?FULL_UNROLL */ - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = - (Te4[(t0 >> 24) ] << 24) ^ - (Te4[(t1 >> 16) & 0xff] << 16) ^ - (Te4[(t2 >> 8) & 0xff] << 8) ^ - (Te4[(t3 ) & 0xff] ) ^ - rk[0]; - PUTU32(ct , s0); - s1 = - (Te4[(t1 >> 24) ] << 24) ^ - (Te4[(t2 >> 16) & 0xff] << 16) ^ - (Te4[(t3 >> 8) & 0xff] << 8) ^ - (Te4[(t0 ) & 0xff] ) ^ - rk[1]; - PUTU32(ct + 4, s1); - s2 = - (Te4[(t2 >> 24) ] << 24) ^ - (Te4[(t3 >> 16) & 0xff] << 16) ^ - (Te4[(t0 >> 8) & 0xff] << 8) ^ - (Te4[(t1 ) & 0xff] ) ^ - rk[2]; - PUTU32(ct + 8, s2); - s3 = - (Te4[(t3 >> 24) ] << 24) ^ - (Te4[(t0 >> 16) & 0xff] << 16) ^ - (Te4[(t1 >> 8) & 0xff] << 8) ^ - (Te4[(t2 ) & 0xff] ) ^ - rk[3]; - PUTU32(ct + 12, s3); -} - -static void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { - u32 s0, s1, s2, s3, t0, t1, t2, t3; -#ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(ct ) ^ rk[0]; - s1 = GETU32(ct + 4) ^ rk[1]; - s2 = GETU32(ct + 8) ^ rk[2]; - s3 = GETU32(ct + 12) ^ rk[3]; -#ifdef FULL_UNROLL - /* round 1: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; - /* round 2: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; - if (Nr > 10) { - /* round 10: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; - if (Nr > 12) { - /* round 12: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; - } - } - rk += Nr << 2; -#else /* !FULL_UNROLL */ - /* - * Nr - 1 full rounds: - */ - r = Nr >> 1; - for (;;) { - t0 = - Td0[(s0 >> 24) ] ^ - Td1[(s3 >> 16) & 0xff] ^ - Td2[(s2 >> 8) & 0xff] ^ - Td3[(s1 ) & 0xff] ^ - rk[4]; - t1 = - Td0[(s1 >> 24) ] ^ - Td1[(s0 >> 16) & 0xff] ^ - Td2[(s3 >> 8) & 0xff] ^ - Td3[(s2 ) & 0xff] ^ - rk[5]; - t2 = - Td0[(s2 >> 24) ] ^ - Td1[(s1 >> 16) & 0xff] ^ - Td2[(s0 >> 8) & 0xff] ^ - Td3[(s3 ) & 0xff] ^ - rk[6]; - t3 = - Td0[(s3 >> 24) ] ^ - Td1[(s2 >> 16) & 0xff] ^ - Td2[(s1 >> 8) & 0xff] ^ - Td3[(s0 ) & 0xff] ^ - rk[7]; - - rk += 8; - if (--r == 0) { - break; - } - - s0 = - Td0[(t0 >> 24) ] ^ - Td1[(t3 >> 16) & 0xff] ^ - Td2[(t2 >> 8) & 0xff] ^ - Td3[(t1 ) & 0xff] ^ - rk[0]; - s1 = - Td0[(t1 >> 24) ] ^ - Td1[(t0 >> 16) & 0xff] ^ - Td2[(t3 >> 8) & 0xff] ^ - Td3[(t2 ) & 0xff] ^ - rk[1]; - s2 = - Td0[(t2 >> 24) ] ^ - Td1[(t1 >> 16) & 0xff] ^ - Td2[(t0 >> 8) & 0xff] ^ - Td3[(t3 ) & 0xff] ^ - rk[2]; - s3 = - Td0[(t3 >> 24) ] ^ - Td1[(t2 >> 16) & 0xff] ^ - Td2[(t1 >> 8) & 0xff] ^ - Td3[(t0 ) & 0xff] ^ - rk[3]; - } -#endif /* ?FULL_UNROLL */ - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = - (Td4[(t0 >> 24) ] << 24) ^ - (Td4[(t3 >> 16) & 0xff] << 16) ^ - (Td4[(t2 >> 8) & 0xff] << 8) ^ - (Td4[(t1 ) & 0xff] ) ^ - rk[0]; - PUTU32(pt , s0); - s1 = - (Td4[(t1 >> 24) ] << 24) ^ - (Td4[(t0 >> 16) & 0xff] << 16) ^ - (Td4[(t3 >> 8) & 0xff] << 8) ^ - (Td4[(t2 ) & 0xff] ) ^ - rk[1]; - PUTU32(pt + 4, s1); - s2 = - (Td4[(t2 >> 24) ] << 24) ^ - (Td4[(t1 >> 16) & 0xff] << 16) ^ - (Td4[(t0 >> 8) & 0xff] << 8) ^ - (Td4[(t3 ) & 0xff] ) ^ - rk[2]; - PUTU32(pt + 8, s2); - s3 = - (Td4[(t3 >> 24) ] << 24) ^ - (Td4[(t2 >> 16) & 0xff] << 16) ^ - (Td4[(t1 >> 8) & 0xff] << 8) ^ - (Td4[(t0 ) & 0xff] ) ^ - rk[3]; - PUTU32(pt + 12, s3); -} - -#ifdef INTERMEDIATE_VALUE_KAT - -static void rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { - int r; - u32 s0, s1, s2, s3, t0, t1, t2, t3; - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(block ) ^ rk[0]; - s1 = GETU32(block + 4) ^ rk[1]; - s2 = GETU32(block + 8) ^ rk[2]; - s3 = GETU32(block + 12) ^ rk[3]; - rk += 4; - - /* - * Nr - 1 full rounds: - */ - for (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) { - t0 = - Te0[(s0 >> 24) ] ^ - Te1[(s1 >> 16) & 0xff] ^ - Te2[(s2 >> 8) & 0xff] ^ - Te3[(s3 ) & 0xff] ^ - rk[0]; - t1 = - Te0[(s1 >> 24) ] ^ - Te1[(s2 >> 16) & 0xff] ^ - Te2[(s3 >> 8) & 0xff] ^ - Te3[(s0 ) & 0xff] ^ - rk[1]; - t2 = - Te0[(s2 >> 24) ] ^ - Te1[(s3 >> 16) & 0xff] ^ - Te2[(s0 >> 8) & 0xff] ^ - Te3[(s1 ) & 0xff] ^ - rk[2]; - t3 = - Te0[(s3 >> 24) ] ^ - Te1[(s0 >> 16) & 0xff] ^ - Te2[(s1 >> 8) & 0xff] ^ - Te3[(s2 ) & 0xff] ^ - rk[3]; - - s0 = t0; - s1 = t1; - s2 = t2; - s3 = t3; - rk += 4; - - } - - /* - * apply last round and - * map cipher state to byte array block: - */ - if (rounds == Nr) { - t0 = - (Te4[(s0 >> 24) ] << 24) ^ - (Te4[(s1 >> 16) & 0xff] << 16) ^ - (Te4[(s2 >> 8) & 0xff] << 8) ^ - (Te4[(s3 ) & 0xff] ) ^ - rk[0]; - t1 = - (Te4[(s1 >> 24) ] << 24) ^ - (Te4[(s2 >> 16) & 0xff] << 16) ^ - (Te4[(s3 >> 8) & 0xff] << 8) ^ - (Te4[(s0 ) & 0xff] ) ^ - rk[1]; - t2 = - (Te4[(s2 >> 24) ] << 24) ^ - (Te4[(s3 >> 16) & 0xff] << 16) ^ - (Te4[(s0 >> 8) & 0xff] << 8) ^ - (Te4[(s1 ) & 0xff] ) ^ - rk[2]; - t3 = - (Te4[(s3 >> 24) ] << 24) ^ - (Te4[(s0 >> 16) & 0xff] << 16) ^ - (Te4[(s1 >> 8) & 0xff] << 8) ^ - (Te4[(s2 ) & 0xff] ) ^ - rk[3]; - - s0 = t0; - s1 = t1; - s2 = t2; - s3 = t3; - } - - PUTU32(block , s0); - PUTU32(block + 4, s1); - PUTU32(block + 8, s2); - PUTU32(block + 12, s3); -} - -static void rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { - int r; - u32 s0, s1, s2, s3, t0, t1, t2, t3; - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(block ) ^ rk[0]; - s1 = GETU32(block + 4) ^ rk[1]; - s2 = GETU32(block + 8) ^ rk[2]; - s3 = GETU32(block + 12) ^ rk[3]; - rk += 4; - - /* - * Nr - 1 full rounds: - */ - for (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) { - t0 = - Td0[(s0 >> 24) ] ^ - Td1[(s3 >> 16) & 0xff] ^ - Td2[(s2 >> 8) & 0xff] ^ - Td3[(s1 ) & 0xff] ^ - rk[0]; - t1 = - Td0[(s1 >> 24) ] ^ - Td1[(s0 >> 16) & 0xff] ^ - Td2[(s3 >> 8) & 0xff] ^ - Td3[(s2 ) & 0xff] ^ - rk[1]; - t2 = - Td0[(s2 >> 24) ] ^ - Td1[(s1 >> 16) & 0xff] ^ - Td2[(s0 >> 8) & 0xff] ^ - Td3[(s3 ) & 0xff] ^ - rk[2]; - t3 = - Td0[(s3 >> 24) ] ^ - Td1[(s2 >> 16) & 0xff] ^ - Td2[(s1 >> 8) & 0xff] ^ - Td3[(s0 ) & 0xff] ^ - rk[3]; - - s0 = t0; - s1 = t1; - s2 = t2; - s3 = t3; - rk += 4; - - } - - /* - * complete the last round and - * map cipher state to byte array block: - */ - t0 = - (Td4[(s0 >> 24) ] << 24) ^ - (Td4[(s3 >> 16) & 0xff] << 16) ^ - (Td4[(s2 >> 8) & 0xff] << 8) ^ - (Td4[(s1 ) & 0xff] ); - t1 = - (Td4[(s1 >> 24) ] << 24) ^ - (Td4[(s0 >> 16) & 0xff] << 16) ^ - (Td4[(s3 >> 8) & 0xff] << 8) ^ - (Td4[(s2 ) & 0xff] ); - t2 = - (Td4[(s2 >> 24) ] << 24) ^ - (Td4[(s1 >> 16) & 0xff] << 16) ^ - (Td4[(s0 >> 8) & 0xff] << 8) ^ - (Td4[(s3 ) & 0xff] ); - t3 = - (Td4[(s3 >> 24) ] << 24) ^ - (Td4[(s2 >> 16) & 0xff] << 16) ^ - (Td4[(s1 >> 8) & 0xff] << 8) ^ - (Td4[(s0 ) & 0xff] ); - - if (rounds == Nr) { - t0 ^= rk[0]; - t1 ^= rk[1]; - t2 ^= rk[2]; - t3 ^= rk[3]; - } - - PUTU32(block , t0); - PUTU32(block + 4, t1); - PUTU32(block + 8, t2); - PUTU32(block + 12, t3); -} - -#endif /* INTERMEDIATE_VALUE_KAT */ diff --git a/sys/src/cmd/unix/drawterm/libsec/blowfish.c b/sys/src/cmd/unix/drawterm/libsec/blowfish.c deleted file mode 100644 index 5dcc677c7..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/blowfish.c +++ /dev/null @@ -1,579 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// Blowfish block cipher. See: -// Lecture Notes in Computer Science 809 -// Fast Software Encryption -// Cambridge Security Workshop, Cambridge, England (1993) - -static u32int sbox[1024]; -static u32int pbox[BFrounds+2]; - -static void bfencrypt(u32int *, BFstate *); -static void bfdecrypt(u32int *, BFstate *); - -void -setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec) -{ - int i, j; - u32int n, buf[2]; - - memset(s, 0, sizeof(*s)); - memset(buf, 0, sizeof buf); - - if (keybytes > sizeof(s->key)) - keybytes = sizeof(s->key); - - memmove(s->key, key, keybytes); - - if (ivec != nil) - memmove(s->ivec, ivec, sizeof(s->ivec)); - else - memset(s->ivec, 0, sizeof(s->ivec)); - - memmove(s->pbox, pbox, sizeof(pbox)); - memmove(s->sbox, sbox, sizeof(sbox)); - - if (keybytes > 4*(BFrounds + 2)) - keybytes = 4*(BFrounds + 2); - - for(i=j=0; i < BFrounds+2; i++) { - n = key[j]; - j = (j+1) % keybytes; - - n <<= 8; - n |= key[j]; - j = (j+1) % keybytes; - - n <<= 8; - n |= key[j]; - j = (j+1) % keybytes; - - n <<= 8; - n |= key[j]; - j = (j+1) % keybytes; - - s->pbox[i] ^= n; - } - - for(i=0; i < BFrounds+2; i += 2) { - bfencrypt(buf, s); - s->pbox[i] = buf[0]; - s->pbox[i+1] = buf[1]; - } - - for(i=0; i < 1024; i += 2) { - bfencrypt(buf, s); - s->sbox[i] = buf[0]; - s->sbox[i+1] = buf[1]; - } - - s->setup = 0xcafebabe; -} - -void -bfCBCencrypt(uchar *buf, int n, BFstate *s) -{ - int i; - uchar *p; - u32int bo[2], bi[2], b; - - assert((n & 7) == 0); - - bo[0] = s->ivec[0] | ((u32int) s->ivec[1]<<8) | ((u32int)s->ivec[2]<<16) | ((u32int)s->ivec[3]<<24); - bo[1] = s->ivec[4] | ((u32int) s->ivec[5]<<8) | ((u32int)s->ivec[6]<<16) | ((u32int)s->ivec[7]<<24); - - for(i=0; i < n; i += 8, buf += 8) { - bi[0] = buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24); - bi[1] = buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24); - - bi[0] ^= bo[0]; - bi[1] ^= bo[1]; - - bfencrypt(bi, s); - - bo[0] = bi[0]; - bo[1] = bi[1]; - - p = buf; - b = bo[0]; - *p++ = b; - b >>= 8; - *p++ = b; - b >>= 8; - *p++ = b; - b >>= 8; - *p++ = b; - - b = bo[1]; - *p++ = b; - b >>= 8; - *p++ = b; - b >>= 8; - *p++ = b; - b >>= 8; - *p = b; - } - - s->ivec[7] = bo[1] >> 24; - s->ivec[6] = bo[1] >> 16; - s->ivec[5] = bo[1] >> 8; - s->ivec[4] = bo[1]; - - s->ivec[3] = bo[0] >> 24; - s->ivec[2] = bo[0] >> 16; - s->ivec[1] = bo[0] >> 8; - s->ivec[0] = bo[0]; - - return; -} - -void -bfCBCdecrypt(uchar *buf, int n, BFstate *s) -{ - int i; - uchar *p; - u32int b, bo[2], bi[2], xr[2]; - - assert((n & 7) == 0); - - bo[0] = s->ivec[0] | ((u32int) s->ivec[1]<<8) | ((u32int)s->ivec[2]<<16) | ((u32int)s->ivec[3]<<24); - bo[1] = s->ivec[4] | ((u32int) s->ivec[5]<<8) | ((u32int)s->ivec[6]<<16) | ((u32int)s->ivec[7]<<24); - - for(i=0; i < n; i += 8, buf += 8) { - bi[0] = buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24); - bi[1] = buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24); - - xr[0] = bi[0]; - xr[1] = bi[1]; - - bfdecrypt(bi, s); - - bo[0] ^= bi[0]; - bo[1] ^= bi[1]; - - p = buf; - b = bo[0]; - *p++ = b; - b >>= 8; - *p++ = b; - b >>= 8; - *p++ = b; - b >>= 8; - *p++ = b; - - b = bo[1]; - *p++ = b; - b >>= 8; - *p++ = b; - b >>= 8; - *p++ = b; - b >>= 8; - *p = b; - - bo[0] = xr[0]; - bo[1] = xr[1]; - } - - s->ivec[7] = bo[1] >> 24; - s->ivec[6] = bo[1] >> 16; - s->ivec[5] = bo[1] >> 8; - s->ivec[4] = bo[1]; - - s->ivec[3] = bo[0] >> 24; - s->ivec[2] = bo[0] >> 16; - s->ivec[1] = bo[0] >> 8; - s->ivec[0] = bo[0]; - - return; -} - -void -bfECBencrypt(uchar *buf, int n, BFstate *s) -{ - int i; - u32int b[2]; - - for(i=0; i < n; i += 8, buf += 8) { - b[0] = buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24); - b[1] = buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24); - - bfencrypt(b, s); - - buf[7] = b[1] >> 24; - buf[6] = b[1] >> 16; - buf[5] = b[1] >> 8; - buf[4] = b[1]; - - buf[3] = b[0] >> 24; - buf[2] = b[0] >> 16; - buf[1] = b[0] >> 8; - buf[0] = b[0]; - } - - return; -} - -void -bfECBdecrypt(uchar *buf, int n, BFstate *s) -{ - int i; - u32int b[2]; - - for(i=0; i < n; i += 8, buf += 8) { - b[0] = buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24); - b[1] = buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24); - - bfdecrypt(b, s); - - buf[7] = b[1] >> 24; - buf[6] = b[1] >> 16; - buf[5] = b[1] >> 8; - buf[4] = b[1]; - - buf[3] = b[0] >> 24; - buf[2] = b[0] >> 16; - buf[1] = b[0] >> 8; - buf[0] = b[0]; - } - - return; -} - -static void -bfencrypt(u32int *b, BFstate *s) -{ - int i; - u32int l, r; - u32int *pb, *sb; - - l = b[0]; - r = b[1]; - - pb = s->pbox; - sb = s->sbox; - - l ^= pb[0]; - - for(i=1; i<16; i += 2) { - r ^= pb[i]; - r ^= ( (sb[ (uchar) (l>>24)] + sb[256 + ((uchar) (l>>16))]) ^ - sb[512 + ((uchar) (l>>8))]) + sb[768 +((uchar) l)]; - - l ^= pb[i+1]; - l ^= ( (sb[ (uchar) (r>>24)] + sb[256 + ((uchar) (r>>16))]) ^ - sb[512 + ((uchar) (r>>8))]) + sb[768 +((uchar) r)]; - } - - r ^= pb[BFrounds+1]; - - /* sic */ - b[0] = r; - b[1] = l; - - return; -} - -static void -bfdecrypt(u32int *b, BFstate *s) -{ - int i; - u32int l, r; - u32int *pb, *sb; - - l = b[0]; - r = b[1]; - - pb = s->pbox; - sb = s->sbox; - - l ^= pb[BFrounds+1]; - - for(i=16; i > 0; i -= 2) { - r ^= pb[i]; - r ^= ( (sb[ (uchar) (l>>24)] + sb[256 + ((uchar) (l>>16))]) ^ - sb[512 + ((uchar) (l>>8))]) + sb[768 +((uchar) l)]; - - l ^= pb[i-1]; - l ^= ( (sb[ (uchar) (r>>24)] + sb[256 + ((uchar) (r>>16))]) ^ - sb[512 + ((uchar) (r>>8))]) + sb[768 +((uchar) r)]; - } - - r ^= pb[0]; - - /* sic */ - b[0] = r; - b[1] = l; - - return; -} - -static u32int pbox[BFrounds+2] = { - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, - 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, - 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, - 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, - 0x9216d5d9, 0x8979fb1b -}; - -static u32int sbox[1024] = { - 0xd1310ba6L, 0x98dfb5acL, 0x2ffd72dbL, 0xd01adfb7L, - 0xb8e1afedL, 0x6a267e96L, 0xba7c9045L, 0xf12c7f99L, - 0x24a19947L, 0xb3916cf7L, 0x0801f2e2L, 0x858efc16L, - 0x636920d8L, 0x71574e69L, 0xa458fea3L, 0xf4933d7eL, - 0x0d95748fL, 0x728eb658L, 0x718bcd58L, 0x82154aeeL, - 0x7b54a41dL, 0xc25a59b5L, 0x9c30d539L, 0x2af26013L, - 0xc5d1b023L, 0x286085f0L, 0xca417918L, 0xb8db38efL, - 0x8e79dcb0L, 0x603a180eL, 0x6c9e0e8bL, 0xb01e8a3eL, - 0xd71577c1L, 0xbd314b27L, 0x78af2fdaL, 0x55605c60L, - 0xe65525f3L, 0xaa55ab94L, 0x57489862L, 0x63e81440L, - 0x55ca396aL, 0x2aab10b6L, 0xb4cc5c34L, 0x1141e8ceL, - 0xa15486afL, 0x7c72e993L, 0xb3ee1411L, 0x636fbc2aL, - 0x2ba9c55dL, 0x741831f6L, 0xce5c3e16L, 0x9b87931eL, - 0xafd6ba33L, 0x6c24cf5cL, 0x7a325381L, 0x28958677L, - 0x3b8f4898L, 0x6b4bb9afL, 0xc4bfe81bL, 0x66282193L, - 0x61d809ccL, 0xfb21a991L, 0x487cac60L, 0x5dec8032L, - 0xef845d5dL, 0xe98575b1L, 0xdc262302L, 0xeb651b88L, - 0x23893e81L, 0xd396acc5L, 0x0f6d6ff3L, 0x83f44239L, - 0x2e0b4482L, 0xa4842004L, 0x69c8f04aL, 0x9e1f9b5eL, - 0x21c66842L, 0xf6e96c9aL, 0x670c9c61L, 0xabd388f0L, - 0x6a51a0d2L, 0xd8542f68L, 0x960fa728L, 0xab5133a3L, - 0x6eef0b6cL, 0x137a3be4L, 0xba3bf050L, 0x7efb2a98L, - 0xa1f1651dL, 0x39af0176L, 0x66ca593eL, 0x82430e88L, - 0x8cee8619L, 0x456f9fb4L, 0x7d84a5c3L, 0x3b8b5ebeL, - 0xe06f75d8L, 0x85c12073L, 0x401a449fL, 0x56c16aa6L, - 0x4ed3aa62L, 0x363f7706L, 0x1bfedf72L, 0x429b023dL, - 0x37d0d724L, 0xd00a1248L, 0xdb0fead3L, 0x49f1c09bL, - 0x075372c9L, 0x80991b7bL, 0x25d479d8L, 0xf6e8def7L, - 0xe3fe501aL, 0xb6794c3bL, 0x976ce0bdL, 0x04c006baL, - 0xc1a94fb6L, 0x409f60c4L, 0x5e5c9ec2L, 0x196a2463L, - 0x68fb6fafL, 0x3e6c53b5L, 0x1339b2ebL, 0x3b52ec6fL, - 0x6dfc511fL, 0x9b30952cL, 0xcc814544L, 0xaf5ebd09L, - 0xbee3d004L, 0xde334afdL, 0x660f2807L, 0x192e4bb3L, - 0xc0cba857L, 0x45c8740fL, 0xd20b5f39L, 0xb9d3fbdbL, - 0x5579c0bdL, 0x1a60320aL, 0xd6a100c6L, 0x402c7279L, - 0x679f25feL, 0xfb1fa3ccL, 0x8ea5e9f8L, 0xdb3222f8L, - 0x3c7516dfL, 0xfd616b15L, 0x2f501ec8L, 0xad0552abL, - 0x323db5faL, 0xfd238760L, 0x53317b48L, 0x3e00df82L, - 0x9e5c57bbL, 0xca6f8ca0L, 0x1a87562eL, 0xdf1769dbL, - 0xd542a8f6L, 0x287effc3L, 0xac6732c6L, 0x8c4f5573L, - 0x695b27b0L, 0xbbca58c8L, 0xe1ffa35dL, 0xb8f011a0L, - 0x10fa3d98L, 0xfd2183b8L, 0x4afcb56cL, 0x2dd1d35bL, - 0x9a53e479L, 0xb6f84565L, 0xd28e49bcL, 0x4bfb9790L, - 0xe1ddf2daL, 0xa4cb7e33L, 0x62fb1341L, 0xcee4c6e8L, - 0xef20cadaL, 0x36774c01L, 0xd07e9efeL, 0x2bf11fb4L, - 0x95dbda4dL, 0xae909198L, 0xeaad8e71L, 0x6b93d5a0L, - 0xd08ed1d0L, 0xafc725e0L, 0x8e3c5b2fL, 0x8e7594b7L, - 0x8ff6e2fbL, 0xf2122b64L, 0x8888b812L, 0x900df01cL, - 0x4fad5ea0L, 0x688fc31cL, 0xd1cff191L, 0xb3a8c1adL, - 0x2f2f2218L, 0xbe0e1777L, 0xea752dfeL, 0x8b021fa1L, - 0xe5a0cc0fL, 0xb56f74e8L, 0x18acf3d6L, 0xce89e299L, - 0xb4a84fe0L, 0xfd13e0b7L, 0x7cc43b81L, 0xd2ada8d9L, - 0x165fa266L, 0x80957705L, 0x93cc7314L, 0x211a1477L, - 0xe6ad2065L, 0x77b5fa86L, 0xc75442f5L, 0xfb9d35cfL, - 0xebcdaf0cL, 0x7b3e89a0L, 0xd6411bd3L, 0xae1e7e49L, - 0x00250e2dL, 0x2071b35eL, 0x226800bbL, 0x57b8e0afL, - 0x2464369bL, 0xf009b91eL, 0x5563911dL, 0x59dfa6aaL, - 0x78c14389L, 0xd95a537fL, 0x207d5ba2L, 0x02e5b9c5L, - 0x83260376L, 0x6295cfa9L, 0x11c81968L, 0x4e734a41L, - 0xb3472dcaL, 0x7b14a94aL, 0x1b510052L, 0x9a532915L, - 0xd60f573fL, 0xbc9bc6e4L, 0x2b60a476L, 0x81e67400L, - 0x08ba6fb5L, 0x571be91fL, 0xf296ec6bL, 0x2a0dd915L, - 0xb6636521L, 0xe7b9f9b6L, 0xff34052eL, 0xc5855664L, - 0x53b02d5dL, 0xa99f8fa1L, 0x08ba4799L, 0x6e85076aL, - 0x4b7a70e9L, 0xb5b32944L, 0xdb75092eL, 0xc4192623L, - 0xad6ea6b0L, 0x49a7df7dL, 0x9cee60b8L, 0x8fedb266L, - 0xecaa8c71L, 0x699a17ffL, 0x5664526cL, 0xc2b19ee1L, - 0x193602a5L, 0x75094c29L, 0xa0591340L, 0xe4183a3eL, - 0x3f54989aL, 0x5b429d65L, 0x6b8fe4d6L, 0x99f73fd6L, - 0xa1d29c07L, 0xefe830f5L, 0x4d2d38e6L, 0xf0255dc1L, - 0x4cdd2086L, 0x8470eb26L, 0x6382e9c6L, 0x021ecc5eL, - 0x09686b3fL, 0x3ebaefc9L, 0x3c971814L, 0x6b6a70a1L, - 0x687f3584L, 0x52a0e286L, 0xb79c5305L, 0xaa500737L, - 0x3e07841cL, 0x7fdeae5cL, 0x8e7d44ecL, 0x5716f2b8L, - 0xb03ada37L, 0xf0500c0dL, 0xf01c1f04L, 0x0200b3ffL, - 0xae0cf51aL, 0x3cb574b2L, 0x25837a58L, 0xdc0921bdL, - 0xd19113f9L, 0x7ca92ff6L, 0x94324773L, 0x22f54701L, - 0x3ae5e581L, 0x37c2dadcL, 0xc8b57634L, 0x9af3dda7L, - 0xa9446146L, 0x0fd0030eL, 0xecc8c73eL, 0xa4751e41L, - 0xe238cd99L, 0x3bea0e2fL, 0x3280bba1L, 0x183eb331L, - 0x4e548b38L, 0x4f6db908L, 0x6f420d03L, 0xf60a04bfL, - 0x2cb81290L, 0x24977c79L, 0x5679b072L, 0xbcaf89afL, - 0xde9a771fL, 0xd9930810L, 0xb38bae12L, 0xdccf3f2eL, - 0x5512721fL, 0x2e6b7124L, 0x501adde6L, 0x9f84cd87L, - 0x7a584718L, 0x7408da17L, 0xbc9f9abcL, 0xe94b7d8cL, - 0xec7aec3aL, 0xdb851dfaL, 0x63094366L, 0xc464c3d2L, - 0xef1c1847L, 0x3215d908L, 0xdd433b37L, 0x24c2ba16L, - 0x12a14d43L, 0x2a65c451L, 0x50940002L, 0x133ae4ddL, - 0x71dff89eL, 0x10314e55L, 0x81ac77d6L, 0x5f11199bL, - 0x043556f1L, 0xd7a3c76bL, 0x3c11183bL, 0x5924a509L, - 0xf28fe6edL, 0x97f1fbfaL, 0x9ebabf2cL, 0x1e153c6eL, - 0x86e34570L, 0xeae96fb1L, 0x860e5e0aL, 0x5a3e2ab3L, - 0x771fe71cL, 0x4e3d06faL, 0x2965dcb9L, 0x99e71d0fL, - 0x803e89d6L, 0x5266c825L, 0x2e4cc978L, 0x9c10b36aL, - 0xc6150ebaL, 0x94e2ea78L, 0xa5fc3c53L, 0x1e0a2df4L, - 0xf2f74ea7L, 0x361d2b3dL, 0x1939260fL, 0x19c27960L, - 0x5223a708L, 0xf71312b6L, 0xebadfe6eL, 0xeac31f66L, - 0xe3bc4595L, 0xa67bc883L, 0xb17f37d1L, 0x018cff28L, - 0xc332ddefL, 0xbe6c5aa5L, 0x65582185L, 0x68ab9802L, - 0xeecea50fL, 0xdb2f953bL, 0x2aef7dadL, 0x5b6e2f84L, - 0x1521b628L, 0x29076170L, 0xecdd4775L, 0x619f1510L, - 0x13cca830L, 0xeb61bd96L, 0x0334fe1eL, 0xaa0363cfL, - 0xb5735c90L, 0x4c70a239L, 0xd59e9e0bL, 0xcbaade14L, - 0xeecc86bcL, 0x60622ca7L, 0x9cab5cabL, 0xb2f3846eL, - 0x648b1eafL, 0x19bdf0caL, 0xa02369b9L, 0x655abb50L, - 0x40685a32L, 0x3c2ab4b3L, 0x319ee9d5L, 0xc021b8f7L, - 0x9b540b19L, 0x875fa099L, 0x95f7997eL, 0x623d7da8L, - 0xf837889aL, 0x97e32d77L, 0x11ed935fL, 0x16681281L, - 0x0e358829L, 0xc7e61fd6L, 0x96dedfa1L, 0x7858ba99L, - 0x57f584a5L, 0x1b227263L, 0x9b83c3ffL, 0x1ac24696L, - 0xcdb30aebL, 0x532e3054L, 0x8fd948e4L, 0x6dbc3128L, - 0x58ebf2efL, 0x34c6ffeaL, 0xfe28ed61L, 0xee7c3c73L, - 0x5d4a14d9L, 0xe864b7e3L, 0x42105d14L, 0x203e13e0L, - 0x45eee2b6L, 0xa3aaabeaL, 0xdb6c4f15L, 0xfacb4fd0L, - 0xc742f442L, 0xef6abbb5L, 0x654f3b1dL, 0x41cd2105L, - 0xd81e799eL, 0x86854dc7L, 0xe44b476aL, 0x3d816250L, - 0xcf62a1f2L, 0x5b8d2646L, 0xfc8883a0L, 0xc1c7b6a3L, - 0x7f1524c3L, 0x69cb7492L, 0x47848a0bL, 0x5692b285L, - 0x095bbf00L, 0xad19489dL, 0x1462b174L, 0x23820e00L, - 0x58428d2aL, 0x0c55f5eaL, 0x1dadf43eL, 0x233f7061L, - 0x3372f092L, 0x8d937e41L, 0xd65fecf1L, 0x6c223bdbL, - 0x7cde3759L, 0xcbee7460L, 0x4085f2a7L, 0xce77326eL, - 0xa6078084L, 0x19f8509eL, 0xe8efd855L, 0x61d99735L, - 0xa969a7aaL, 0xc50c06c2L, 0x5a04abfcL, 0x800bcadcL, - 0x9e447a2eL, 0xc3453484L, 0xfdd56705L, 0x0e1e9ec9L, - 0xdb73dbd3L, 0x105588cdL, 0x675fda79L, 0xe3674340L, - 0xc5c43465L, 0x713e38d8L, 0x3d28f89eL, 0xf16dff20L, - 0x153e21e7L, 0x8fb03d4aL, 0xe6e39f2bL, 0xdb83adf7L, - 0xe93d5a68L, 0x948140f7L, 0xf64c261cL, 0x94692934L, - 0x411520f7L, 0x7602d4f7L, 0xbcf46b2eL, 0xd4a20068L, - 0xd4082471L, 0x3320f46aL, 0x43b7d4b7L, 0x500061afL, - 0x1e39f62eL, 0x97244546L, 0x14214f74L, 0xbf8b8840L, - 0x4d95fc1dL, 0x96b591afL, 0x70f4ddd3L, 0x66a02f45L, - 0xbfbc09ecL, 0x03bd9785L, 0x7fac6dd0L, 0x31cb8504L, - 0x96eb27b3L, 0x55fd3941L, 0xda2547e6L, 0xabca0a9aL, - 0x28507825L, 0x530429f4L, 0x0a2c86daL, 0xe9b66dfbL, - 0x68dc1462L, 0xd7486900L, 0x680ec0a4L, 0x27a18deeL, - 0x4f3ffea2L, 0xe887ad8cL, 0xb58ce006L, 0x7af4d6b6L, - 0xaace1e7cL, 0xd3375fecL, 0xce78a399L, 0x406b2a42L, - 0x20fe9e35L, 0xd9f385b9L, 0xee39d7abL, 0x3b124e8bL, - 0x1dc9faf7L, 0x4b6d1856L, 0x26a36631L, 0xeae397b2L, - 0x3a6efa74L, 0xdd5b4332L, 0x6841e7f7L, 0xca7820fbL, - 0xfb0af54eL, 0xd8feb397L, 0x454056acL, 0xba489527L, - 0x55533a3aL, 0x20838d87L, 0xfe6ba9b7L, 0xd096954bL, - 0x55a867bcL, 0xa1159a58L, 0xcca92963L, 0x99e1db33L, - 0xa62a4a56L, 0x3f3125f9L, 0x5ef47e1cL, 0x9029317cL, - 0xfdf8e802L, 0x04272f70L, 0x80bb155cL, 0x05282ce3L, - 0x95c11548L, 0xe4c66d22L, 0x48c1133fL, 0xc70f86dcL, - 0x07f9c9eeL, 0x41041f0fL, 0x404779a4L, 0x5d886e17L, - 0x325f51ebL, 0xd59bc0d1L, 0xf2bcc18fL, 0x41113564L, - 0x257b7834L, 0x602a9c60L, 0xdff8e8a3L, 0x1f636c1bL, - 0x0e12b4c2L, 0x02e1329eL, 0xaf664fd1L, 0xcad18115L, - 0x6b2395e0L, 0x333e92e1L, 0x3b240b62L, 0xeebeb922L, - 0x85b2a20eL, 0xe6ba0d99L, 0xde720c8cL, 0x2da2f728L, - 0xd0127845L, 0x95b794fdL, 0x647d0862L, 0xe7ccf5f0L, - 0x5449a36fL, 0x877d48faL, 0xc39dfd27L, 0xf33e8d1eL, - 0x0a476341L, 0x992eff74L, 0x3a6f6eabL, 0xf4f8fd37L, - 0xa812dc60L, 0xa1ebddf8L, 0x991be14cL, 0xdb6e6b0dL, - 0xc67b5510L, 0x6d672c37L, 0x2765d43bL, 0xdcd0e804L, - 0xf1290dc7L, 0xcc00ffa3L, 0xb5390f92L, 0x690fed0bL, - 0x667b9ffbL, 0xcedb7d9cL, 0xa091cf0bL, 0xd9155ea3L, - 0xbb132f88L, 0x515bad24L, 0x7b9479bfL, 0x763bd6ebL, - 0x37392eb3L, 0xcc115979L, 0x8026e297L, 0xf42e312dL, - 0x6842ada7L, 0xc66a2b3bL, 0x12754cccL, 0x782ef11cL, - 0x6a124237L, 0xb79251e7L, 0x06a1bbe6L, 0x4bfb6350L, - 0x1a6b1018L, 0x11caedfaL, 0x3d25bdd8L, 0xe2e1c3c9L, - 0x44421659L, 0x0a121386L, 0xd90cec6eL, 0xd5abea2aL, - 0x64af674eL, 0xda86a85fL, 0xbebfe988L, 0x64e4c3feL, - 0x9dbc8057L, 0xf0f7c086L, 0x60787bf8L, 0x6003604dL, - 0xd1fd8346L, 0xf6381fb0L, 0x7745ae04L, 0xd736fcccL, - 0x83426b33L, 0xf01eab71L, 0xb0804187L, 0x3c005e5fL, - 0x77a057beL, 0xbde8ae24L, 0x55464299L, 0xbf582e61L, - 0x4e58f48fL, 0xf2ddfda2L, 0xf474ef38L, 0x8789bdc2L, - 0x5366f9c3L, 0xc8b38e74L, 0xb475f255L, 0x46fcd9b9L, - 0x7aeb2661L, 0x8b1ddf84L, 0x846a0e79L, 0x915f95e2L, - 0x466e598eL, 0x20b45770L, 0x8cd55591L, 0xc902de4cL, - 0xb90bace1L, 0xbb8205d0L, 0x11a86248L, 0x7574a99eL, - 0xb77f19b6L, 0xe0a9dc09L, 0x662d09a1L, 0xc4324633L, - 0xe85a1f02L, 0x09f0be8cL, 0x4a99a025L, 0x1d6efe10L, - 0x1ab93d1dL, 0x0ba5a4dfL, 0xa186f20fL, 0x2868f169L, - 0xdcb7da83L, 0x573906feL, 0xa1e2ce9bL, 0x4fcd7f52L, - 0x50115e01L, 0xa70683faL, 0xa002b5c4L, 0x0de6d027L, - 0x9af88c27L, 0x773f8641L, 0xc3604c06L, 0x61a806b5L, - 0xf0177a28L, 0xc0f586e0L, 0x006058aaL, 0x30dc7d62L, - 0x11e69ed7L, 0x2338ea63L, 0x53c2dd94L, 0xc2c21634L, - 0xbbcbee56L, 0x90bcb6deL, 0xebfc7da1L, 0xce591d76L, - 0x6f05e409L, 0x4b7c0188L, 0x39720a3dL, 0x7c927c24L, - 0x86e3725fL, 0x724d9db9L, 0x1ac15bb4L, 0xd39eb8fcL, - 0xed545578L, 0x08fca5b5L, 0xd83d7cd3L, 0x4dad0fc4L, - 0x1e50ef5eL, 0xb161e6f8L, 0xa28514d9L, 0x6c51133cL, - 0x6fd5c7e7L, 0x56e14ec4L, 0x362abfceL, 0xddc6c837L, - 0xd79a3234L, 0x92638212L, 0x670efa8eL, 0x406000e0L, - 0x3a39ce37L, 0xd3faf5cfL, 0xabc27737L, 0x5ac52d1bL, - 0x5cb0679eL, 0x4fa33742L, 0xd3822740L, 0x99bc9bbeL, - 0xd5118e9dL, 0xbf0f7315L, 0xd62d1c7eL, 0xc700c47bL, - 0xb78c1b6bL, 0x21a19045L, 0xb26eb1beL, 0x6a366eb4L, - 0x5748ab2fL, 0xbc946e79L, 0xc6a376d2L, 0x6549c2c8L, - 0x530ff8eeL, 0x468dde7dL, 0xd5730a1dL, 0x4cd04dc6L, - 0x2939bbdbL, 0xa9ba4650L, 0xac9526e8L, 0xbe5ee304L, - 0xa1fad5f0L, 0x6a2d519aL, 0x63ef8ce2L, 0x9a86ee22L, - 0xc089c2b8L, 0x43242ef6L, 0xa51e03aaL, 0x9cf2d0a4L, - 0x83c061baL, 0x9be96a4dL, 0x8fe51550L, 0xba645bd6L, - 0x2826a2f9L, 0xa73a3ae1L, 0x4ba99586L, 0xef5562e9L, - 0xc72fefd3L, 0xf752f7daL, 0x3f046f69L, 0x77fa0a59L, - 0x80e4a915L, 0x87b08601L, 0x9b09e6adL, 0x3b3ee593L, - 0xe990fd5aL, 0x9e34d797L, 0x2cf0b7d9L, 0x022b8b51L, - 0x96d5ac3aL, 0x017da67dL, 0xd1cf3ed6L, 0x7c7d2d28L, - 0x1f9f25cfL, 0xadf2b89bL, 0x5ad6b472L, 0x5a88f54cL, - 0xe029ac71L, 0xe019a5e6L, 0x47b0acfdL, 0xed93fa9bL, - 0xe8d3c48dL, 0x283b57ccL, 0xf8d56629L, 0x79132e28L, - 0x785f0191L, 0xed756055L, 0xf7960e44L, 0xe3d35e8cL, - 0x15056dd4L, 0x88f46dbaL, 0x03a16125L, 0x0564f0bdL, - 0xc3eb9e15L, 0x3c9057a2L, 0x97271aecL, 0xa93a072aL, - 0x1b3f6d9bL, 0x1e6321f5L, 0xf59c66fbL, 0x26dcf319L, - 0x7533d928L, 0xb155fdf5L, 0x03563482L, 0x8aba3cbbL, - 0x28517711L, 0xc20ad9f8L, 0xabcc5167L, 0xccad925fL, - 0x4de81751L, 0x3830dc8eL, 0x379d5862L, 0x9320f991L, - 0xea7a90c2L, 0xfb3e7bceL, 0x5121ce64L, 0x774fbe32L, - 0xa8b6e37eL, 0xc3293d46L, 0x48de5369L, 0x6413e680L, - 0xa2ae0810L, 0xdd6db224L, 0x69852dfdL, 0x09072166L, - 0xb39a460aL, 0x6445c0ddL, 0x586cdecfL, 0x1c20c8aeL, - 0x5bbef7ddL, 0x1b588d40L, 0xccd2017fL, 0x6bb4e3bbL, - 0xdda26a7eL, 0x3a59ff45L, 0x3e350a44L, 0xbcb4cdd5L, - 0x72eacea8L, 0xfa6484bbL, 0x8d6612aeL, 0xbf3c6f47L, - 0xd29be463L, 0x542f5d9eL, 0xaec2771bL, 0xf64e6370L, - 0x740e0d8dL, 0xe75b1357L, 0xf8721671L, 0xaf537d5dL, - 0x4040cb08L, 0x4eb4e2ccL, 0x34d2466aL, 0x0115af84L, - 0xe1b00428L, 0x95983a1dL, 0x06b89fb4L, 0xce6ea048L, - 0x6f3f3b82L, 0x3520ab82L, 0x011a1d4bL, 0x277227f8L, - 0x611560b1L, 0xe7933fdcL, 0xbb3a792bL, 0x344525bdL, - 0xa08839e1L, 0x51ce794bL, 0x2f32c9b7L, 0xa01fbac9L, - 0xe01cc87eL, 0xbcc7d1f6L, 0xcf0111c3L, 0xa1e8aac7L, - 0x1a908749L, 0xd44fbd9aL, 0xd0dadecbL, 0xd50ada38L, - 0x0339c32aL, 0xc6913667L, 0x8df9317cL, 0xe0b12b4fL, - 0xf79e59b7L, 0x43f5bb3aL, 0xf2d519ffL, 0x27d9459cL, - 0xbf97222cL, 0x15e6fc2aL, 0x0f91fc71L, 0x9b941525L, - 0xfae59361L, 0xceb69cebL, 0xc2a86459L, 0x12baa8d1L, - 0xb6c1075eL, 0xe3056a0cL, 0x10d25065L, 0xcb03a442L, - 0xe0ec6e0eL, 0x1698db3bL, 0x4c98a0beL, 0x3278e964L, - 0x9f1f9532L, 0xe0d392dfL, 0xd3a0342bL, 0x8971f21eL, - 0x1b0a7441L, 0x4ba3348cL, 0xc5be7120L, 0xc37632d8L, - 0xdf359f8dL, 0x9b992f2eL, 0xe60b6f47L, 0x0fe3f11dL, - 0xe54cda54L, 0x1edad891L, 0xce6279cfL, 0xcd3e7e6fL, - 0x1618b166L, 0xfd2c1d05L, 0x848fd2c5L, 0xf6fb2299L, - 0xf523f357L, 0xa6327623L, 0x93a83531L, 0x56cccd02L, - 0xacf08162L, 0x5a75ebb5L, 0x6e163697L, 0x88d273ccL, - 0xde966292L, 0x81b949d0L, 0x4c50901bL, 0x71c65614L, - 0xe6c6c7bdL, 0x327a140aL, 0x45e1d006L, 0xc3f27b9aL, - 0xc9aa53fdL, 0x62a80f00L, 0xbb25bfe2L, 0x35bdd2f6L, - 0x71126905L, 0xb2040222L, 0xb6cbcf7cL, 0xcd769c2bL, - 0x53113ec0L, 0x1640e3d3L, 0x38abbd60L, 0x2547adf0L, - 0xba38209cL, 0xf746ce76L, 0x77afa1c5L, 0x20756060L, - 0x85cbfe4eL, 0x8ae88dd8L, 0x7aaaf9b0L, 0x4cf9aa7eL, - 0x1948c25cL, 0x02fb8a8cL, 0x01c36ae4L, 0xd6ebe1f9L, - 0x90d4f869L, 0xa65cdea0L, 0x3f09252dL, 0xc208e69fL, - 0xb74e6132L, 0xce77e25bL, 0x578fdfe3L, 0x3ac372e6L, -}; - - diff --git a/sys/src/cmd/unix/drawterm/libsec/decodepem.c b/sys/src/cmd/unix/drawterm/libsec/decodepem.c deleted file mode 100644 index 7e8f83b4e..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/decodepem.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <mp.h> -#include <libsec.h> - -#define STRLEN(s) (sizeof(s)-1) - -uchar* -decodepem(char *s, char *type, int *len) -{ - uchar *d; - char *t, *e, *tt; - int n; - - /* - * find the correct section of the file, stripping garbage at the beginning and end. - * the data is delimited by -----BEGIN <type>-----\n and -----END <type>-----\n - */ - n = strlen(type); - e = strchr(s, '\0'); - for(t = s; t != nil && t < e; ){ - tt = t; - t = strchr(tt, '\n'); - if(t != nil) - t++; - if(strncmp(tt, "-----BEGIN ", STRLEN("-----BEGIN ")) == 0 - && strncmp(&tt[STRLEN("-----BEGIN ")], type, n) == 0 - && strncmp(&tt[STRLEN("-----BEGIN ")+n], "-----\n", STRLEN("-----\n")) == 0) - break; - } - for(tt = t; tt != nil && tt < e; tt++){ - if(strncmp(tt, "-----END ", STRLEN("-----END ")) == 0 - && strncmp(&tt[STRLEN("-----END ")], type, n) == 0 - && strncmp(&tt[STRLEN("-----END ")+n], "-----\n", STRLEN("-----\n")) == 0) - break; - tt = strchr(tt, '\n'); - if(tt == nil) - break; - } - if(tt == nil || tt == e){ - werrstr("incorrect .pem file format: bad header or trailer"); - return nil; - } - - n = ((tt - t) * 6 + 7) / 8; - d = malloc(n); - if(d == nil){ - werrstr("out of memory"); - return nil; - } - n = dec64(d, n, t, tt - t); - if(n < 0){ - free(d); - werrstr("incorrect .pem file format: bad base64 encoded data"); - return nil; - } - *len = n; - return d; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/des.c b/sys/src/cmd/unix/drawterm/libsec/des.c deleted file mode 100644 index c54541c58..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/des.c +++ /dev/null @@ -1,480 +0,0 @@ -#include "os.h" -#include <libsec.h> - -/* - * integrated sbox & p perm - */ -static u32int spbox[] = { - -0x00808200,0x00000000,0x00008000,0x00808202,0x00808002,0x00008202,0x00000002,0x00008000, -0x00000200,0x00808200,0x00808202,0x00000200,0x00800202,0x00808002,0x00800000,0x00000002, -0x00000202,0x00800200,0x00800200,0x00008200,0x00008200,0x00808000,0x00808000,0x00800202, -0x00008002,0x00800002,0x00800002,0x00008002,0x00000000,0x00000202,0x00008202,0x00800000, -0x00008000,0x00808202,0x00000002,0x00808000,0x00808200,0x00800000,0x00800000,0x00000200, -0x00808002,0x00008000,0x00008200,0x00800002,0x00000200,0x00000002,0x00800202,0x00008202, -0x00808202,0x00008002,0x00808000,0x00800202,0x00800002,0x00000202,0x00008202,0x00808200, -0x00000202,0x00800200,0x00800200,0x00000000,0x00008002,0x00008200,0x00000000,0x00808002, - -0x40084010,0x40004000,0x00004000,0x00084010,0x00080000,0x00000010,0x40080010,0x40004010, -0x40000010,0x40084010,0x40084000,0x40000000,0x40004000,0x00080000,0x00000010,0x40080010, -0x00084000,0x00080010,0x40004010,0x00000000,0x40000000,0x00004000,0x00084010,0x40080000, -0x00080010,0x40000010,0x00000000,0x00084000,0x00004010,0x40084000,0x40080000,0x00004010, -0x00000000,0x00084010,0x40080010,0x00080000,0x40004010,0x40080000,0x40084000,0x00004000, -0x40080000,0x40004000,0x00000010,0x40084010,0x00084010,0x00000010,0x00004000,0x40000000, -0x00004010,0x40084000,0x00080000,0x40000010,0x00080010,0x40004010,0x40000010,0x00080010, -0x00084000,0x00000000,0x40004000,0x00004010,0x40000000,0x40080010,0x40084010,0x00084000, - -0x00000104,0x04010100,0x00000000,0x04010004,0x04000100,0x00000000,0x00010104,0x04000100, -0x00010004,0x04000004,0x04000004,0x00010000,0x04010104,0x00010004,0x04010000,0x00000104, -0x04000000,0x00000004,0x04010100,0x00000100,0x00010100,0x04010000,0x04010004,0x00010104, -0x04000104,0x00010100,0x00010000,0x04000104,0x00000004,0x04010104,0x00000100,0x04000000, -0x04010100,0x04000000,0x00010004,0x00000104,0x00010000,0x04010100,0x04000100,0x00000000, -0x00000100,0x00010004,0x04010104,0x04000100,0x04000004,0x00000100,0x00000000,0x04010004, -0x04000104,0x00010000,0x04000000,0x04010104,0x00000004,0x00010104,0x00010100,0x04000004, -0x04010000,0x04000104,0x00000104,0x04010000,0x00010104,0x00000004,0x04010004,0x00010100, - -0x80401000,0x80001040,0x80001040,0x00000040,0x00401040,0x80400040,0x80400000,0x80001000, -0x00000000,0x00401000,0x00401000,0x80401040,0x80000040,0x00000000,0x00400040,0x80400000, -0x80000000,0x00001000,0x00400000,0x80401000,0x00000040,0x00400000,0x80001000,0x00001040, -0x80400040,0x80000000,0x00001040,0x00400040,0x00001000,0x00401040,0x80401040,0x80000040, -0x00400040,0x80400000,0x00401000,0x80401040,0x80000040,0x00000000,0x00000000,0x00401000, -0x00001040,0x00400040,0x80400040,0x80000000,0x80401000,0x80001040,0x80001040,0x00000040, -0x80401040,0x80000040,0x80000000,0x00001000,0x80400000,0x80001000,0x00401040,0x80400040, -0x80001000,0x00001040,0x00400000,0x80401000,0x00000040,0x00400000,0x00001000,0x00401040, - -0x00000080,0x01040080,0x01040000,0x21000080,0x00040000,0x00000080,0x20000000,0x01040000, -0x20040080,0x00040000,0x01000080,0x20040080,0x21000080,0x21040000,0x00040080,0x20000000, -0x01000000,0x20040000,0x20040000,0x00000000,0x20000080,0x21040080,0x21040080,0x01000080, -0x21040000,0x20000080,0x00000000,0x21000000,0x01040080,0x01000000,0x21000000,0x00040080, -0x00040000,0x21000080,0x00000080,0x01000000,0x20000000,0x01040000,0x21000080,0x20040080, -0x01000080,0x20000000,0x21040000,0x01040080,0x20040080,0x00000080,0x01000000,0x21040000, -0x21040080,0x00040080,0x21000000,0x21040080,0x01040000,0x00000000,0x20040000,0x21000000, -0x00040080,0x01000080,0x20000080,0x00040000,0x00000000,0x20040000,0x01040080,0x20000080, - -0x10000008,0x10200000,0x00002000,0x10202008,0x10200000,0x00000008,0x10202008,0x00200000, -0x10002000,0x00202008,0x00200000,0x10000008,0x00200008,0x10002000,0x10000000,0x00002008, -0x00000000,0x00200008,0x10002008,0x00002000,0x00202000,0x10002008,0x00000008,0x10200008, -0x10200008,0x00000000,0x00202008,0x10202000,0x00002008,0x00202000,0x10202000,0x10000000, -0x10002000,0x00000008,0x10200008,0x00202000,0x10202008,0x00200000,0x00002008,0x10000008, -0x00200000,0x10002000,0x10000000,0x00002008,0x10000008,0x10202008,0x00202000,0x10200000, -0x00202008,0x10202000,0x00000000,0x10200008,0x00000008,0x00002000,0x10200000,0x00202008, -0x00002000,0x00200008,0x10002008,0x00000000,0x10202000,0x10000000,0x00200008,0x10002008, - -0x00100000,0x02100001,0x02000401,0x00000000,0x00000400,0x02000401,0x00100401,0x02100400, -0x02100401,0x00100000,0x00000000,0x02000001,0x00000001,0x02000000,0x02100001,0x00000401, -0x02000400,0x00100401,0x00100001,0x02000400,0x02000001,0x02100000,0x02100400,0x00100001, -0x02100000,0x00000400,0x00000401,0x02100401,0x00100400,0x00000001,0x02000000,0x00100400, -0x02000000,0x00100400,0x00100000,0x02000401,0x02000401,0x02100001,0x02100001,0x00000001, -0x00100001,0x02000000,0x02000400,0x00100000,0x02100400,0x00000401,0x00100401,0x02100400, -0x00000401,0x02000001,0x02100401,0x02100000,0x00100400,0x00000000,0x00000001,0x02100401, -0x00000000,0x00100401,0x02100000,0x00000400,0x02000001,0x02000400,0x00000400,0x00100001, - -0x08000820,0x00000800,0x00020000,0x08020820,0x08000000,0x08000820,0x00000020,0x08000000, -0x00020020,0x08020000,0x08020820,0x00020800,0x08020800,0x00020820,0x00000800,0x00000020, -0x08020000,0x08000020,0x08000800,0x00000820,0x00020800,0x00020020,0x08020020,0x08020800, -0x00000820,0x00000000,0x00000000,0x08020020,0x08000020,0x08000800,0x00020820,0x00020000, -0x00020820,0x00020000,0x08020800,0x00000800,0x00000020,0x08020020,0x00000800,0x00020820, -0x08000800,0x00000020,0x08000020,0x08020000,0x08020020,0x08000000,0x00020000,0x08000820, -0x00000000,0x08020820,0x00020020,0x08000020,0x08020000,0x08000800,0x08000820,0x00000000, -0x08020820,0x00020800,0x00020800,0x00000820,0x00000820,0x00020020,0x08000000,0x08020800, -}; - -/* - * for manual index calculation - * #define fetch(box, i, sh) (*((u32int*)((uchar*)spbox + (box << 8) + ((i >> (sh)) & 0xfc)))) - */ -#define fetch(box, i, sh) ((spbox+(box << 6))[((i >> (sh + 2)) & 0x3f)]) - -/* - * DES electronic codebook encryption of one block - */ -void -block_cipher(ulong key[32], uchar text[8], int decrypting) -{ - u32int right, left, v0, v1; - int i, keystep; - - /* - * initial permutation - */ - v0 = text[0] | ((u32int)text[2]<<8) | ((u32int)text[4]<<16) | ((u32int)text[6]<<24); - left = text[1] | ((u32int)text[3]<<8) | ((u32int)text[5]<<16) | ((u32int)text[7]<<24); - right = (left & 0xaaaaaaaa) | ((v0 >> 1) & 0x55555555); - left = ((left << 1) & 0xaaaaaaaa) | (v0 & 0x55555555); - left = ((left << 6) & 0x33003300) - | (left & 0xcc33cc33) - | ((left >> 6) & 0x00cc00cc); - left = ((left << 12) & 0x0f0f0000) - | (left & 0xf0f00f0f) - | ((left >> 12) & 0x0000f0f0); - right = ((right << 6) & 0x33003300) - | (right & 0xcc33cc33) - | ((right >> 6) & 0x00cc00cc); - right = ((right << 12) & 0x0f0f0000) - | (right & 0xf0f00f0f) - | ((right >> 12) & 0x0000f0f0); - - if (decrypting) { - keystep = -2; - key = key + 32 - 2; - } else - keystep = 2; - for (i = 0; i < 8; i++) { - v0 = key[0]; - v0 ^= (right >> 1) | (right << 31); - left ^= fetch(0, v0, 24) - ^ fetch(2, v0, 16) - ^ fetch(4, v0, 8) - ^ fetch(6, v0, 0); - v1 = key[1]; - v1 ^= (right << 3) | (right >> 29); - left ^= fetch(1, v1, 24) - ^ fetch(3, v1, 16) - ^ fetch(5, v1, 8) - ^ fetch(7, v1, 0); - key += keystep; - - v0 = key[0]; - v0 ^= (left >> 1) | (left << 31); - right ^= fetch(0, v0, 24) - ^ fetch(2, v0, 16) - ^ fetch(4, v0, 8) - ^ fetch(6, v0, 0); - v1 = key[1]; - v1 ^= (left << 3) | (left >> 29); - right ^= fetch(1, v1, 24) - ^ fetch(3, v1, 16) - ^ fetch(5, v1, 8) - ^ fetch(7, v1, 0); - key += keystep; - } - - /* - * final permutation, inverse initial permutation - */ - v0 = ((left << 1) & 0xaaaaaaaa) | (right & 0x55555555); - v1 = (left & 0xaaaaaaaa) | ((right >> 1) & 0x55555555); - v1 = ((v1 << 6) & 0x33003300) - | (v1 & 0xcc33cc33) - | ((v1 >> 6) & 0x00cc00cc); - v1 = ((v1 << 12) & 0x0f0f0000) - | (v1 & 0xf0f00f0f) - | ((v1 >> 12) & 0x0000f0f0); - v0 = ((v0 << 6) & 0x33003300) - | (v0 & 0xcc33cc33) - | ((v0 >> 6) & 0x00cc00cc); - v0 = ((v0 << 12) & 0x0f0f0000) - | (v0 & 0xf0f00f0f) - | ((v0 >> 12) & 0x0000f0f0); - text[0] = v0; - text[2] = v0 >> 8; - text[4] = v0 >> 16; - text[6] = v0 >> 24; - text[1] = v1; - text[3] = v1 >> 8; - text[5] = v1 >> 16; - text[7] = v1 >> 24; -} - -/* - * triple DES electronic codebook encryption of one block - */ -void -triple_block_cipher(ulong expanded_key[3][32], uchar text[8], int ende) -{ - ulong *key; - u32int right, left, v0, v1; - int i, j, keystep; - - /* - * initial permutation - */ - v0 = text[0] | ((u32int)text[2]<<8) | ((u32int)text[4]<<16) | ((u32int)text[6]<<24); - left = text[1] | ((u32int)text[3]<<8) | ((u32int)text[5]<<16) | ((u32int)text[7]<<24); - right = (left & 0xaaaaaaaa) | ((v0 >> 1) & 0x55555555); - left = ((left << 1) & 0xaaaaaaaa) | (v0 & 0x55555555); - left = ((left << 6) & 0x33003300) - | (left & 0xcc33cc33) - | ((left >> 6) & 0x00cc00cc); - left = ((left << 12) & 0x0f0f0000) - | (left & 0xf0f00f0f) - | ((left >> 12) & 0x0000f0f0); - right = ((right << 6) & 0x33003300) - | (right & 0xcc33cc33) - | ((right >> 6) & 0x00cc00cc); - right = ((right << 12) & 0x0f0f0000) - | (right & 0xf0f00f0f) - | ((right >> 12) & 0x0000f0f0); - - for(j = 0; j < 3; j++){ - if((ende & 1) == DES3D) { - key = &expanded_key[2-j][32-2]; - keystep = -2; - } else { - key = &expanded_key[j][0]; - keystep = 2; - } - ende >>= 1; - for (i = 0; i < 8; i++) { - v0 = key[0]; - v0 ^= (right >> 1) | (right << 31); - left ^= fetch(0, v0, 24) - ^ fetch(2, v0, 16) - ^ fetch(4, v0, 8) - ^ fetch(6, v0, 0); - v1 = key[1]; - v1 ^= (right << 3) | (right >> 29); - left ^= fetch(1, v1, 24) - ^ fetch(3, v1, 16) - ^ fetch(5, v1, 8) - ^ fetch(7, v1, 0); - key += keystep; - - v0 = key[0]; - v0 ^= (left >> 1) | (left << 31); - right ^= fetch(0, v0, 24) - ^ fetch(2, v0, 16) - ^ fetch(4, v0, 8) - ^ fetch(6, v0, 0); - v1 = key[1]; - v1 ^= (left << 3) | (left >> 29); - right ^= fetch(1, v1, 24) - ^ fetch(3, v1, 16) - ^ fetch(5, v1, 8) - ^ fetch(7, v1, 0); - key += keystep; - } - - v0 = left; - left = right; - right = v0; - } - - /* - * final permutation, inverse initial permutation - * left and right are swapped here - */ - v0 = ((right << 1) & 0xaaaaaaaa) | (left & 0x55555555); - v1 = (right & 0xaaaaaaaa) | ((left >> 1) & 0x55555555); - v1 = ((v1 << 6) & 0x33003300) - | (v1 & 0xcc33cc33) - | ((v1 >> 6) & 0x00cc00cc); - v1 = ((v1 << 12) & 0x0f0f0000) - | (v1 & 0xf0f00f0f) - | ((v1 >> 12) & 0x0000f0f0); - v0 = ((v0 << 6) & 0x33003300) - | (v0 & 0xcc33cc33) - | ((v0 >> 6) & 0x00cc00cc); - v0 = ((v0 << 12) & 0x0f0f0000) - | (v0 & 0xf0f00f0f) - | ((v0 >> 12) & 0x0000f0f0); - text[0] = v0; - text[2] = v0 >> 8; - text[4] = v0 >> 16; - text[6] = v0 >> 24; - text[1] = v1; - text[3] = v1 >> 8; - text[5] = v1 >> 16; - text[7] = v1 >> 24; -} - -/* - * key compression permutation, 4 bits at a time - */ -static u32int comptab[] = { - -0x000000,0x010000,0x000008,0x010008,0x000080,0x010080,0x000088,0x010088, -0x000000,0x010000,0x000008,0x010008,0x000080,0x010080,0x000088,0x010088, - -0x000000,0x100000,0x000800,0x100800,0x000000,0x100000,0x000800,0x100800, -0x002000,0x102000,0x002800,0x102800,0x002000,0x102000,0x002800,0x102800, - -0x000000,0x000004,0x000400,0x000404,0x000000,0x000004,0x000400,0x000404, -0x400000,0x400004,0x400400,0x400404,0x400000,0x400004,0x400400,0x400404, - -0x000000,0x000020,0x008000,0x008020,0x800000,0x800020,0x808000,0x808020, -0x000002,0x000022,0x008002,0x008022,0x800002,0x800022,0x808002,0x808022, - -0x000000,0x000200,0x200000,0x200200,0x001000,0x001200,0x201000,0x201200, -0x000000,0x000200,0x200000,0x200200,0x001000,0x001200,0x201000,0x201200, - -0x000000,0x000040,0x000010,0x000050,0x004000,0x004040,0x004010,0x004050, -0x040000,0x040040,0x040010,0x040050,0x044000,0x044040,0x044010,0x044050, - -0x000000,0x000100,0x020000,0x020100,0x000001,0x000101,0x020001,0x020101, -0x080000,0x080100,0x0a0000,0x0a0100,0x080001,0x080101,0x0a0001,0x0a0101, - -0x000000,0x000100,0x040000,0x040100,0x000000,0x000100,0x040000,0x040100, -0x000040,0x000140,0x040040,0x040140,0x000040,0x000140,0x040040,0x040140, - -0x000000,0x400000,0x008000,0x408000,0x000008,0x400008,0x008008,0x408008, -0x000400,0x400400,0x008400,0x408400,0x000408,0x400408,0x008408,0x408408, - -0x000000,0x001000,0x080000,0x081000,0x000020,0x001020,0x080020,0x081020, -0x004000,0x005000,0x084000,0x085000,0x004020,0x005020,0x084020,0x085020, - -0x000000,0x000800,0x000000,0x000800,0x000010,0x000810,0x000010,0x000810, -0x800000,0x800800,0x800000,0x800800,0x800010,0x800810,0x800010,0x800810, - -0x000000,0x010000,0x000200,0x010200,0x000000,0x010000,0x000200,0x010200, -0x100000,0x110000,0x100200,0x110200,0x100000,0x110000,0x100200,0x110200, - -0x000000,0x000004,0x000000,0x000004,0x000080,0x000084,0x000080,0x000084, -0x002000,0x002004,0x002000,0x002004,0x002080,0x002084,0x002080,0x002084, - -0x000000,0x000001,0x200000,0x200001,0x020000,0x020001,0x220000,0x220001, -0x000002,0x000003,0x200002,0x200003,0x020002,0x020003,0x220002,0x220003, -}; - -static int keysh[] = -{ - 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, -}; - -static void -keycompperm(u32int left, u32int right, ulong *ek) -{ - u32int v0, v1; - int i; - - for(i = 0; i < 16; i++){ - left = (left << keysh[i]) | (left >> (28 - keysh[i])); - left &= 0xfffffff0; - right = (right << keysh[i]) | (right >> (28 - keysh[i])); - right &= 0xfffffff0; - v0 = comptab[6 * (1 << 4) + ((left >> (32-4)) & 0xf)] - | comptab[5 * (1 << 4) + ((left >> (32-8)) & 0xf)] - | comptab[4 * (1 << 4) + ((left >> (32-12)) & 0xf)] - | comptab[3 * (1 << 4) + ((left >> (32-16)) & 0xf)] - | comptab[2 * (1 << 4) + ((left >> (32-20)) & 0xf)] - | comptab[1 * (1 << 4) + ((left >> (32-24)) & 0xf)] - | comptab[0 * (1 << 4) + ((left >> (32-28)) & 0xf)]; - v1 = comptab[13 * (1 << 4) + ((right >> (32-4)) & 0xf)] - | comptab[12 * (1 << 4) + ((right >> (32-8)) & 0xf)] - | comptab[11 * (1 << 4) + ((right >> (32-12)) & 0xf)] - | comptab[10 * (1 << 4) + ((right >> (32-16)) & 0xf)] - | comptab[9 * (1 << 4) + ((right >> (32-20)) & 0xf)] - | comptab[8 * (1 << 4) + ((right >> (32-24)) & 0xf)] - | comptab[7 * (1 << 4) + ((right >> (32-28)) & 0xf)]; - ek[0] = (((v0 >> (24-6)) & 0x3f) << 26) - | (((v0 >> (24-18)) & 0x3f) << 18) - | (((v1 >> (24-6)) & 0x3f) << 10) - | (((v1 >> (24-18)) & 0x3f) << 2); - ek[1] = (((v0 >> (24-12)) & 0x3f) << 26) - | (((v0 >> (24-24)) & 0x3f) << 18) - | (((v1 >> (24-12)) & 0x3f) << 10) - | (((v1 >> (24-24)) & 0x3f) << 2); - ek += 2; - } -} - -void -des_key_setup(uchar key[8], ulong *ek) -{ - u32int left, right, v0, v1; - - v0 = key[0] | ((u32int)key[2] << 8) | ((u32int)key[4] << 16) | ((u32int)key[6] << 24); - v1 = key[1] | ((u32int)key[3] << 8) | ((u32int)key[5] << 16) | ((u32int)key[7] << 24); - left = ((v0 >> 1) & 0x40404040) - | ((v0 >> 2) & 0x10101010) - | ((v0 >> 3) & 0x04040404) - | ((v0 >> 4) & 0x01010101) - | ((v1 >> 0) & 0x80808080) - | ((v1 >> 1) & 0x20202020) - | ((v1 >> 2) & 0x08080808) - | ((v1 >> 3) & 0x02020202); - right = ((v0 >> 1) & 0x04040404) - | ((v0 << 2) & 0x10101010) - | ((v0 << 5) & 0x40404040) - | ((v1 << 0) & 0x08080808) - | ((v1 << 3) & 0x20202020) - | ((v1 << 6) & 0x80808080); - left = ((left << 6) & 0x33003300) - | (left & 0xcc33cc33) - | ((left >> 6) & 0x00cc00cc); - v0 = ((left << 12) & 0x0f0f0000) - | (left & 0xf0f00f0f) - | ((left >> 12) & 0x0000f0f0); - right = ((right << 6) & 0x33003300) - | (right & 0xcc33cc33) - | ((right >> 6) & 0x00cc00cc); - v1 = ((right << 12) & 0x0f0f0000) - | (right & 0xf0f00f0f) - | ((right >> 12) & 0x0000f0f0); - left = v0 & 0xfffffff0; - right = (v1 & 0xffffff00) | ((v0 << 4) & 0xf0); - - keycompperm(left, right, ek); -} - -static uchar parity[128] = -{ - 0x01, 0x02, 0x04, 0x07, 0x08, 0x0b, 0x0d, 0x0e, - 0x10, 0x13, 0x15, 0x16, 0x19, 0x1a, 0x1c, 0x1f, - 0x20, 0x23, 0x25, 0x26, 0x29, 0x2a, 0x2c, 0x2f, - 0x31, 0x32, 0x34, 0x37, 0x38, 0x3b, 0x3d, 0x3e, - 0x40, 0x43, 0x45, 0x46, 0x49, 0x4a, 0x4c, 0x4f, - 0x51, 0x52, 0x54, 0x57, 0x58, 0x5b, 0x5d, 0x5e, - 0x61, 0x62, 0x64, 0x67, 0x68, 0x6b, 0x6d, 0x6e, - 0x70, 0x73, 0x75, 0x76, 0x79, 0x7a, 0x7c, 0x7f, - 0x80, 0x83, 0x85, 0x86, 0x89, 0x8a, 0x8c, 0x8f, - 0x91, 0x92, 0x94, 0x97, 0x98, 0x9b, 0x9d, 0x9e, - 0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xab, 0xad, 0xae, - 0xb0, 0xb3, 0xb5, 0xb6, 0xb9, 0xba, 0xbc, 0xbf, - 0xc1, 0xc2, 0xc4, 0xc7, 0xc8, 0xcb, 0xcd, 0xce, - 0xd0, 0xd3, 0xd5, 0xd6, 0xd9, 0xda, 0xdc, 0xdf, - 0xe0, 0xe3, 0xe5, 0xe6, 0xe9, 0xea, 0xec, 0xef, - 0xf1, 0xf2, 0xf4, 0xf7, 0xf8, 0xfb, 0xfd, 0xfe, -}; - -/* - * convert a 7 byte key to an 8 byte one - */ -void -des56to64(uchar *k56, uchar *k64) -{ - u32int hi, lo; - - hi = ((u32int)k56[0]<<24)|((u32int)k56[1]<<16)|((u32int)k56[2]<<8)|k56[3]; - lo = ((u32int)k56[4]<<24)|((u32int)k56[5]<<16)|((u32int)k56[6]<<8); - - k64[0] = parity[(hi>>25)&0x7f]; - k64[1] = parity[(hi>>18)&0x7f]; - k64[2] = parity[(hi>>11)&0x7f]; - k64[3] = parity[(hi>>4)&0x7f]; - k64[4] = parity[((hi<<3)|(lo>>29))&0x7f]; - k64[5] = parity[(lo>>22)&0x7f]; - k64[6] = parity[(lo>>15)&0x7f]; - k64[7] = parity[(lo>>8)&0x7f]; -} - -/* - * convert an 8 byte key to a 7 byte one - */ -void -des64to56(uchar *k64, uchar *k56) -{ - u32int hi, lo; - - hi = (((u32int)k64[0]&0xfe)<<24)|(((u32int)k64[1]&0xfe)<<17)|(((u32int)k64[2]&0xfe)<<10) - |((k64[3]&0xfe)<<3)|(k64[4]>>4); - lo = (((u32int)k64[4]&0xfe)<<28)|(((u32int)k64[5]&0xfe)<<21)|(((u32int)k64[6]&0xfe)<<14) - |(((u32int)k64[7]&0xfe)<<7); - - k56[0] = hi>>24; - k56[1] = hi>>16; - k56[2] = hi>>8; - k56[3] = hi>>0; - k56[4] = lo>>24; - k56[5] = lo>>16; - k56[6] = lo>>8; -} - -void -key_setup(uchar key[7], ulong *ek) -{ - uchar k64[8]; - - des56to64(key, k64); - des_key_setup(k64, ek); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/des3CBC.c b/sys/src/cmd/unix/drawterm/libsec/des3CBC.c deleted file mode 100644 index 263293004..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/des3CBC.c +++ /dev/null @@ -1,59 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// Because of the way that non multiple of 8 -// buffers are handled, the decryptor must -// be fed buffers of the same size as the -// encryptor - - -// If the length is not a multiple of 8, I encrypt -// the overflow to be compatible with lacy's cryptlib -void -des3CBCencrypt(uchar *p, int len, DES3state *s) -{ - uchar *p2, *ip, *eip; - - for(; len >= 8; len -= 8){ - p2 = p; - ip = s->ivec; - for(eip = ip+8; ip < eip; ) - *p2++ ^= *ip++; - triple_block_cipher(s->expanded, p, DES3EDE); - memmove(s->ivec, p, 8); - p += 8; - } - - if(len > 0){ - ip = s->ivec; - triple_block_cipher(s->expanded, ip, DES3EDE); - for(eip = ip+len; ip < eip; ) - *p++ ^= *ip++; - } -} - -void -des3CBCdecrypt(uchar *p, int len, DES3state *s) -{ - uchar *ip, *eip, *tp; - uchar tmp[8]; - - for(; len >= 8; len -= 8){ - memmove(tmp, p, 8); - triple_block_cipher(s->expanded, p, DES3DED); - tp = tmp; - ip = s->ivec; - for(eip = ip+8; ip < eip; ){ - *p++ ^= *ip; - *ip++ = *tp++; - } - } - - if(len > 0){ - ip = s->ivec; - triple_block_cipher(s->expanded, ip, DES3EDE); - for(eip = ip+len; ip < eip; ) - *p++ ^= *ip++; - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/des3ECB.c b/sys/src/cmd/unix/drawterm/libsec/des3ECB.c deleted file mode 100644 index 324254b19..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/des3ECB.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// I wasn't sure what to do when the buffer was not -// a multiple of 8. I did what lacy's cryptolib did -// to be compatible, but it looks dangerous to me -// since its encrypting plain text with the key. -- presotto - -void -des3ECBencrypt(uchar *p, int len, DES3state *s) -{ - int i; - uchar tmp[8]; - - for(; len >= 8; len -= 8){ - triple_block_cipher(s->expanded, p, DES3EDE); - p += 8; - } - - if(len > 0){ - for (i=0; i<8; i++) - tmp[i] = i; - triple_block_cipher(s->expanded, tmp, DES3EDE); - for (i = 0; i < len; i++) - p[i] ^= tmp[i]; - } -} - -void -des3ECBdecrypt(uchar *p, int len, DES3state *s) -{ - int i; - uchar tmp[8]; - - for(; len >= 8; len -= 8){ - triple_block_cipher(s->expanded, p, DES3DED); - p += 8; - } - - if(len > 0){ - for (i=0; i<8; i++) - tmp[i] = i; - triple_block_cipher(s->expanded, tmp, DES3EDE); - for (i = 0; i < len; i++) - p[i] ^= tmp[i]; - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/desCBC.c b/sys/src/cmd/unix/drawterm/libsec/desCBC.c deleted file mode 100644 index ecee29e80..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/desCBC.c +++ /dev/null @@ -1,59 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// Because of the way that non multiple of 8 -// buffers are handled, the decryptor must -// be fed buffers of the same size as the -// encryptor - - -// If the length is not a multiple of 8, I encrypt -// the overflow to be compatible with lacy's cryptlib -void -desCBCencrypt(uchar *p, int len, DESstate *s) -{ - uchar *p2, *ip, *eip; - - for(; len >= 8; len -= 8){ - p2 = p; - ip = s->ivec; - for(eip = ip+8; ip < eip; ) - *p2++ ^= *ip++; - block_cipher(s->expanded, p, 0); - memmove(s->ivec, p, 8); - p += 8; - } - - if(len > 0){ - ip = s->ivec; - block_cipher(s->expanded, ip, 0); - for(eip = ip+len; ip < eip; ) - *p++ ^= *ip++; - } -} - -void -desCBCdecrypt(uchar *p, int len, DESstate *s) -{ - uchar *ip, *eip, *tp; - uchar tmp[8]; - - for(; len >= 8; len -= 8){ - memmove(tmp, p, 8); - block_cipher(s->expanded, p, 1); - tp = tmp; - ip = s->ivec; - for(eip = ip+8; ip < eip; ){ - *p++ ^= *ip; - *ip++ = *tp++; - } - } - - if(len > 0){ - ip = s->ivec; - block_cipher(s->expanded, ip, 0); - for(eip = ip+len; ip < eip; ) - *p++ ^= *ip++; - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/desECB.c b/sys/src/cmd/unix/drawterm/libsec/desECB.c deleted file mode 100644 index a9ad00185..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/desECB.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// I wasn't sure what to do when the buffer was not -// a multiple of 8. I did what lacy's cryptolib did -// to be compatible, but it looks dangerous to me -// since its encrypting plain text with the key. -- presotto - -void -desECBencrypt(uchar *p, int len, DESstate *s) -{ - int i; - uchar tmp[8]; - - for(; len >= 8; len -= 8){ - block_cipher(s->expanded, p, 0); - p += 8; - } - - if(len > 0){ - for (i=0; i<8; i++) - tmp[i] = i; - block_cipher(s->expanded, tmp, 0); - for (i = 0; i < len; i++) - p[i] ^= tmp[i]; - } -} - -void -desECBdecrypt(uchar *p, int len, DESstate *s) -{ - int i; - uchar tmp[8]; - - for(; len >= 8; len -= 8){ - block_cipher(s->expanded, p, 1); - p += 8; - } - - if(len > 0){ - for (i=0; i<8; i++) - tmp[i] = i; - block_cipher(s->expanded, tmp, 0); - for (i = 0; i < len; i++) - p[i] ^= tmp[i]; - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/desmodes.c b/sys/src/cmd/unix/drawterm/libsec/desmodes.c deleted file mode 100644 index da6d98410..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/desmodes.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "os.h" -#include <libsec.h> - -/* - * these routines use the 64bit format for - * DES keys. - */ - -void -setupDESstate(DESstate *s, uchar key[8], uchar *ivec) -{ - memset(s, 0, sizeof(*s)); - memmove(s->key, key, sizeof(s->key)); - des_key_setup(key, s->expanded); - if(ivec) - memmove(s->ivec, ivec, 8); - s->setup = 0xdeadbeef; -} - -void -setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec) -{ - memset(s, 0, sizeof(*s)); - memmove(s->key, key, sizeof(s->key)); - des_key_setup(key[0], s->expanded[0]); - des_key_setup(key[1], s->expanded[1]); - des_key_setup(key[2], s->expanded[2]); - if(ivec) - memmove(s->ivec, ivec, 8); - s->setup = 0xdeadbeef; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/dsaalloc.c b/sys/src/cmd/unix/drawterm/libsec/dsaalloc.c deleted file mode 100644 index 6a48f03eb..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/dsaalloc.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -DSApub* -dsapuballoc(void) -{ - DSApub *dsa; - - dsa = mallocz(sizeof(*dsa), 1); - if(dsa == nil) - sysfatal("dsapuballoc"); - return dsa; -} - -void -dsapubfree(DSApub *dsa) -{ - if(dsa == nil) - return; - mpfree(dsa->p); - mpfree(dsa->q); - mpfree(dsa->alpha); - mpfree(dsa->key); -} - - -DSApriv* -dsaprivalloc(void) -{ - DSApriv *dsa; - - dsa = mallocz(sizeof(*dsa), 1); - if(dsa == nil) - sysfatal("dsaprivalloc"); - return dsa; -} - -void -dsaprivfree(DSApriv *dsa) -{ - if(dsa == nil) - return; - mpfree(dsa->pub.p); - mpfree(dsa->pub.q); - mpfree(dsa->pub.alpha); - mpfree(dsa->pub.key); - mpfree(dsa->secret); -} - -DSAsig* -dsasigalloc(void) -{ - DSAsig *dsa; - - dsa = mallocz(sizeof(*dsa), 1); - if(dsa == nil) - sysfatal("dsasigalloc"); - return dsa; -} - -void -dsasigfree(DSAsig *dsa) -{ - if(dsa == nil) - return; - mpfree(dsa->r); - mpfree(dsa->s); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/dsagen.c b/sys/src/cmd/unix/drawterm/libsec/dsagen.c deleted file mode 100644 index ccdd918df..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/dsagen.c +++ /dev/null @@ -1,61 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -DSApriv* -dsagen(DSApub *opub) -{ - DSApub *pub; - DSApriv *priv; - mpint *exp; - mpint *g; - mpint *r; - int bits; - - priv = dsaprivalloc(); - pub = &priv->pub; - - if(opub != nil){ - pub->p = mpcopy(opub->p); - pub->q = mpcopy(opub->q); - } else { - pub->p = mpnew(0); - pub->q = mpnew(0); - DSAprimes(pub->q, pub->p, nil); - } - bits = Dbits*pub->p->top; - - pub->alpha = mpnew(0); - pub->key = mpnew(0); - priv->secret = mpnew(0); - - // find a generator alpha of the multiplicative - // group Z*p, i.e., of order n = p-1. We use the - // fact that q divides p-1 to reduce the exponent. - // - // This isn't very efficient. If anyone has a better - // idea, mail presotto@closedmind.org - exp = mpnew(0); - g = mpnew(0); - r = mpnew(0); - mpsub(pub->p, mpone, exp); - mpdiv(exp, pub->q, exp, r); - if(mpcmp(r, mpzero) != 0) - sysfatal("dsagen foul up"); - while(1){ - mprand(bits, genrandom, g); - mpmod(g, pub->p, g); - mpexp(g, exp, pub->p, pub->alpha); - if(mpcmp(pub->alpha, mpone) != 0) - break; - } - mpfree(g); - mpfree(exp); - - // create the secret key - mprand(bits, genrandom, priv->secret); - mpmod(priv->secret, pub->p, priv->secret); - mpexp(pub->alpha, priv->secret, pub->p, pub->key); - - return priv; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/dsaprimes.c b/sys/src/cmd/unix/drawterm/libsec/dsaprimes.c deleted file mode 100644 index ff1dd5d87..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/dsaprimes.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// NIST algorithm for generating DSA primes -// Menezes et al (1997) Handbook of Applied Cryptography, p.151 -// q is a 160-bit prime; p is a 1024-bit prime; q divides p-1 - -// arithmetic on unsigned ints mod 2**160, represented -// as 20-byte, little-endian uchar array - -static void -Hrand(uchar *s) -{ - ulong *u = (ulong*)s; - *u++ = fastrand(); - *u++ = fastrand(); - *u++ = fastrand(); - *u++ = fastrand(); - *u = fastrand(); -} - -static void -Hincr(uchar *s) -{ - int i; - for(i=0; i<20; i++) - if(++s[i]!=0) - break; -} - -// this can run for quite a while; be patient -void -DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]) -{ - int i, j, k, n = 6, b = 63; - uchar s[SHA1dlen], Hs[SHA1dlen], Hs1[SHA1dlen], sj[SHA1dlen], sjk[SHA1dlen]; - mpint *two1023, *mb, *Vk, *W, *X, *q2; - - two1023 = mpnew(1024); - mpleft(mpone, 1023, two1023); - mb = mpnew(0); - mpleft(mpone, b, mb); - W = mpnew(1024); - Vk = mpnew(1024); - X = mpnew(0); - q2 = mpnew(0); -forever: - do{ - Hrand(s); - memcpy(sj, s, 20); - sha1(s, 20, Hs, 0); - Hincr(sj); - sha1(sj, 20, Hs1, 0); - for(i=0; i<20; i++) - Hs[i] ^= Hs1[i]; - Hs[0] |= 1; - Hs[19] |= 0x80; - letomp(Hs, 20, q); - }while(!probably_prime(q, 18)); - if(seed != nil) // allow skeptics to confirm computation - memmove(seed, s, SHA1dlen); - i = 0; - j = 2; - Hincr(sj); - mpleft(q, 1, q2); - while(i<4096){ - memcpy(sjk, sj, 20); - for(k=0; k <= n; k++){ - sha1(sjk, 20, Hs, 0); - letomp(Hs, 20, Vk); - if(k == n) - mpmod(Vk, mb, Vk); - mpleft(Vk, 160*k, Vk); - mpadd(W, Vk, W); - Hincr(sjk); - } - mpadd(W, two1023, X); - mpmod(X, q2, W); - mpsub(W, mpone, W); - mpsub(X, W, p); - if(mpcmp(p, two1023)>=0 && probably_prime(p, 5)) - goto done; - i += 1; - j += n+1; - for(k=0; k<n+1; k++) - Hincr(sj); - } - goto forever; -done: - mpfree(q2); - mpfree(X); - mpfree(Vk); - mpfree(W); - mpfree(mb); - mpfree(two1023); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/dsaprivtopub.c b/sys/src/cmd/unix/drawterm/libsec/dsaprivtopub.c deleted file mode 100644 index e1790cae1..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/dsaprivtopub.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -DSApub* -dsaprivtopub(DSApriv *priv) -{ - DSApub *pub; - - pub = dsapuballoc(); - pub->p = mpcopy(priv->pub.p); - pub->q = mpcopy(priv->pub.q); - pub->alpha = mpcopy(priv->pub.alpha); - pub->key = mpcopy(priv->pub.key); - return pub; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/dsasign.c b/sys/src/cmd/unix/drawterm/libsec/dsasign.c deleted file mode 100644 index abca3eb69..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/dsasign.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -DSAsig* -dsasign(DSApriv *priv, mpint *m) -{ - DSApub *pub = &priv->pub; - DSAsig *sig; - mpint *qm1, *k, *kinv, *r, *s; - mpint *q = pub->q, *p = pub->p, *alpha = pub->alpha; - int qlen = mpsignif(q); - - qm1 = mpnew(0); - kinv = mpnew(0); - r = mpnew(0); - s = mpnew(0); - k = mpnew(0); - mpsub(pub->q, mpone, qm1); - - // find a k that has an inverse mod q - while(1){ - mprand(qlen, genrandom, k); - if((mpcmp(mpone, k) > 0) || (mpcmp(k, qm1) >= 0)) - continue; - mpextendedgcd(k, q, r, kinv, s); - if(mpcmp(r, mpone) != 0) - continue; - break; - } - - // make kinv positive - mpmod(kinv, qm1, kinv); - - // r = ((alpha**k) mod p) mod q - mpexp(alpha, k, p, r); - mpmod(r, q, r); - - // s = (kinv*(m + ar)) mod q - mpmul(r, priv->secret, s); - mpadd(s, m, s); - mpmul(s, kinv, s); - mpmod(s, q, s); - - sig = dsasigalloc(); - sig->r = r; - sig->s = s; - mpfree(qm1); - mpfree(k); - mpfree(kinv); - return sig; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/dsaverify.c b/sys/src/cmd/unix/drawterm/libsec/dsaverify.c deleted file mode 100644 index 23cee501f..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/dsaverify.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -int -dsaverify(DSApub *pub, DSAsig *sig, mpint *m) -{ - int rv = -1; - mpint *u1, *u2, *v, *sinv; - - if(sig->r->sign < 0 || mpcmp(sig->r, pub->q) >= 0) - return rv; - if(sig->s->sign < 0 || mpcmp(sig->s, pub->q) >= 0) - return rv; - u1 = mpnew(0); - u2 = mpnew(0); - v = mpnew(0); - sinv = mpnew(0); - - // find (s**-1) mod q, make sure it exists - mpextendedgcd(sig->s, pub->q, u1, sinv, v); - if(mpcmp(u1, mpone) != 0) - goto out; - - // u1 = (sinv * m) mod q, u2 = (r * sinv) mod q - mpmul(sinv, m, u1); - mpmod(u1, pub->q, u1); - mpmul(sig->r, sinv, u2); - mpmod(u2, pub->q, u2); - - // v = (((alpha**u1)*(key**u2)) mod p) mod q - mpexp(pub->alpha, u1, pub->p, sinv); - mpexp(pub->key, u2, pub->p, v); - mpmul(sinv, v, v); - mpmod(v, pub->p, v); - mpmod(v, pub->q, v); - - if(mpcmp(v, sig->r) == 0) - rv = 0; -out: - mpfree(v); - mpfree(u1); - mpfree(u2); - mpfree(sinv); - return rv; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/egalloc.c b/sys/src/cmd/unix/drawterm/libsec/egalloc.c deleted file mode 100644 index d7c940a16..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/egalloc.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -EGpub* -egpuballoc(void) -{ - EGpub *eg; - - eg = mallocz(sizeof(*eg), 1); - if(eg == nil) - sysfatal("egpuballoc"); - return eg; -} - -void -egpubfree(EGpub *eg) -{ - if(eg == nil) - return; - mpfree(eg->p); - mpfree(eg->alpha); - mpfree(eg->key); -} - - -EGpriv* -egprivalloc(void) -{ - EGpriv *eg; - - eg = mallocz(sizeof(*eg), 1); - if(eg == nil) - sysfatal("egprivalloc"); - return eg; -} - -void -egprivfree(EGpriv *eg) -{ - if(eg == nil) - return; - mpfree(eg->pub.p); - mpfree(eg->pub.alpha); - mpfree(eg->pub.key); - mpfree(eg->secret); -} - -EGsig* -egsigalloc(void) -{ - EGsig *eg; - - eg = mallocz(sizeof(*eg), 1); - if(eg == nil) - sysfatal("egsigalloc"); - return eg; -} - -void -egsigfree(EGsig *eg) -{ - if(eg == nil) - return; - mpfree(eg->r); - mpfree(eg->s); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/egdecrypt.c b/sys/src/cmd/unix/drawterm/libsec/egdecrypt.c deleted file mode 100644 index 245788006..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/egdecrypt.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -mpint* -egdecrypt(EGpriv *priv, mpint *in, mpint *out) -{ - EGpub *pub = &priv->pub; - mpint *gamma, *delta; - mpint *p = pub->p; - int plen = mpsignif(p)+1; - int shift = ((plen+Dbits-1)/Dbits)*Dbits; - - if(out == nil) - out = mpnew(0); - gamma = mpnew(0); - delta = mpnew(0); - mpright(in, shift, gamma); - mpleft(gamma, shift, delta); - mpsub(in, delta, delta); - mpexp(gamma, priv->secret, p, out); - mpinvert(out, p, gamma); - mpmul(gamma, delta, out); - mpmod(out, p, out); - mpfree(gamma); - mpfree(delta); - return out; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/egencrypt.c b/sys/src/cmd/unix/drawterm/libsec/egencrypt.c deleted file mode 100644 index 9b6b12c6c..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/egencrypt.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -mpint* -egencrypt(EGpub *pub, mpint *in, mpint *out) -{ - mpint *m, *k, *gamma, *delta, *pm1; - mpint *p = pub->p, *alpha = pub->alpha; - int plen = mpsignif(p); - int shift = ((plen+Dbits)/Dbits)*Dbits; - // in libcrypt version, (int)(LENGTH(pub->p)*sizeof(NumType)*CHARBITS); - - if(out == nil) - out = mpnew(0); - pm1 = mpnew(0); - m = mpnew(0); - gamma = mpnew(0); - delta = mpnew(0); - mpmod(in, p, m); - while(1){ - k = mprand(plen, genrandom, nil); - if((mpcmp(mpone, k) <= 0) && (mpcmp(k, pm1) < 0)) - break; - } - mpexp(alpha, k, p, gamma); - mpexp(pub->key, k, p, delta); - mpmul(m, delta, delta); - mpmod(delta, p, delta); - mpleft(gamma, shift, out); - mpadd(delta, out, out); - mpfree(pm1); - mpfree(m); - mpfree(k); - mpfree(gamma); - mpfree(delta); - return out; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/eggen.c b/sys/src/cmd/unix/drawterm/libsec/eggen.c deleted file mode 100644 index 9ea7d9988..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/eggen.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -EGpriv* -eggen(int nlen, int rounds) -{ - EGpub *pub; - EGpriv *priv; - - priv = egprivalloc(); - pub = &priv->pub; - pub->p = mpnew(0); - pub->alpha = mpnew(0); - pub->key = mpnew(0); - priv->secret = mpnew(0); - gensafeprime(pub->p, pub->alpha, nlen, rounds); - mprand(nlen-1, genrandom, priv->secret); - mpexp(pub->alpha, priv->secret, pub->p, pub->key); - return priv; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/egprivtopub.c b/sys/src/cmd/unix/drawterm/libsec/egprivtopub.c deleted file mode 100644 index e22c5c311..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/egprivtopub.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -EGpub* -egprivtopub(EGpriv *priv) -{ - EGpub *pub; - - pub = egpuballoc(); - if(pub == nil) - return nil; - pub->p = mpcopy(priv->pub.p); - pub->alpha = mpcopy(priv->pub.alpha); - pub->key = mpcopy(priv->pub.key); - return pub; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/egsign.c b/sys/src/cmd/unix/drawterm/libsec/egsign.c deleted file mode 100644 index 10540041c..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/egsign.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -EGsig* -egsign(EGpriv *priv, mpint *m) -{ - EGpub *pub = &priv->pub; - EGsig *sig; - mpint *pm1, *k, *kinv, *r, *s; - mpint *p = pub->p, *alpha = pub->alpha; - int plen = mpsignif(p); - - pm1 = mpnew(0); - kinv = mpnew(0); - r = mpnew(0); - s = mpnew(0); - k = mpnew(0); - mpsub(p, mpone, pm1); - while(1){ - mprand(plen, genrandom, k); - if((mpcmp(mpone, k) > 0) || (mpcmp(k, pm1) >= 0)) - continue; - mpextendedgcd(k, pm1, r, kinv, s); - if(mpcmp(r, mpone) != 0) - continue; - break; - } - mpmod(kinv, pm1, kinv); // make kinv positive - mpexp(alpha, k, p, r); - mpmul(priv->secret, r, s); - mpmod(s, pm1, s); - mpsub(m, s, s); - mpmul(kinv, s, s); - mpmod(s, pm1, s); - sig = egsigalloc(); - sig->r = r; - sig->s = s; - mpfree(pm1); - mpfree(k); - mpfree(kinv); - return sig; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/egtest.c b/sys/src/cmd/unix/drawterm/libsec/egtest.c deleted file mode 100644 index 41b438dcf..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/egtest.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -void -main(void) -{ - EGpriv *sk; - mpint *m, *gamma, *delta, *in, *out; - int plen, shift; - - fmtinstall('B', mpconv); - - sk = egprivalloc(); - sk->pub.p = uitomp(2357, nil); - sk->pub.alpha = uitomp(2, nil); - sk->pub.key = uitomp(1185, nil); - sk->secret = uitomp(1751, nil); - - m = uitomp(2035, nil); - - plen = mpsignif(sk->pub.p)+1; - shift = ((plen+Dbits-1)/Dbits)*Dbits; - gamma = uitomp(1430, nil); - delta = uitomp(697, nil); - out = mpnew(0); - in = mpnew(0); - mpleft(gamma, shift, in); - mpadd(delta, in, in); - egdecrypt(sk, in, out); - - if(mpcmp(m, out) != 0) - print("decrypt failed to recover message\n"); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/egverify.c b/sys/src/cmd/unix/drawterm/libsec/egverify.c deleted file mode 100644 index 29a95156c..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/egverify.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -int -egverify(EGpub *pub, EGsig *sig, mpint *m) -{ - mpint *p = pub->p, *alpha = pub->alpha; - mpint *r = sig->r, *s = sig->s; - mpint *v1, *v2, *rs; - int rv = -1; - - if(mpcmp(r, mpone) < 0 || mpcmp(r, p) >= 0) - return rv; - v1 = mpnew(0); - rs = mpnew(0); - v2 = mpnew(0); - mpexp(pub->key, r, p, v1); - mpexp(r, s, p, rs); - mpmul(v1, rs, v1); - mpmod(v1, p, v1); - mpexp(alpha, m, p, v2); - if(mpcmp(v1, v2) == 0) - rv = 0; - mpfree(v1); - mpfree(rs); - mpfree(v2); - return rv; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/fastrand.c b/sys/src/cmd/unix/drawterm/libsec/fastrand.c deleted file mode 100644 index 145712774..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/fastrand.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -/* - * use the X917 random number generator to create random - * numbers (faster than truerand() but not as random). - */ -ulong -fastrand(void) -{ - ulong x; - - genrandom((uchar*)&x, sizeof x); - return x; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/genprime.c b/sys/src/cmd/unix/drawterm/libsec/genprime.c deleted file mode 100644 index c0e16d92b..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/genprime.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// generate a probable prime. accuracy is the miller-rabin interations -void -genprime(mpint *p, int n, int accuracy) -{ - mpdigit x; - - // generate n random bits with high and low bits set - mpbits(p, n); - genrandom((uchar*)p->p, (n+7)/8); - p->top = (n+Dbits-1)/Dbits; - x = 1; - x <<= ((n-1)%Dbits); - p->p[p->top-1] &= (x-1); - p->p[p->top-1] |= x; - p->p[0] |= 1; - - // keep icrementing till it looks prime - for(;;){ - if(probably_prime(p, accuracy)) - break; - mpadd(p, mptwo, p); - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/genrandom.c b/sys/src/cmd/unix/drawterm/libsec/genrandom.c deleted file mode 100644 index 2cbaeb8c4..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/genrandom.c +++ /dev/null @@ -1,62 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -typedef struct State{ - QLock lock; - int seeded; - uvlong seed; - DES3state des3; -} State; -static State x917state; - -static void -X917(uchar *rand, int nrand) -{ - int i, m, n8; - uvlong I, x; - - /* 1. Compute intermediate value I = Ek(time). */ - I = nsec(); - triple_block_cipher(x917state.des3.expanded, (uchar*)&I, 0); /* two-key EDE */ - - /* 2. x[i] = Ek(I^seed); seed = Ek(x[i]^I); */ - m = (nrand+7)/8; - for(i=0; i<m; i++){ - x = I ^ x917state.seed; - triple_block_cipher(x917state.des3.expanded, (uchar*)&x, 0); - n8 = (nrand>8) ? 8 : nrand; - memcpy(rand, (uchar*)&x, n8); - rand += 8; - nrand -= 8; - x ^= I; - triple_block_cipher(x917state.des3.expanded, (uchar*)&x, 0); - x917state.seed = x; - } -} - -static void -X917init(void) -{ - int n; - uchar mix[128]; - uchar key3[3][8]; - ulong *ulp; - - ulp = (ulong*)key3; - for(n = 0; n < sizeof(key3)/sizeof(ulong); n++) - ulp[n] = truerand(); - setupDES3state(&x917state.des3, key3, nil); - X917(mix, sizeof mix); - x917state.seeded = 1; -} - -void -genrandom(uchar *p, int n) -{ - qlock(&x917state.lock); - if(x917state.seeded == 0) - X917init(); - X917(p, n); - qunlock(&x917state.lock); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/gensafeprime.c b/sys/src/cmd/unix/drawterm/libsec/gensafeprime.c deleted file mode 100644 index e95c94c99..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/gensafeprime.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// find a prime p of length n and a generator alpha of Z^*_p -// Alg 4.86 Menezes et al () Handbook, p.164 -void -gensafeprime(mpint *p, mpint *alpha, int n, int accuracy) -{ - mpint *q, *b; - - q = mpnew(n-1); - while(1){ - genprime(q, n-1, accuracy); - mpleft(q, 1, p); - mpadd(p, mpone, p); // p = 2*q+1 - if(probably_prime(p, accuracy)) - break; - } - // now find a generator alpha of the multiplicative - // group Z*_p of order p-1=2q - b = mpnew(0); - while(1){ - mprand(n, genrandom, alpha); - mpmod(alpha, p, alpha); - mpmul(alpha, alpha, b); - mpmod(b, p, b); - if(mpcmp(b, mpone) == 0) - continue; - mpexp(alpha, q, p, b); - if(mpcmp(b, mpone) != 0) - break; - } - mpfree(b); - mpfree(q); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/genstrongprime.c b/sys/src/cmd/unix/drawterm/libsec/genstrongprime.c deleted file mode 100644 index 27c43a966..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/genstrongprime.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// Gordon's algorithm for generating a strong prime -// Menezes et al () Handbook, p.150 -void -genstrongprime(mpint *p, int n, int accuracy) -{ - mpint *s, *t, *r, *i; - - if(n < 64) - n = 64; - - s = mpnew(n/2); - genprime(s, (n/2)-16, accuracy); - t = mpnew(n/2); - genprime(t, n-mpsignif(s)-32, accuracy); - - // first r = 2it + 1 that's prime - i = mpnew(16); - r = mpnew(0); - itomp(0x8000, i); - mpleft(t, 1, t); // 2t - mpmul(i, t, r); // 2it - mpadd(r, mpone, r); // 2it + 1 - for(;;){ - if(probably_prime(r, 18)) - break; - mpadd(r, t, r); // r += 2t - } - - // p0 = 2(s**(r-2) mod r)s - 1 - itomp(2, p); - mpsub(r, p, p); - mpexp(s, p, r, p); - mpmul(s, p, p); - mpleft(p, 1, p); - mpsub(p, mpone, p); - - // first p = p0 + 2irs that's prime - itomp(0x8000, i); - mpleft(r, 1, r); // 2r - mpmul(r, s, r); // 2rs - mpmul(r, i, i); // 2irs - mpadd(p, i, p); // p0 + 2irs - for(;;){ - if(probably_prime(p, accuracy)) - break; - mpadd(p, r, p); // p += 2rs - } - - mpfree(i); - mpfree(s); - mpfree(r); - mpfree(t); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/hmac.c b/sys/src/cmd/unix/drawterm/libsec/hmac.c deleted file mode 100644 index c72397380..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/hmac.c +++ /dev/null @@ -1,56 +0,0 @@ -#include "os.h" -#include <libsec.h> - -/* rfc2104 */ -static DigestState* -hmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s, - DigestState*(*x)(uchar*, ulong, uchar*, DigestState*), int xlen) -{ - int i; - uchar pad[65], innerdigest[256]; - - if(xlen > sizeof(innerdigest)) - return nil; - - if(klen>64) - return nil; - - /* first time through */ - if(s == nil){ - for(i=0; i<64; i++) - pad[i] = 0x36; - pad[64] = 0; - for(i=0; i<klen; i++) - pad[i] ^= key[i]; - s = (*x)(pad, 64, nil, nil); - if(s == nil) - return nil; - } - - s = (*x)(p, len, nil, s); - if(digest == nil) - return s; - - /* last time through */ - for(i=0; i<64; i++) - pad[i] = 0x5c; - pad[64] = 0; - for(i=0; i<klen; i++) - pad[i] ^= key[i]; - (*x)(nil, 0, innerdigest, s); - s = (*x)(pad, 64, nil, nil); - (*x)(innerdigest, xlen, digest, s); - return nil; -} - -DigestState* -hmac_sha1(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s) -{ - return hmac_x(p, len, key, klen, digest, s, sha1, SHA1dlen); -} - -DigestState* -hmac_md5(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s) -{ - return hmac_x(p, len, key, klen, digest, s, md5, MD5dlen); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/hmactest.c b/sys/src/cmd/unix/drawterm/libsec/hmactest.c deleted file mode 100644 index 8c7d896dd..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/hmactest.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -uchar key[] = "Jefe"; -uchar data[] = "what do ya want for nothing?"; - -void -main(void) -{ - int i; - uchar hash[MD5dlen]; - - hmac_md5(data, strlen((char*)data), key, 4, hash, nil); - for(i=0; i<MD5dlen; i++) - print("%2.2x", hash[i]); - print("\n"); - print("750c783e6ab0b503eaa86e310a5db738\n"); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/md4.c b/sys/src/cmd/unix/drawterm/libsec/md4.c deleted file mode 100644 index c4a2f32d2..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/md4.c +++ /dev/null @@ -1,271 +0,0 @@ -#include "os.h" -#include <libsec.h> - -/* - * This MD4 is implemented from the description in Stinson's Cryptography, - * theory and practice. -- presotto - */ - -/* - * Rotate ammounts used in the algorithm - */ -enum -{ - S11= 3, - S12= 7, - S13= 11, - S14= 19, - - S21= 3, - S22= 5, - S23= 9, - S24= 13, - - S31= 3, - S32= 9, - S33= 11, - S34= 15, -}; - -typedef struct MD4Table MD4Table; -struct MD4Table -{ - uchar x; /* index into data block */ - uchar rot; /* amount to rotate left by */ -}; - -static MD4Table tab[] = -{ - /* round 1 */ -/*[0]*/ { 0, S11}, - { 1, S12}, - { 2, S13}, - { 3, S14}, - { 4, S11}, - { 5, S12}, - { 6, S13}, - { 7, S14}, - { 8, S11}, - { 9, S12}, - { 10, S13}, - { 11, S14}, - { 12, S11}, - { 13, S12}, - { 14, S13}, - { 15, S14}, - - /* round 2 */ -/*[16]*/{ 0, S21}, - { 4, S22}, - { 8, S23}, - { 12, S24}, - { 1, S21}, - { 5, S22}, - { 9, S23}, - { 13, S24}, - { 2, S21}, - { 6, S22}, - { 10, S23}, - { 14, S24}, - { 3, S21}, - { 7, S22}, - { 11, S23}, - { 15, S24}, - - /* round 3 */ -/*[32]*/{ 0, S31}, - { 8, S32}, - { 4, S33}, - { 12, S34}, - { 2, S31}, - { 10, S32}, - { 6, S33}, - { 14, S34}, - { 1, S31}, - { 9, S32}, - { 5, S33}, - { 13, S34}, - { 3, S31}, - { 11, S32}, - { 7, S33}, - { 15, S34}, -}; - -static void encode(uchar*, u32int*, ulong); -static void decode(u32int*, uchar*, ulong); - -static void -md4block(uchar *p, ulong len, MD4state *s) -{ - int i; - u32int a, b, c, d, tmp; - MD4Table *t; - uchar *end; - u32int x[16]; - - for(end = p+len; p < end; p += 64){ - a = s->state[0]; - b = s->state[1]; - c = s->state[2]; - d = s->state[3]; - - decode(x, p, 64); - - for(i = 0; i < 48; i++){ - t = tab + i; - switch(i>>4){ - case 0: - a += (b & c) | (~b & d); - break; - case 1: - a += ((b & c) | (b & d) | (c & d)) + 0x5A827999; - break; - case 2: - a += (b ^ c ^ d) + 0x6ED9EBA1; - break; - } - a += x[t->x]; - a = (a << t->rot) | (a >> (32 - t->rot)); - - /* rotate variables */ - tmp = d; - d = c; - c = b; - b = a; - a = tmp; - } - - s->state[0] += a; - s->state[1] += b; - s->state[2] += c; - s->state[3] += d; - - s->len += 64; - } -} - -MD4state* -md4(uchar *p, ulong len, uchar *digest, MD4state *s) -{ - u32int x[16]; - uchar buf[128]; - int i; - uchar *e; - - if(s == nil){ - s = malloc(sizeof(*s)); - if(s == nil) - return nil; - memset(s, 0, sizeof(*s)); - s->malloced = 1; - } - - if(s->seeded == 0){ - /* seed the state, these constants would look nicer big-endian */ - s->state[0] = 0x67452301; - s->state[1] = 0xefcdab89; - s->state[2] = 0x98badcfe; - s->state[3] = 0x10325476; - s->seeded = 1; - } - - /* fill out the partial 64 byte block from previous calls */ - if(s->blen){ - i = 64 - s->blen; - if(len < i) - i = len; - memmove(s->buf + s->blen, p, i); - len -= i; - s->blen += i; - p += i; - if(s->blen == 64){ - md4block(s->buf, s->blen, s); - s->blen = 0; - } - } - - /* do 64 byte blocks */ - i = len & ~0x3f; - if(i){ - md4block(p, i, s); - len -= i; - p += i; - } - - /* save the left overs if not last call */ - if(digest == 0){ - if(len){ - memmove(s->buf, p, len); - s->blen += len; - } - return s; - } - - /* - * this is the last time through, pad what's left with 0x80, - * 0's, and the input count to create a multiple of 64 bytes - */ - if(s->blen){ - p = s->buf; - len = s->blen; - } else { - memmove(buf, p, len); - p = buf; - } - s->len += len; - e = p + len; - if(len < 56) - i = 56 - len; - else - i = 120 - len; - memset(e, 0, i); - *e = 0x80; - len += i; - - /* append the count */ - x[0] = s->len<<3; - x[1] = s->len>>29; - encode(p+len, x, 8); - - /* digest the last part */ - md4block(p, len+8, s); - - /* return result and free state */ - encode(digest, s->state, MD4dlen); - if(s->malloced == 1) - free(s); - return nil; -} - -/* - * encodes input (u32int) into output (uchar). Assumes len is - * a multiple of 4. - */ -static void -encode(uchar *output, u32int *input, ulong len) -{ - u32int x; - uchar *e; - - for(e = output + len; output < e;) { - x = *input++; - *output++ = x; - *output++ = x >> 8; - *output++ = x >> 16; - *output++ = x >> 24; - } -} - -/* - * decodes input (uchar) into output (u32int). Assumes len is - * a multiple of 4. - */ -static void -decode(u32int *output, uchar *input, ulong len) -{ - uchar *e; - - for(e = input+len; input < e; input += 4) - *output++ = input[0] | (input[1] << 8) | - (input[2] << 16) | (input[3] << 24); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/md4test.c b/sys/src/cmd/unix/drawterm/libsec/md4test.c deleted file mode 100644 index 417cb3330..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/md4test.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -char *tests[] = { - "", - "a", - "abc", - "message digest", - "abcdefghijklmnopqrstuvwxyz", - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", - "12345678901234567890123456789012345678901234567890123456789012345678901234567890", - 0 -}; - -void -main(void) -{ - char **pp; - uchar *p; - int i; - uchar digest[MD5dlen]; - - for(pp = tests; *pp; pp++){ - p = (uchar*)*pp; - md4(p, strlen(*pp), digest, 0); - for(i = 0; i < MD5dlen; i++) - print("%2.2ux", digest[i]); - print("\n"); - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/md5.c b/sys/src/cmd/unix/drawterm/libsec/md5.c deleted file mode 100644 index 1d5794463..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/md5.c +++ /dev/null @@ -1,147 +0,0 @@ -#include "os.h" -#include <libsec.h> - -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ - -static void encode(uchar*, u32int*, ulong); - -extern void _md5block(uchar*, ulong, u32int*); - -MD5state* -md5(uchar *p, ulong len, uchar *digest, MD5state *s) -{ - u32int x[16]; - uchar buf[128]; - int i; - uchar *e; - - if(s == nil){ - s = malloc(sizeof(*s)); - if(s == nil) - return nil; - memset(s, 0, sizeof(*s)); - s->malloced = 1; - } - - if(s->seeded == 0){ - /* seed the state, these constants would look nicer big-endian */ - s->state[0] = 0x67452301; - s->state[1] = 0xefcdab89; - s->state[2] = 0x98badcfe; - s->state[3] = 0x10325476; - s->seeded = 1; - } - - /* fill out the partial 64 byte block from previous calls */ - if(s->blen){ - i = 64 - s->blen; - if(len < i) - i = len; - memmove(s->buf + s->blen, p, i); - len -= i; - s->blen += i; - p += i; - if(s->blen == 64){ - _md5block(s->buf, s->blen, s->state); - s->len += s->blen; - s->blen = 0; - } - } - - /* do 64 byte blocks */ - i = len & ~0x3f; - if(i){ - _md5block(p, i, s->state); - s->len += i; - len -= i; - p += i; - } - - /* save the left overs if not last call */ - if(digest == 0){ - if(len){ - memmove(s->buf, p, len); - s->blen += len; - } - return s; - } - - /* - * this is the last time through, pad what's left with 0x80, - * 0's, and the input count to create a multiple of 64 bytes - */ - if(s->blen){ - p = s->buf; - len = s->blen; - } else { - memmove(buf, p, len); - p = buf; - } - s->len += len; - e = p + len; - if(len < 56) - i = 56 - len; - else - i = 120 - len; - memset(e, 0, i); - *e = 0x80; - len += i; - - /* append the count */ - x[0] = s->len<<3; - x[1] = s->len>>29; - encode(p+len, x, 8); - - /* digest the last part */ - _md5block(p, len+8, s->state); - s->len += len; - - /* return result and free state */ - encode(digest, s->state, MD5dlen); - if(s->malloced == 1) - free(s); - return nil; -} - -/* - * encodes input (u32int) into output (uchar). Assumes len is - * a multiple of 4. - */ -static void -encode(uchar *output, u32int *input, ulong len) -{ - u32int x; - uchar *e; - - for(e = output + len; output < e;) { - x = *input++; - *output++ = x; - *output++ = x >> 8; - *output++ = x >> 16; - *output++ = x >> 24; - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/md5block.c b/sys/src/cmd/unix/drawterm/libsec/md5block.c deleted file mode 100644 index 07fe22379..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/md5block.c +++ /dev/null @@ -1,267 +0,0 @@ -#include "os.h" -#include <libsec.h> - -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ - -/* - * Rotate ammounts used in the algorithm - */ -enum -{ - S11= 7, - S12= 12, - S13= 17, - S14= 22, - - S21= 5, - S22= 9, - S23= 14, - S24= 20, - - S31= 4, - S32= 11, - S33= 16, - S34= 23, - - S41= 6, - S42= 10, - S43= 15, - S44= 21, -}; - -static u32int md5tab[] = -{ - /* round 1 */ -/*[0]*/ 0xd76aa478, - 0xe8c7b756, - 0x242070db, - 0xc1bdceee, - 0xf57c0faf, - 0x4787c62a, - 0xa8304613, - 0xfd469501, - 0x698098d8, - 0x8b44f7af, - 0xffff5bb1, - 0x895cd7be, - 0x6b901122, - 0xfd987193, - 0xa679438e, - 0x49b40821, - - /* round 2 */ -/*[16]*/0xf61e2562, - 0xc040b340, - 0x265e5a51, - 0xe9b6c7aa, - 0xd62f105d, - 0x2441453, - 0xd8a1e681, - 0xe7d3fbc8, - 0x21e1cde6, - 0xc33707d6, - 0xf4d50d87, - 0x455a14ed, - 0xa9e3e905, - 0xfcefa3f8, - 0x676f02d9, - 0x8d2a4c8a, - - /* round 3 */ -/*[32]*/0xfffa3942, - 0x8771f681, - 0x6d9d6122, - 0xfde5380c, - 0xa4beea44, - 0x4bdecfa9, - 0xf6bb4b60, - 0xbebfbc70, - 0x289b7ec6, - 0xeaa127fa, - 0xd4ef3085, - 0x4881d05, - 0xd9d4d039, - 0xe6db99e5, - 0x1fa27cf8, - 0xc4ac5665, - - /* round 4 */ -/*[48]*/0xf4292244, - 0x432aff97, - 0xab9423a7, - 0xfc93a039, - 0x655b59c3, - 0x8f0ccc92, - 0xffeff47d, - 0x85845dd1, - 0x6fa87e4f, - 0xfe2ce6e0, - 0xa3014314, - 0x4e0811a1, - 0xf7537e82, - 0xbd3af235, - 0x2ad7d2bb, - 0xeb86d391, -}; - -static void decode(u32int*, uchar*, ulong); -extern void _md5block(uchar *p, ulong len, u32int *s); - -void -_md5block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, sh; - u32int *t; - uchar *end; - u32int x[16]; - - for(end = p+len; p < end; p += 64){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - - decode(x, p, 64); - - t = md5tab; - sh = 0; - for(; sh != 16; t += 4){ - a += ((c ^ d) & b) ^ d; - a += x[sh] + t[0]; - a = (a << S11) | (a >> (32 - S11)); - a += b; - - d += ((b ^ c) & a) ^ c; - d += x[sh + 1] + t[1]; - d = (d << S12) | (d >> (32 - S12)); - d += a; - - c += ((a ^ b) & d) ^ b; - c += x[sh + 2] + t[2]; - c = (c << S13) | (c >> (32 - S13)); - c += d; - - b += ((d ^ a) & c) ^ a; - b += x[sh + 3] + t[3]; - b = (b << S14) | (b >> (32 - S14)); - b += c; - - sh += 4; - } - sh = 1; - for(; sh != 1+20*4; t += 4){ - a += ((b ^ c) & d) ^ c; - a += x[sh & 0xf] + t[0]; - a = (a << S21) | (a >> (32 - S21)); - a += b; - - d += ((a ^ b) & c) ^ b; - d += x[(sh + 5) & 0xf] + t[1]; - d = (d << S22) | (d >> (32 - S22)); - d += a; - - c += ((d ^ a) & b) ^ a; - c += x[(sh + 10) & 0xf] + t[2]; - c = (c << S23) | (c >> (32 - S23)); - c += d; - - b += ((c ^ d) & a) ^ d; - b += x[(sh + 15) & 0xf] + t[3]; - b = (b << S24) | (b >> (32 - S24)); - b += c; - - sh += 20; - } - sh = 5; - for(; sh != 5+12*4; t += 4){ - a += b ^ c ^ d; - a += x[sh & 0xf] + t[0]; - a = (a << S31) | (a >> (32 - S31)); - a += b; - - d += a ^ b ^ c; - d += x[(sh + 3) & 0xf] + t[1]; - d = (d << S32) | (d >> (32 - S32)); - d += a; - - c += d ^ a ^ b; - c += x[(sh + 6) & 0xf] + t[2]; - c = (c << S33) | (c >> (32 - S33)); - c += d; - - b += c ^ d ^ a; - b += x[(sh + 9) & 0xf] + t[3]; - b = (b << S34) | (b >> (32 - S34)); - b += c; - - sh += 12; - } - sh = 0; - for(; sh != 28*4; t += 4){ - a += c ^ (b | ~d); - a += x[sh & 0xf] + t[0]; - a = (a << S41) | (a >> (32 - S41)); - a += b; - - d += b ^ (a | ~c); - d += x[(sh + 7) & 0xf] + t[1]; - d = (d << S42) | (d >> (32 - S42)); - d += a; - - c += a ^ (d | ~b); - c += x[(sh + 14) & 0xf] + t[2]; - c = (c << S43) | (c >> (32 - S43)); - c += d; - - b += d ^ (c | ~a); - b += x[(sh + 21) & 0xf] + t[3]; - b = (b << S44) | (b >> (32 - S44)); - b += c; - - sh += 28; - } - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - } -} - -/* - * decodes input (uchar) into output (u32int). Assumes len is - * a multiple of 4. - */ -static void -decode(u32int *output, uchar *input, ulong len) -{ - uchar *e; - - for(e = input+len; input < e; input += 4) - *output++ = input[0] | (input[1] << 8) | - (input[2] << 16) | (input[3] << 24); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/md5pickle.c b/sys/src/cmd/unix/drawterm/libsec/md5pickle.c deleted file mode 100644 index 5b353b5a5..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/md5pickle.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "os.h" -#include <libsec.h> - -char* -md5pickle(MD5state *s) -{ - char *p; - int m, n; - - m = 4*9+4*((s->blen+3)/3); - p = malloc(m); - if(p == nil) - return p; - n = sprint(p, "%8.8ux %8.8ux %8.8ux %8.8ux ", - s->state[0], s->state[1], s->state[2], - s->state[3]); - enc64(p+n, m-n, s->buf, s->blen); - return p; -} - -MD5state* -md5unpickle(char *p) -{ - MD5state *s; - - s = malloc(sizeof(*s)); - if(s == nil) - return nil; - s->state[0] = strtoul(p, &p, 16); - s->state[1] = strtoul(p, &p, 16); - s->state[2] = strtoul(p, &p, 16); - s->state[3] = strtoul(p, &p, 16); - s->blen = dec64(s->buf, sizeof(s->buf), p, strlen(p)); - s->malloced = 1; - s->seeded = 1; - return s; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/nfastrand.c b/sys/src/cmd/unix/drawterm/libsec/nfastrand.c deleted file mode 100644 index fa042b00c..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/nfastrand.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -#define Maxrand ((1UL<<31)-1) - -ulong -nfastrand(ulong n) -{ - ulong m, r; - - /* - * set m to the maximum multiple of n <= 2^31-1 - * so we want a random number < m. - */ - if(n > Maxrand) - abort(); - - m = Maxrand - Maxrand % n; - while((r = fastrand()) >= m) - ; - return r%n; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/os.h b/sys/src/cmd/unix/drawterm/libsec/os.h deleted file mode 100644 index 07a1f9765..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/os.h +++ /dev/null @@ -1,2 +0,0 @@ -#include <u.h> -#include <libc.h> diff --git a/sys/src/cmd/unix/drawterm/libsec/primetest.c b/sys/src/cmd/unix/drawterm/libsec/primetest.c deleted file mode 100644 index 2d082e64f..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/primetest.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -void -main(void) -{ - mpint *z = mpnew(0); - mpint *p = mpnew(0); - mpint *q = mpnew(0); - mpint *nine = mpnew(0); - - fmtinstall('B', mpconv); - strtomp("2492491", nil, 16, z); // 38347921 = x*y = (2**28-9)/7, - // an example of 3**(n-1)=1 mod n - strtomp("15662C00E811", nil, 16, p);// 23528569104401, a prime - uitomp(9, nine); - - if(probably_prime(z, 5) == 1) - fprint(2, "tricked primality test\n"); - if(probably_prime(nine, 5) == 1) - fprint(2, "9 passed primality test!\n"); - if(probably_prime(p, 25) == 1) - fprint(2, "ok\n"); - - DSAprimes(q, p, nil); - print("q=%B\np=%B\n", q, p); - - exits(0); -} - -// example output, checked with Maple: -// seed EB7B6E35F7CD37B511D96C67D6688CC4DD440E1E -// q=E0F0EF284E10796C5A2A511E94748BA03C795C13 -// = 1284186945063585093695748280224501481698995297299 -// p=C41CFBE4D4846F67A3DF7DE9921A49D3B42DC33728427AB159CEC8CBBDB12B5F0C244F1A734AEB9840804EA3C25036AD1B61AFF3ABBC247CD4B384224567A863A6F020E7EE9795554BCD08ABAD7321AF27E1E92E3DB1C6E7E94FAAE590AE9C48F96D93D178E809401ABE8A534A1EC44359733475A36A70C7B425125062B1142D -// = 137715385439333164327584575331308277462546592976152006175830654712456008630139443747529133857837818585400418619916530061955288983751958831927807888408309879880101870216437711393638413509484569804814373511469405934988856674935304074081350525593807908358867354528898618574659752879015380013845760006721861915693 -// r=DF310F4E54A5FEC5D86D3E14863921E834113E060F90052AD332B3241CEF2497EFA0303D6344F7C819691A0F9C4A773815AF8EAECFB7EC1D98F039F17A32A7E887D97251A927D093F44A55577F4D70444AEBD06B9B45695EC23962B175F266895C67D21C4656848614D888A4 -// = 107239359478548771267308764204625458348785444483302647285245969203446101233421655396874997253111222983406676955642093641709149748793954493558324738441197139556917622937892491175016280660608595599724194374948056515856812347094848443460715881455884639869144172708 -// g=2F1C308DC46B9A44B52DF7DACCE1208CCEF72F69C743ADD4D2327173444ED6E65E074694246E07F9FD4AE26E0FDDD9F54F813C40CB9BCD4338EA6F242AB94CD410E676C290368A16B1A3594877437E516C53A6EEE5493A038A017E955E218E7819734E3E2A6E0BAE08B14258F8C03CC1B30E0DDADFCF7CEDF0727684D3D255F1 -// = 33081848392740465806285326014906437543653045153885419334085917570615301913274531387168723847139029827598735376746057461417880810924280288611116213062512408829164220104555543445909528701551198146080221790002337033997295756585193926863581671466708482411159477816144226847280417522524922667065714073338662508017 diff --git a/sys/src/cmd/unix/drawterm/libsec/prng.c b/sys/src/cmd/unix/drawterm/libsec/prng.c deleted file mode 100644 index fc2e508aa..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/prng.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// -// just use the libc prng to fill a buffer -// -void -prng(uchar *p, int n) -{ - uchar *e; - - for(e = p+n; p < e; p++) - *p = rand(); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/probably_prime.c b/sys/src/cmd/unix/drawterm/libsec/probably_prime.c deleted file mode 100644 index 4eaccbad3..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/probably_prime.c +++ /dev/null @@ -1,84 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// Miller-Rabin probabilistic primality testing -// Knuth (1981) Seminumerical Algorithms, p.379 -// Menezes et al () Handbook, p.39 -// 0 if composite; 1 if almost surely prime, Pr(err)<1/4**nrep -int -probably_prime(mpint *n, int nrep) -{ - int j, k, rep, nbits, isprime = 1; - mpint *nm1, *q, *x, *y, *r; - - if(n->sign < 0) - sysfatal("negative prime candidate"); - - if(nrep <= 0) - nrep = 18; - - k = mptoi(n); - if(k == 2) // 2 is prime - return 1; - if(k < 2) // 1 is not prime - return 0; - if((n->p[0] & 1) == 0) // even is not prime - return 0; - - // test against small prime numbers - if(smallprimetest(n) < 0) - return 0; - - // fermat test, 2^n mod n == 2 if p is prime - x = uitomp(2, nil); - y = mpnew(0); - mpexp(x, n, n, y); - k = mptoi(y); - if(k != 2){ - mpfree(x); - mpfree(y); - return 0; - } - - nbits = mpsignif(n); - nm1 = mpnew(nbits); - mpsub(n, mpone, nm1); // nm1 = n - 1 */ - k = mplowbits0(nm1); - q = mpnew(0); - mpright(nm1, k, q); // q = (n-1)/2**k - - for(rep = 0; rep < nrep; rep++){ - - // x = random in [2, n-2] - r = mprand(nbits, prng, nil); - mpmod(r, nm1, x); - mpfree(r); - if(mpcmp(x, mpone) <= 0) - continue; - - // y = x**q mod n - mpexp(x, q, n, y); - - if(mpcmp(y, mpone) == 0 || mpcmp(y, nm1) == 0) - goto done; - - for(j = 1; j < k; j++){ - mpmul(y, y, x); - mpmod(x, n, y); // y = y*y mod n - if(mpcmp(y, nm1) == 0) - goto done; - if(mpcmp(y, mpone) == 0){ - isprime = 0; - goto done; - } - } - isprime = 0; - } -done: - mpfree(y); - mpfree(x); - mpfree(q); - mpfree(nm1); - return isprime; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/rc4.c b/sys/src/cmd/unix/drawterm/libsec/rc4.c deleted file mode 100644 index beafa4868..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/rc4.c +++ /dev/null @@ -1,104 +0,0 @@ -#include "os.h" -#include <libsec.h> - -void -setupRC4state(RC4state *key, uchar *start, int n) -{ - int t; - int index2; - uchar *state; - uchar *p, *e, *sp, *se; - - state = key->state; - se = &state[256]; - for(sp = state; sp < se; sp++) - *sp = sp - state; - - key->x = 0; - key->y = 0; - index2 = 0; - e = start + n; - p = start; - for(sp = state; sp < se; sp++) - { - t = *sp; - index2 = (*p + t + index2) & 255; - *sp = state[index2]; - state[index2] = t; - if(++p >= e) - p = start; - } -} - -void -rc4(RC4state *key, uchar *p, int len) -{ - int tx, ty; - int x, y; - uchar *state; - uchar *e; - - x = key->x; - y = key->y; - state = &key->state[0]; - for(e = p + len; p < e; p++) - { - x = (x+1)&255; - tx = state[x]; - y = (y+tx)&255; - ty = state[y]; - state[x] = ty; - state[y] = tx; - *p ^= state[(tx+ty)&255]; - } - key->x = x; - key->y = y; -} - -void -rc4skip(RC4state *key, int len) -{ - int tx, ty; - int x, y; - uchar *state; - int i; - - x = key->x; - y = key->y; - state = &key->state[0]; - for(i=0; i<len; i++) - { - x = (x+1)&255; - tx = state[x]; - y = (y+tx)&255; - ty = state[y]; - state[x] = ty; - state[y] = tx; - } - key->x = x; - key->y = y; -} - -void -rc4back(RC4state *key, int len) -{ - int tx, ty; - int x, y; - uchar *state; - int i; - - x = key->x; - y = key->y; - state = &key->state[0]; - for(i=0; i<len; i++) - { - ty = state[x]; - tx = state[y]; - state[y] = ty; - state[x] = tx; - y = (y-tx)&255; - x = (x-1)&255; - } - key->x = x; - key->y = y; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/readcert.c b/sys/src/cmd/unix/drawterm/libsec/readcert.c deleted file mode 100644 index 9fe5d73a7..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/readcert.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <mp.h> -#include <libsec.h> - -static char* -readfile(char *name) -{ - int fd; - char *s; - Dir *d; - - fd = open(name, OREAD); - if(fd < 0) - return nil; - if((d = dirfstat(fd)) == nil) - return nil; - s = malloc(d->length + 1); - if(s == nil || readn(fd, s, d->length) != d->length){ - free(s); - free(d); - close(fd); - return nil; - } - close(fd); - s[d->length] = '\0'; - free(d); - return s; -} - -uchar* -readcert(char *filename, int *pcertlen) -{ - char *pem; - uchar *binary; - - pem = readfile(filename); - if(pem == nil){ - werrstr("can't read %s", filename); - return nil; - } - binary = decodepem(pem, "CERTIFICATE", pcertlen); - free(pem); - if(binary == nil){ - werrstr("can't parse %s", filename); - return nil; - } - return binary; -} - diff --git a/sys/src/cmd/unix/drawterm/libsec/rsaalloc.c b/sys/src/cmd/unix/drawterm/libsec/rsaalloc.c deleted file mode 100644 index 0caa96d5c..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/rsaalloc.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -RSApub* -rsapuballoc(void) -{ - RSApub *rsa; - - rsa = mallocz(sizeof(*rsa), 1); - if(rsa == nil) - sysfatal("rsapuballoc"); - return rsa; -} - -void -rsapubfree(RSApub *rsa) -{ - if(rsa == nil) - return; - mpfree(rsa->ek); - mpfree(rsa->n); - free(rsa); -} - - -RSApriv* -rsaprivalloc(void) -{ - RSApriv *rsa; - - rsa = mallocz(sizeof(*rsa), 1); - if(rsa == nil) - sysfatal("rsaprivalloc"); - return rsa; -} - -void -rsaprivfree(RSApriv *rsa) -{ - if(rsa == nil) - return; - mpfree(rsa->pub.ek); - mpfree(rsa->pub.n); - mpfree(rsa->dk); - mpfree(rsa->p); - mpfree(rsa->q); - mpfree(rsa->kp); - mpfree(rsa->kq); - mpfree(rsa->c2); - free(rsa); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/rsadecrypt.c b/sys/src/cmd/unix/drawterm/libsec/rsadecrypt.c deleted file mode 100644 index 1e937bec8..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/rsadecrypt.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -// decrypt rsa using garner's algorithm for the chinese remainder theorem -// seminumerical algorithms, knuth, pp 253-254 -// applied cryptography, menezes et al, pg 612 -mpint* -rsadecrypt(RSApriv *rsa, mpint *in, mpint *out) -{ - mpint *v1, *v2; - - if(out == nil) - out = mpnew(0); - - // convert in to modular representation - v1 = mpnew(0); - mpmod(in, rsa->p, v1); - v2 = mpnew(0); - mpmod(in, rsa->q, v2); - - // exponentiate the modular rep - mpexp(v1, rsa->kp, rsa->p, v1); - mpexp(v2, rsa->kq, rsa->q, v2); - - // out = v1 + p*((v2-v1)*c2 mod q) - mpsub(v2, v1, v2); - mpmul(v2, rsa->c2, v2); - mpmod(v2, rsa->q, v2); - mpmul(v2, rsa->p, out); - mpadd(v1, out, out); - - mpfree(v1); - mpfree(v2); - - return out; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/rsaencrypt.c b/sys/src/cmd/unix/drawterm/libsec/rsaencrypt.c deleted file mode 100644 index ade686dce..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/rsaencrypt.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -mpint* -rsaencrypt(RSApub *rsa, mpint *in, mpint *out) -{ - if(out == nil) - out = mpnew(0); - mpexp(in, rsa->ek, rsa->n, out); - return out; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/rsafill.c b/sys/src/cmd/unix/drawterm/libsec/rsafill.c deleted file mode 100644 index f514b073b..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/rsafill.c +++ /dev/null @@ -1,61 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -RSApriv* -rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q) -{ - mpint *c2, *kq, *kp, *x; - RSApriv *rsa; - - // make sure we're not being hoodwinked - if(!probably_prime(p, 10) || !probably_prime(q, 10)){ - werrstr("rsafill: p or q not prime"); - return nil; - } - x = mpnew(0); - mpmul(p, q, x); - if(mpcmp(n, x) != 0){ - werrstr("rsafill: n != p*q"); - mpfree(x); - return nil; - } - c2 = mpnew(0); - mpsub(p, mpone, c2); - mpsub(q, mpone, x); - mpmul(c2, x, x); - mpmul(e, d, c2); - mpmod(c2, x, x); - if(mpcmp(x, mpone) != 0){ - werrstr("rsafill: e*d != 1 mod (p-1)*(q-1)"); - mpfree(x); - mpfree(c2); - return nil; - } - - // compute chinese remainder coefficient - mpinvert(p, q, c2); - - // for crt a**k mod p == (a**(k mod p-1)) mod p - kq = mpnew(0); - kp = mpnew(0); - mpsub(p, mpone, x); - mpmod(d, x, kp); - mpsub(q, mpone, x); - mpmod(d, x, kq); - - rsa = rsaprivalloc(); - rsa->pub.ek = mpcopy(e); - rsa->pub.n = mpcopy(n); - rsa->dk = mpcopy(d); - rsa->kp = kp; - rsa->kq = kq; - rsa->p = mpcopy(p); - rsa->q = mpcopy(q); - rsa->c2 = c2; - - mpfree(x); - - return rsa; -} - diff --git a/sys/src/cmd/unix/drawterm/libsec/rsagen.c b/sys/src/cmd/unix/drawterm/libsec/rsagen.c deleted file mode 100644 index bdfc37f2f..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/rsagen.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -static void -genrand(mpint *p, int n) -{ - mpdigit x; - - // generate n random bits with high set - mpbits(p, n); - genrandom((uchar*)p->p, (n+7)/8); - p->top = (n+Dbits-1)/Dbits; - x = 1; - x <<= ((n-1)%Dbits); - p->p[p->top-1] &= (x-1); - p->p[p->top-1] |= x; -} - -RSApriv* -rsagen(int nlen, int elen, int rounds) -{ - mpint *p, *q, *e, *d, *phi, *n, *t1, *t2, *kp, *kq, *c2; - RSApriv *rsa; - - p = mpnew(nlen/2); - q = mpnew(nlen/2); - n = mpnew(nlen); - e = mpnew(elen); - d = mpnew(0); - phi = mpnew(nlen); - - // create the prime factors and euclid's function - genstrongprime(p, nlen/2, rounds); - genstrongprime(q, nlen - mpsignif(p) + 1, rounds); - mpmul(p, q, n); - mpsub(p, mpone, e); - mpsub(q, mpone, d); - mpmul(e, d, phi); - - // find an e relatively prime to phi - t1 = mpnew(0); - t2 = mpnew(0); - genrand(e, elen); - for(;;){ - mpextendedgcd(e, phi, d, t1, t2); - if(mpcmp(d, mpone) == 0) - break; - mpadd(mpone, e, e); - } - mpfree(t1); - mpfree(t2); - - // d = e**-1 mod phi - mpinvert(e, phi, d); - - // compute chinese remainder coefficient - c2 = mpnew(0); - mpinvert(p, q, c2); - - // for crt a**k mod p == (a**(k mod p-1)) mod p - kq = mpnew(0); - kp = mpnew(0); - mpsub(p, mpone, phi); - mpmod(d, phi, kp); - mpsub(q, mpone, phi); - mpmod(d, phi, kq); - - rsa = rsaprivalloc(); - rsa->pub.ek = e; - rsa->pub.n = n; - rsa->dk = d; - rsa->kp = kp; - rsa->kq = kq; - rsa->p = p; - rsa->q = q; - rsa->c2 = c2; - - mpfree(phi); - - return rsa; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/rsaprivtopub.c b/sys/src/cmd/unix/drawterm/libsec/rsaprivtopub.c deleted file mode 100644 index d464c87f8..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/rsaprivtopub.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -RSApub* -rsaprivtopub(RSApriv *priv) -{ - RSApub *pub; - - pub = rsapuballoc(); - if(pub == nil) - return nil; - pub->n = mpcopy(priv->pub.n); - pub->ek = mpcopy(priv->pub.ek); - return pub; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/rsatest.c b/sys/src/cmd/unix/drawterm/libsec/rsatest.c deleted file mode 100644 index 9ff66b5c2..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/rsatest.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> -#include <bio.h> - -void -main(void) -{ - RSApriv *rsa; - Biobuf b; - char *p; - int n; - mpint *clr, *enc, *clr2; - uchar buf[4096]; - uchar *e; - vlong start; - - fmtinstall('B', mpconv); - - rsa = rsagen(1024, 16, 0); - if(rsa == nil) - sysfatal("rsagen"); - Binit(&b, 0, OREAD); - clr = mpnew(0); - clr2 = mpnew(0); - enc = mpnew(0); - - strtomp("123456789abcdef123456789abcdef123456789abcdef123456789abcdef", nil, 16, clr); - rsaencrypt(&rsa->pub, clr, enc); - - start = nsec(); - for(n = 0; n < 10; n++) - rsadecrypt(rsa, enc, clr); - print("%lld\n", nsec()-start); - - start = nsec(); - for(n = 0; n < 10; n++) - mpexp(enc, rsa->dk, rsa->pub.n, clr2); - print("%lld\n", nsec()-start); - - if(mpcmp(clr, clr2) != 0) - print("%B != %B\n", clr, clr2); - - print("> "); - while(p = Brdline(&b, '\n')){ - n = Blinelen(&b); - letomp((uchar*)p, n, clr); - print("clr %B\n", clr); - rsaencrypt(&rsa->pub, clr, enc); - print("enc %B\n", enc); - rsadecrypt(rsa, enc, clr); - print("clr %B\n", clr); - n = mptole(clr, buf, sizeof(buf), nil); - write(1, buf, n); - print("> "); - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/sha1.c b/sys/src/cmd/unix/drawterm/libsec/sha1.c deleted file mode 100644 index 946f02838..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/sha1.c +++ /dev/null @@ -1,127 +0,0 @@ -#include "os.h" -#include <libsec.h> - -static void encode(uchar*, u32int*, ulong); - -extern void _sha1block(uchar*, ulong, u32int*); - -/* - * we require len to be a multiple of 64 for all but - * the last call. There must be room in the input buffer - * to pad. - */ -SHA1state* -sha1(uchar *p, ulong len, uchar *digest, SHA1state *s) -{ - uchar buf[128]; - u32int x[16]; - int i; - uchar *e; - - if(s == nil){ - s = malloc(sizeof(*s)); - if(s == nil) - return nil; - memset(s, 0, sizeof(*s)); - s->malloced = 1; - } - - if(s->seeded == 0){ - /* seed the state, these constants would look nicer big-endian */ - s->state[0] = 0x67452301; - s->state[1] = 0xefcdab89; - s->state[2] = 0x98badcfe; - s->state[3] = 0x10325476; - s->state[4] = 0xc3d2e1f0; - s->seeded = 1; - } - - /* fill out the partial 64 byte block from previous calls */ - if(s->blen){ - i = 64 - s->blen; - if(len < i) - i = len; - memmove(s->buf + s->blen, p, i); - len -= i; - s->blen += i; - p += i; - if(s->blen == 64){ - _sha1block(s->buf, s->blen, s->state); - s->len += s->blen; - s->blen = 0; - } - } - - /* do 64 byte blocks */ - i = len & ~0x3f; - if(i){ - _sha1block(p, i, s->state); - s->len += i; - len -= i; - p += i; - } - - /* save the left overs if not last call */ - if(digest == 0){ - if(len){ - memmove(s->buf, p, len); - s->blen += len; - } - return s; - } - - /* - * this is the last time through, pad what's left with 0x80, - * 0's, and the input count to create a multiple of 64 bytes - */ - if(s->blen){ - p = s->buf; - len = s->blen; - } else { - memmove(buf, p, len); - p = buf; - } - s->len += len; - e = p + len; - if(len < 56) - i = 56 - len; - else - i = 120 - len; - memset(e, 0, i); - *e = 0x80; - len += i; - - /* append the count */ - x[0] = s->len>>29; - x[1] = s->len<<3; - encode(p+len, x, 8); - - /* digest the last part */ - _sha1block(p, len+8, s->state); - s->len += len+8; - - /* return result and free state */ - encode(digest, s->state, SHA1dlen); - if(s->malloced == 1) - free(s); - return nil; -} - -/* - * encodes input (ulong) into output (uchar). Assumes len is - * a multiple of 4. - */ -static void -encode(uchar *output, u32int *input, ulong len) -{ - u32int x; - uchar *e; - - for(e = output + len; output < e;) { - x = *input++; - *output++ = x >> 24; - *output++ = x >> 16; - *output++ = x >> 8; - *output++ = x; - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/sha1block.c b/sys/src/cmd/unix/drawterm/libsec/sha1block.c deleted file mode 100644 index 82566f210..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/sha1block.c +++ /dev/null @@ -1,187 +0,0 @@ -#include "os.h" - -void -_sha1block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, e, x; - uchar *end; - u32int *wp, *wend; - u32int w[80]; - - /* at this point, we have a multiple of 64 bytes */ - for(end = p+len; p < end;){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - e = s[4]; - - wend = w + 15; - for(wp = w; wp < wend; wp += 5){ - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11]; - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15]; - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19]; - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - p += 20; - } - - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - wp += 5; - p += 4; - - wend = w + 40; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x6ed9eba1 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x6ed9eba1 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x6ed9eba1 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x6ed9eba1 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x6ed9eba1 + (c^d^e); - c = (c<<30)|(c>>2); - } - - wend = w + 60; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x8f1bbcdc + ((b&c)|((b|c)&d)); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x8f1bbcdc + ((a&b)|((a|b)&c)); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x8f1bbcdc + ((e&a)|((e|a)&b)); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x8f1bbcdc + ((d&e)|((d|e)&a)); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x8f1bbcdc + ((c&d)|((c|d)&e)); - c = (c<<30)|(c>>2); - } - - wend = w + 80; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0xca62c1d6 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0xca62c1d6 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0xca62c1d6 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0xca62c1d6 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0xca62c1d6 + (c^d^e); - c = (c<<30)|(c>>2); - } - - /* save state */ - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - } -} diff --git a/sys/src/cmd/unix/drawterm/libsec/sha1pickle.c b/sys/src/cmd/unix/drawterm/libsec/sha1pickle.c deleted file mode 100644 index 6139567b5..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/sha1pickle.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "os.h" -#include <libsec.h> - -char* -sha1pickle(SHA1state *s) -{ - char *p; - int m, n; - - m = 5*9+4*((s->blen+3)/3); - p = malloc(m); - if(p == nil) - return p; - n = sprint(p, "%8.8ux %8.8ux %8.8ux %8.8ux %8.8ux ", - s->state[0], s->state[1], s->state[2], - s->state[3], s->state[4]); - enc64(p+n, m-n, s->buf, s->blen); - return p; -} - -SHA1state* -sha1unpickle(char *p) -{ - SHA1state *s; - - s = malloc(sizeof(*s)); - if(s == nil) - return nil; - s->state[0] = strtoul(p, &p, 16); - s->state[1] = strtoul(p, &p, 16); - s->state[2] = strtoul(p, &p, 16); - s->state[3] = strtoul(p, &p, 16); - s->state[4] = strtoul(p, &p, 16); - s->blen = dec64(s->buf, sizeof(s->buf), p, strlen(p)); - s->malloced = 1; - s->seeded = 1; - return s; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/smallprimes.c b/sys/src/cmd/unix/drawterm/libsec/smallprimes.c deleted file mode 100644 index ac23a2f09..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/smallprimes.c +++ /dev/null @@ -1,1004 +0,0 @@ -#include "os.h" - -ulong smallprimes[1000] = { - 2, - 3, - 5, - 7, - 11, - 13, - 17, - 19, - 23, - 29, - 31, - 37, - 41, - 43, - 47, - 53, - 59, - 61, - 67, - 71, - 73, - 79, - 83, - 89, - 97, - 101, - 103, - 107, - 109, - 113, - 127, - 131, - 137, - 139, - 149, - 151, - 157, - 163, - 167, - 173, - 179, - 181, - 191, - 193, - 197, - 199, - 211, - 223, - 227, - 229, - 233, - 239, - 241, - 251, - 257, - 263, - 269, - 271, - 277, - 281, - 283, - 293, - 307, - 311, - 313, - 317, - 331, - 337, - 347, - 349, - 353, - 359, - 367, - 373, - 379, - 383, - 389, - 397, - 401, - 409, - 419, - 421, - 431, - 433, - 439, - 443, - 449, - 457, - 461, - 463, - 467, - 479, - 487, - 491, - 499, - 503, - 509, - 521, - 523, - 541, - 547, - 557, - 563, - 569, - 571, - 577, - 587, - 593, - 599, - 601, - 607, - 613, - 617, - 619, - 631, - 641, - 643, - 647, - 653, - 659, - 661, - 673, - 677, - 683, - 691, - 701, - 709, - 719, - 727, - 733, - 739, - 743, - 751, - 757, - 761, - 769, - 773, - 787, - 797, - 809, - 811, - 821, - 823, - 827, - 829, - 839, - 853, - 857, - 859, - 863, - 877, - 881, - 883, - 887, - 907, - 911, - 919, - 929, - 937, - 941, - 947, - 953, - 967, - 971, - 977, - 983, - 991, - 997, - 1009, - 1013, - 1019, - 1021, - 1031, - 1033, - 1039, - 1049, - 1051, - 1061, - 1063, - 1069, - 1087, - 1091, - 1093, - 1097, - 1103, - 1109, - 1117, - 1123, - 1129, - 1151, - 1153, - 1163, - 1171, - 1181, - 1187, - 1193, - 1201, - 1213, - 1217, - 1223, - 1229, - 1231, - 1237, - 1249, - 1259, - 1277, - 1279, - 1283, - 1289, - 1291, - 1297, - 1301, - 1303, - 1307, - 1319, - 1321, - 1327, - 1361, - 1367, - 1373, - 1381, - 1399, - 1409, - 1423, - 1427, - 1429, - 1433, - 1439, - 1447, - 1451, - 1453, - 1459, - 1471, - 1481, - 1483, - 1487, - 1489, - 1493, - 1499, - 1511, - 1523, - 1531, - 1543, - 1549, - 1553, - 1559, - 1567, - 1571, - 1579, - 1583, - 1597, - 1601, - 1607, - 1609, - 1613, - 1619, - 1621, - 1627, - 1637, - 1657, - 1663, - 1667, - 1669, - 1693, - 1697, - 1699, - 1709, - 1721, - 1723, - 1733, - 1741, - 1747, - 1753, - 1759, - 1777, - 1783, - 1787, - 1789, - 1801, - 1811, - 1823, - 1831, - 1847, - 1861, - 1867, - 1871, - 1873, - 1877, - 1879, - 1889, - 1901, - 1907, - 1913, - 1931, - 1933, - 1949, - 1951, - 1973, - 1979, - 1987, - 1993, - 1997, - 1999, - 2003, - 2011, - 2017, - 2027, - 2029, - 2039, - 2053, - 2063, - 2069, - 2081, - 2083, - 2087, - 2089, - 2099, - 2111, - 2113, - 2129, - 2131, - 2137, - 2141, - 2143, - 2153, - 2161, - 2179, - 2203, - 2207, - 2213, - 2221, - 2237, - 2239, - 2243, - 2251, - 2267, - 2269, - 2273, - 2281, - 2287, - 2293, - 2297, - 2309, - 2311, - 2333, - 2339, - 2341, - 2347, - 2351, - 2357, - 2371, - 2377, - 2381, - 2383, - 2389, - 2393, - 2399, - 2411, - 2417, - 2423, - 2437, - 2441, - 2447, - 2459, - 2467, - 2473, - 2477, - 2503, - 2521, - 2531, - 2539, - 2543, - 2549, - 2551, - 2557, - 2579, - 2591, - 2593, - 2609, - 2617, - 2621, - 2633, - 2647, - 2657, - 2659, - 2663, - 2671, - 2677, - 2683, - 2687, - 2689, - 2693, - 2699, - 2707, - 2711, - 2713, - 2719, - 2729, - 2731, - 2741, - 2749, - 2753, - 2767, - 2777, - 2789, - 2791, - 2797, - 2801, - 2803, - 2819, - 2833, - 2837, - 2843, - 2851, - 2857, - 2861, - 2879, - 2887, - 2897, - 2903, - 2909, - 2917, - 2927, - 2939, - 2953, - 2957, - 2963, - 2969, - 2971, - 2999, - 3001, - 3011, - 3019, - 3023, - 3037, - 3041, - 3049, - 3061, - 3067, - 3079, - 3083, - 3089, - 3109, - 3119, - 3121, - 3137, - 3163, - 3167, - 3169, - 3181, - 3187, - 3191, - 3203, - 3209, - 3217, - 3221, - 3229, - 3251, - 3253, - 3257, - 3259, - 3271, - 3299, - 3301, - 3307, - 3313, - 3319, - 3323, - 3329, - 3331, - 3343, - 3347, - 3359, - 3361, - 3371, - 3373, - 3389, - 3391, - 3407, - 3413, - 3433, - 3449, - 3457, - 3461, - 3463, - 3467, - 3469, - 3491, - 3499, - 3511, - 3517, - 3527, - 3529, - 3533, - 3539, - 3541, - 3547, - 3557, - 3559, - 3571, - 3581, - 3583, - 3593, - 3607, - 3613, - 3617, - 3623, - 3631, - 3637, - 3643, - 3659, - 3671, - 3673, - 3677, - 3691, - 3697, - 3701, - 3709, - 3719, - 3727, - 3733, - 3739, - 3761, - 3767, - 3769, - 3779, - 3793, - 3797, - 3803, - 3821, - 3823, - 3833, - 3847, - 3851, - 3853, - 3863, - 3877, - 3881, - 3889, - 3907, - 3911, - 3917, - 3919, - 3923, - 3929, - 3931, - 3943, - 3947, - 3967, - 3989, - 4001, - 4003, - 4007, - 4013, - 4019, - 4021, - 4027, - 4049, - 4051, - 4057, - 4073, - 4079, - 4091, - 4093, - 4099, - 4111, - 4127, - 4129, - 4133, - 4139, - 4153, - 4157, - 4159, - 4177, - 4201, - 4211, - 4217, - 4219, - 4229, - 4231, - 4241, - 4243, - 4253, - 4259, - 4261, - 4271, - 4273, - 4283, - 4289, - 4297, - 4327, - 4337, - 4339, - 4349, - 4357, - 4363, - 4373, - 4391, - 4397, - 4409, - 4421, - 4423, - 4441, - 4447, - 4451, - 4457, - 4463, - 4481, - 4483, - 4493, - 4507, - 4513, - 4517, - 4519, - 4523, - 4547, - 4549, - 4561, - 4567, - 4583, - 4591, - 4597, - 4603, - 4621, - 4637, - 4639, - 4643, - 4649, - 4651, - 4657, - 4663, - 4673, - 4679, - 4691, - 4703, - 4721, - 4723, - 4729, - 4733, - 4751, - 4759, - 4783, - 4787, - 4789, - 4793, - 4799, - 4801, - 4813, - 4817, - 4831, - 4861, - 4871, - 4877, - 4889, - 4903, - 4909, - 4919, - 4931, - 4933, - 4937, - 4943, - 4951, - 4957, - 4967, - 4969, - 4973, - 4987, - 4993, - 4999, - 5003, - 5009, - 5011, - 5021, - 5023, - 5039, - 5051, - 5059, - 5077, - 5081, - 5087, - 5099, - 5101, - 5107, - 5113, - 5119, - 5147, - 5153, - 5167, - 5171, - 5179, - 5189, - 5197, - 5209, - 5227, - 5231, - 5233, - 5237, - 5261, - 5273, - 5279, - 5281, - 5297, - 5303, - 5309, - 5323, - 5333, - 5347, - 5351, - 5381, - 5387, - 5393, - 5399, - 5407, - 5413, - 5417, - 5419, - 5431, - 5437, - 5441, - 5443, - 5449, - 5471, - 5477, - 5479, - 5483, - 5501, - 5503, - 5507, - 5519, - 5521, - 5527, - 5531, - 5557, - 5563, - 5569, - 5573, - 5581, - 5591, - 5623, - 5639, - 5641, - 5647, - 5651, - 5653, - 5657, - 5659, - 5669, - 5683, - 5689, - 5693, - 5701, - 5711, - 5717, - 5737, - 5741, - 5743, - 5749, - 5779, - 5783, - 5791, - 5801, - 5807, - 5813, - 5821, - 5827, - 5839, - 5843, - 5849, - 5851, - 5857, - 5861, - 5867, - 5869, - 5879, - 5881, - 5897, - 5903, - 5923, - 5927, - 5939, - 5953, - 5981, - 5987, - 6007, - 6011, - 6029, - 6037, - 6043, - 6047, - 6053, - 6067, - 6073, - 6079, - 6089, - 6091, - 6101, - 6113, - 6121, - 6131, - 6133, - 6143, - 6151, - 6163, - 6173, - 6197, - 6199, - 6203, - 6211, - 6217, - 6221, - 6229, - 6247, - 6257, - 6263, - 6269, - 6271, - 6277, - 6287, - 6299, - 6301, - 6311, - 6317, - 6323, - 6329, - 6337, - 6343, - 6353, - 6359, - 6361, - 6367, - 6373, - 6379, - 6389, - 6397, - 6421, - 6427, - 6449, - 6451, - 6469, - 6473, - 6481, - 6491, - 6521, - 6529, - 6547, - 6551, - 6553, - 6563, - 6569, - 6571, - 6577, - 6581, - 6599, - 6607, - 6619, - 6637, - 6653, - 6659, - 6661, - 6673, - 6679, - 6689, - 6691, - 6701, - 6703, - 6709, - 6719, - 6733, - 6737, - 6761, - 6763, - 6779, - 6781, - 6791, - 6793, - 6803, - 6823, - 6827, - 6829, - 6833, - 6841, - 6857, - 6863, - 6869, - 6871, - 6883, - 6899, - 6907, - 6911, - 6917, - 6947, - 6949, - 6959, - 6961, - 6967, - 6971, - 6977, - 6983, - 6991, - 6997, - 7001, - 7013, - 7019, - 7027, - 7039, - 7043, - 7057, - 7069, - 7079, - 7103, - 7109, - 7121, - 7127, - 7129, - 7151, - 7159, - 7177, - 7187, - 7193, - 7207, - 7211, - 7213, - 7219, - 7229, - 7237, - 7243, - 7247, - 7253, - 7283, - 7297, - 7307, - 7309, - 7321, - 7331, - 7333, - 7349, - 7351, - 7369, - 7393, - 7411, - 7417, - 7433, - 7451, - 7457, - 7459, - 7477, - 7481, - 7487, - 7489, - 7499, - 7507, - 7517, - 7523, - 7529, - 7537, - 7541, - 7547, - 7549, - 7559, - 7561, - 7573, - 7577, - 7583, - 7589, - 7591, - 7603, - 7607, - 7621, - 7639, - 7643, - 7649, - 7669, - 7673, - 7681, - 7687, - 7691, - 7699, - 7703, - 7717, - 7723, - 7727, - 7741, - 7753, - 7757, - 7759, - 7789, - 7793, - 7817, - 7823, - 7829, - 7841, - 7853, - 7867, - 7873, - 7877, - 7879, - 7883, - 7901, - 7907, - 7919, -}; diff --git a/sys/src/cmd/unix/drawterm/libsec/smallprimetest.c b/sys/src/cmd/unix/drawterm/libsec/smallprimetest.c deleted file mode 100644 index cf94dac2a..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/smallprimetest.c +++ /dev/null @@ -1,1039 +0,0 @@ -#include "os.h" -#include <mp.h> -#include <libsec.h> - -static ulong smallprimes[] = { - 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, - 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, - 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, - 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, - 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, - 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, - 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, - 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, - 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, - 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, - 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, - 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, - 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, - 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, - 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, - 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, - 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, - 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, - 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, - 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, - 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, - 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, - 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, - 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, - 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, - 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, - 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, - 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, - 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, - 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, - 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, - 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, - 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, - 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, - 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, - 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, - 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, - 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, - 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, - 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, - 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, - 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, - 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, - 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, - 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, - 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, - 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, - 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, - 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, - 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, - 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, - 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, - 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, - 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, - 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, - 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, - 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, - 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, - 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, - 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, - 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, - 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, - 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, - 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, - 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, - 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, - 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, - 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, - 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, - 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, - 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, - 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, - 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, - 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, - 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, - 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, - 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, - 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, - 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, - 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, - 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, - 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, - 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, - 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, - 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, - 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, - 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, - 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, - 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, - 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, - 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, - 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, - 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, - 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, - 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, - 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, - 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, - 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, - 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, - 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, - 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, - 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, - 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, - 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, - 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, - 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, - 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, - 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, - 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, - 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, - 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, - 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, - 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, - 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, - 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, - 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, - 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, - 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, - 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, - 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, - 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, - 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, - 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, - 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, - 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, - 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, - 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, - 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, - 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, - 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, - 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, - 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, - 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, - 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, - 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, - 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, - 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, - 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, - 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, - 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, - 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, - 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, - 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, - 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, - 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, - 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, - 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, - 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, - 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, - 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, - 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, - 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, - 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, - 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, - 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, - 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, - 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, - 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, - 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, - 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, - 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, - 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, - 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, - 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, - 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, - 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, - 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, - 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, - 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, - 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, - 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, - 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, - 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, - 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, - 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, - 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, - 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, - 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, - 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, - 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, - 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, - 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, - 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, - 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, - 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, - 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, - 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, - 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, - 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, - 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, - 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, - 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, - 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, - 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, - 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, - 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, - 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, - 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, - 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, - 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, - 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, - 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, - 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, - 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, - 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, - 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, - 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, - 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, - 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, - 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, - 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, - 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, - 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, - 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, - 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, - 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, - 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, - 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, - 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, - 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, - 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, - 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, - 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, - 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, - 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, - 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, - 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, - 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, - 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, - 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, - 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, - 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, - 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, - 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, - 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, - 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, - 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, - 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, - 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, - 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, - 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, - 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, - 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, - 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, - 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, - 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, - 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, - 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, - 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, - 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, - 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, - 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, - 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, - 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, - 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, - 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, - 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, - 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, - 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, - 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, - 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, - 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, - 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, - 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, - 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, - 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, - 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, - 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, - 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, - 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, - 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, - 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, - 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, - 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, - 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, - 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, - 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, - 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, - 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, - 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, - 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, - 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, - 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, - 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, - 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, - 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, - 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, - 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, - 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, - 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, - 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, - 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, - 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, - 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, - 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, - 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, - 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, - 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, - 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, - 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, - 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, - 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, - 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, - 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, - 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, - 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, - 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, - 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, - 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, - 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, - 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, - 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, - 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, - 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, - 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, - 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, - 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, - 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, - 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, - 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, - 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, - 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, - 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, - 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, - 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, - 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, - 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, - 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, - 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, - 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, - 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, - 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, - 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, - 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, - 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, - 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, - 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, - 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, - 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, - 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, - 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, - 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, - 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, - 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, - 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, - 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, - 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, - 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, - 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, - 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, - 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, - 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, - 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, - 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, - 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, - 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, - 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, - 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, - 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, - 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, - 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, - 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, - 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, - 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, - 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, - 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, - 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, - 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, - 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, - 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, - 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, - 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, - 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, - 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, - 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, - 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, - 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, - 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, - 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, - 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, - 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, - 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, - 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, - 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, - 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, - 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, - 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, - 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, - 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, - 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, - 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, - 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, - 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, - 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, - 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, - 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, - 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, - 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, - 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, - 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, - 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, - 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, - 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, - 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, - 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, - 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, - 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, - 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, - 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, - 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, - 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, - 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, - 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, - 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, - 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, - 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, - 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, - 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, - 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, - 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, - 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, - 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, - 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, - 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, - 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, - 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, - 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, - 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, - 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, - 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, - 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, - 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, - 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, - 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, - 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, - 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, - 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, - 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, - 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, - 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, - 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, - 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, - 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, - 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, - 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, - 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, - 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, - 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, - 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, - 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, - 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, - 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, - 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, - 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, - 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, - 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, - 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, - 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, - 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, - 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, - 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, - 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, - 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, - 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, - 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, - 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, - 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, - 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, - 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, - 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, - 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, - 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, - 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, - 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, - 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, - 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, - 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, - 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, - 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, - 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, - 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, - 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, - 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, - 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, - 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, - 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, - 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, - 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, - 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, - 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, - 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, - 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, - 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, - 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, - 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, - 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, - 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, - 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, - 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, - 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, - 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, - 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, - 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, - 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, - 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, - 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, - 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, - 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, - 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, - 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, - 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, - 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, - 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, - 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, - 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, - 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, - 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, - 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, - 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, - 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, - 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, - 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, - 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, - 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, - 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, - 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, - 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, - 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, - 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, - 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, - 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, - 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, - 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, - 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, - 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, - 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, - 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, - 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, - 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, - 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, - 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, - 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, - 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, - 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, - 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, - 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, - 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, - 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, - 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, - 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, - 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, - 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, - 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, - 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, - 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, - 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, - 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, - 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, - 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, - 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, - 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, - 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, - 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, - 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, - 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, - 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, - 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, - 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, - 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, - 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, - 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, - 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, - 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, - 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, - 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, - 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, - 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, - 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, - 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, - 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, - 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, - 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, - 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, - 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, - 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, - 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, - 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, - 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, - 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, - 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, - 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, - 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, - 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, - 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, - 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, - 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, - 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, - 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, - 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, - 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, - 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, - 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, - 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, - 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, - 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, - 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, - 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, - 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, - 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, - 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, - 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, - 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, - 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, - 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, - 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, - 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, - 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, - 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, - 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, - 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, - 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, - 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, - 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, - 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, - 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, - 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, - 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, - 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, - 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, - 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, - 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, - 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, - 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, - 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, - 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, - 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, - 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, - 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, - 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, - 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, - 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, - 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, - 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, - 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, - 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, - 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, - 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, - 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, - 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, - 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, - 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, - 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, - 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, - 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, - 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, - 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, - 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, - 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, - 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, - 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, - 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, - 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, - 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, - 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, - 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, - 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, - 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, - 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, - 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, - 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, - 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, - 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, - 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, - 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, - 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, - 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, - 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, - 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, - 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, - 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, - 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, - 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, - 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, - 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, - 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, - 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, - 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, - 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, - 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, - 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, - 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, - 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, - 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, - 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, - 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, - 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, - 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, - 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, - 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, - 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, - 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, - 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, - 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, - 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, - 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, - 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, - 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, - 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, - 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, - 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, - 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, - 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, - 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, - 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, - 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, - 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, - 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, - 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, - 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, - 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, - 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, - 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, - 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, - 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, - 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, - 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, - 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, - 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, - 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, - 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, - 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, - 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, - 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, - 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, - 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, - 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, - 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, - 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, - 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, - 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, - 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, - 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, - 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, - 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, - 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, - 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, - 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, - 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, - 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, - 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, - 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, - 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, - 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, - 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, - 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, - 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, - 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, - 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, - 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, - 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, - 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, - 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, - 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, - 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, - 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, - 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, - 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, - 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, - 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, - 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, - 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, - 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, - 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, - 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, - 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, - 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, - 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, - 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, - 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, - 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, - 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, - 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, - 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, - 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, - 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, - 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, - 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, - 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, - 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, - 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, - 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, - 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, - 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, - 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, - 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, - 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, - 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, - 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, - 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, - 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, - 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, - 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, - 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, - 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, - 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, - 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, - 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, - 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, - 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, - 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, - 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, - 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, - 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, - 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, - 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, - 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, - 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, - 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, - 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, - 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, - 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, - 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, - 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, - 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, - 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, - 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, - 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, - 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, - 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, - 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, - 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, - 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, - 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, - 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, - 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, - 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, - 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111, - 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197, - 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291, - 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371, - 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477, - 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587, - 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, - 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, - 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, - 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119, - 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223, - 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323, - 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473, - 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553, - 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641, - 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721, - 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853, - 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, - 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, - 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, - 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411, - 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547, - 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667, - 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801, - 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873, - 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003, - 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087, - 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209, - 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, - 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, - 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, - 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627, - 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759, - 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849, - 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963, - 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031, - 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149, - 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239, - 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373, - 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, - 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, - 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, - 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847, - 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977, - 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121, - 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193, - 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303, - 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411, - 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529, - 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673, - 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, - 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, - 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, - 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173, - 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243, - 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363, - 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431, - 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567, - 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669, - 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753, - 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849, - 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, - 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, - 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, - 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281, - 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383, - 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, - 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, - 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, - 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911, - 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997, - 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111, - 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, - 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, - 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, - 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559, - 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687, - 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793, - 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903, - 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021, - 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111, - 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231, - 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317, - 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, - 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, - 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, - 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773, - 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873, - 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971, - 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097, - 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223, - 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331, - 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461, - 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581, - 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, - 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, - 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, - 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021, - 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169, - 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303, - 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429, - 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549, - 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649, - 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813, - 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883, - 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, - 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, - 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, - 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411, - 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507, - 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639, - 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737, - 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873, - 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947, - 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053, - 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139, - 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, - 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, - 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, - 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, - 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733, - 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839, - 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971, - 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109, - 100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237, - 100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361, - 100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469, - 100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, - 100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699, - 100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823, - 100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957, - 100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089, - 101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173, - 101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281, - 101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383, - 101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501, - 101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, - 101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719, - 101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833, - 101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929, - 101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023, - 102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107, - 102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217, - 102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317, - 102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451, - 102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, - 102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667, - 102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811, - 102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931, - 102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079, - 103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217, - 103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387, - 103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483, - 103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591, - 103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, - 103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867, - 103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981, - 103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059, - 104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173, - 104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297, - 104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399, - 104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543, - 104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659, - 104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729, -}; - -// return 1 if p is divisable by sp, 0 otherwise -static int -divides(mpint *dividend, ulong divisor) -{ - mpdigit d[2], q; - int i; - - d[1] = 0; - for(i = dividend->top-1; i >= 0; i--){ - d[0] = dividend->p[i]; - mpdigdiv(d, divisor, &q); - d[1] = d[0] - divisor*q; - } - return d[1] == 0; -} - -// return -1 if p is divisable by one of the small primes, 0 otherwise -int -smallprimetest(mpint *p) -{ - int i; - ulong sp; - - for(i = 0; i < nelem(smallprimes); i++){ - sp = smallprimes[i]; - if(p->top == 1 && p->p[0] <= sp) - break; - if(divides(p, sp)) - return -1; - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/libsec/thumb.c b/sys/src/cmd/unix/drawterm/libsec/thumb.c deleted file mode 100644 index cac95a436..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/thumb.c +++ /dev/null @@ -1,97 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <bio.h> -#include <auth.h> -#include <mp.h> -#include <libsec.h> - -enum{ ThumbTab = 1<<10 }; - -static void * -emalloc(int n) -{ - void *p; - if(n==0) - n=1; - p = malloc(n); - if(p == nil){ - exits("out of memory"); - } - memset(p, 0, n); - return p; -} - -void -freeThumbprints(Thumbprint *table) -{ - Thumbprint *hd, *p, *q; - for(hd = table; hd < table+ThumbTab; hd++){ - for(p = hd->next; p; p = q){ - q = p->next; - free(p); - } - } - free(table); -} - -int -okThumbprint(uchar *sum, Thumbprint *table) -{ - Thumbprint *p; - int i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1); - - for(p = table[i].next; p; p = p->next) - if(memcmp(sum, p->sha1, SHA1dlen) == 0) - return 1; - return 0; -} - -static void -loadThumbprints(char *file, Thumbprint *table, Thumbprint *crltab) -{ - Thumbprint *entry; - Biobuf *bin; - char *line, *field[50]; - uchar sum[SHA1dlen]; - int i; - - bin = Bopen(file, OREAD); - if(bin == nil) - return; - for(; (line = Brdstr(bin, '\n', 1)) != 0; free(line)){ - if(tokenize(line, field, nelem(field)) < 2) - continue; - if(strcmp(field[0], "#include") == 0){ - loadThumbprints(field[1], table, crltab); - continue; - } - if(strcmp(field[0], "x509") != 0 || strncmp(field[1], "sha1=", strlen("sha1=")) != 0) - continue; - field[1] += strlen("sha1="); - dec16(sum, sizeof(sum), field[1], strlen(field[1])); - if(crltab && okThumbprint(sum, crltab)) - continue; - entry = (Thumbprint*)emalloc(sizeof(*entry)); - memcpy(entry->sha1, sum, SHA1dlen); - i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1); - entry->next = table[i].next; - table[i].next = entry; - } - Bterm(bin); -} - -Thumbprint * -initThumbprints(char *ok, char *crl) -{ - Thumbprint *table, *crltab = nil; - - if(crl){ - crltab = emalloc(ThumbTab * sizeof(*table)); - loadThumbprints(crl, crltab, nil); - } - table = emalloc(ThumbTab * sizeof(*table)); - loadThumbprints(ok, table, crltab); - free(crltab); - return table; -} - diff --git a/sys/src/cmd/unix/drawterm/libsec/tlshand.c b/sys/src/cmd/unix/drawterm/libsec/tlshand.c deleted file mode 100644 index 0d04a66e9..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/tlshand.c +++ /dev/null @@ -1,2291 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <bio.h> -#include <auth.h> -#include <mp.h> -#include <libsec.h> - -// The main groups of functions are: -// client/server - main handshake protocol definition -// message functions - formating handshake messages -// cipher choices - catalog of digest and encrypt algorithms -// security functions - PKCS#1, sslHMAC, session keygen -// general utility functions - malloc, serialization -// The handshake protocol builds on the TLS/SSL3 record layer protocol, -// which is implemented in kernel device #a. See also /lib/rfc/rfc2246. - -enum { - TLSFinishedLen = 12, - SSL3FinishedLen = MD5dlen+SHA1dlen, - MaxKeyData = 104, // amount of secret we may need - MaxChunk = 1<<14, - RandomSize = 32, - SidSize = 32, - MasterSecretSize = 48, - AQueue = 0, - AFlush = 1, -}; - -typedef struct TlsSec TlsSec; - -typedef struct Bytes{ - int len; - uchar data[1]; // [len] -} Bytes; - -typedef struct Ints{ - int len; - int data[1]; // [len] -} Ints; - -typedef struct Algs{ - char *enc; - char *digest; - int nsecret; - int tlsid; - int ok; -} Algs; - -typedef struct Finished{ - uchar verify[SSL3FinishedLen]; - int n; -} Finished; - -typedef struct TlsConnection{ - TlsSec *sec; // security management goo - int hand, ctl; // record layer file descriptors - int erred; // set when tlsError called - int (*trace)(char*fmt, ...); // for debugging - int version; // protocol we are speaking - int verset; // version has been set - int ver2hi; // server got a version 2 hello - int isClient; // is this the client or server? - Bytes *sid; // SessionID - Bytes *cert; // only last - no chain - - Lock statelk; - int state; // must be set using setstate - - // input buffer for handshake messages - uchar buf[MaxChunk+2048]; - uchar *rp, *ep; - - uchar crandom[RandomSize]; // client random - uchar srandom[RandomSize]; // server random - int clientVersion; // version in ClientHello - char *digest; // name of digest algorithm to use - char *enc; // name of encryption algorithm to use - int nsecret; // amount of secret data to init keys - - // for finished messages - MD5state hsmd5; // handshake hash - SHAstate hssha1; // handshake hash - Finished finished; -} TlsConnection; - -typedef struct Msg{ - int tag; - union { - struct { - int version; - uchar random[RandomSize]; - Bytes* sid; - Ints* ciphers; - Bytes* compressors; - } clientHello; - struct { - int version; - uchar random[RandomSize]; - Bytes* sid; - int cipher; - int compressor; - } serverHello; - struct { - int ncert; - Bytes **certs; - } certificate; - struct { - Bytes *types; - int nca; - Bytes **cas; - } certificateRequest; - struct { - Bytes *key; - } clientKeyExchange; - Finished finished; - } u; -} Msg; - -typedef struct TlsSec{ - char *server; // name of remote; nil for server - int ok; // <0 killed; ==0 in progress; >0 reusable - RSApub *rsapub; - AuthRpc *rpc; // factotum for rsa private key - uchar sec[MasterSecretSize]; // master secret - uchar crandom[RandomSize]; // client random - uchar srandom[RandomSize]; // server random - int clientVers; // version in ClientHello - int vers; // final version - // byte generation and handshake checksum - void (*prf)(uchar*, int, uchar*, int, char*, uchar*, int, uchar*, int); - void (*setFinished)(TlsSec*, MD5state, SHAstate, uchar*, int); - int nfin; -} TlsSec; - - -enum { - TLSVersion = 0x0301, - SSL3Version = 0x0300, - ProtocolVersion = 0x0301, // maximum version we speak - MinProtoVersion = 0x0300, // limits on version we accept - MaxProtoVersion = 0x03ff, -}; - -// handshake type -enum { - HHelloRequest, - HClientHello, - HServerHello, - HSSL2ClientHello = 9, /* local convention; see devtls.c */ - HCertificate = 11, - HServerKeyExchange, - HCertificateRequest, - HServerHelloDone, - HCertificateVerify, - HClientKeyExchange, - HFinished = 20, - HMax -}; - -// alerts -enum { - ECloseNotify = 0, - EUnexpectedMessage = 10, - EBadRecordMac = 20, - EDecryptionFailed = 21, - ERecordOverflow = 22, - EDecompressionFailure = 30, - EHandshakeFailure = 40, - ENoCertificate = 41, - EBadCertificate = 42, - EUnsupportedCertificate = 43, - ECertificateRevoked = 44, - ECertificateExpired = 45, - ECertificateUnknown = 46, - EIllegalParameter = 47, - EUnknownCa = 48, - EAccessDenied = 49, - EDecodeError = 50, - EDecryptError = 51, - EExportRestriction = 60, - EProtocolVersion = 70, - EInsufficientSecurity = 71, - EInternalError = 80, - EUserCanceled = 90, - ENoRenegotiation = 100, - EMax = 256 -}; - -// cipher suites -enum { - TLS_NULL_WITH_NULL_NULL = 0x0000, - TLS_RSA_WITH_NULL_MD5 = 0x0001, - TLS_RSA_WITH_NULL_SHA = 0x0002, - TLS_RSA_EXPORT_WITH_RC4_40_MD5 = 0x0003, - TLS_RSA_WITH_RC4_128_MD5 = 0x0004, - TLS_RSA_WITH_RC4_128_SHA = 0x0005, - TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = 0X0006, - TLS_RSA_WITH_IDEA_CBC_SHA = 0X0007, - TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = 0X0008, - TLS_RSA_WITH_DES_CBC_SHA = 0X0009, - TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0X000A, - TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = 0X000B, - TLS_DH_DSS_WITH_DES_CBC_SHA = 0X000C, - TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0X000D, - TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = 0X000E, - TLS_DH_RSA_WITH_DES_CBC_SHA = 0X000F, - TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0X0010, - TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = 0X0011, - TLS_DHE_DSS_WITH_DES_CBC_SHA = 0X0012, - TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0X0013, // ZZZ must be implemented for tls1.0 compliance - TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = 0X0014, - TLS_DHE_RSA_WITH_DES_CBC_SHA = 0X0015, - TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0X0016, - TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = 0x0017, - TLS_DH_anon_WITH_RC4_128_MD5 = 0x0018, - TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = 0X0019, - TLS_DH_anon_WITH_DES_CBC_SHA = 0X001A, - TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = 0X001B, - - TLS_RSA_WITH_AES_128_CBC_SHA = 0X002f, // aes, aka rijndael with 128 bit blocks - TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0X0030, - TLS_DH_RSA_WITH_AES_128_CBC_SHA = 0X0031, - TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0X0032, - TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0X0033, - TLS_DH_anon_WITH_AES_128_CBC_SHA = 0X0034, - TLS_RSA_WITH_AES_256_CBC_SHA = 0X0035, - TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0X0036, - TLS_DH_RSA_WITH_AES_256_CBC_SHA = 0X0037, - TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0X0038, - TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0X0039, - TLS_DH_anon_WITH_AES_256_CBC_SHA = 0X003A, - CipherMax -}; - -// compression methods -enum { - CompressionNull = 0, - CompressionMax -}; - -static Algs cipherAlgs[] = { - {"rc4_128", "md5", 2 * (16 + MD5dlen), TLS_RSA_WITH_RC4_128_MD5}, - {"rc4_128", "sha1", 2 * (16 + SHA1dlen), TLS_RSA_WITH_RC4_128_SHA}, - {"3des_ede_cbc","sha1",2*(4*8+SHA1dlen), TLS_RSA_WITH_3DES_EDE_CBC_SHA}, -}; - -static uchar compressors[] = { - CompressionNull, -}; - -static TlsConnection *tlsServer2(int ctl, int hand, uchar *cert, int ncert, int (*trace)(char*fmt, ...)); -static TlsConnection *tlsClient2(int ctl, int hand, uchar *csid, int ncsid, int (*trace)(char*fmt, ...)); - -static void msgClear(Msg *m); -static char* msgPrint(char *buf, int n, Msg *m); -static int msgRecv(TlsConnection *c, Msg *m); -static int msgSend(TlsConnection *c, Msg *m, int act); -static void tlsError(TlsConnection *c, int err, char *msg, ...); -#pragma varargck argpos tlsError 3 -static int setVersion(TlsConnection *c, int version); -static int finishedMatch(TlsConnection *c, Finished *f); -static void tlsConnectionFree(TlsConnection *c); - -static int setAlgs(TlsConnection *c, int a); -static int okCipher(Ints *cv); -static int okCompression(Bytes *cv); -static int initCiphers(void); -static Ints* makeciphers(void); - -static TlsSec* tlsSecInits(int cvers, uchar *csid, int ncsid, uchar *crandom, uchar *ssid, int *nssid, uchar *srandom); -static int tlsSecSecrets(TlsSec *sec, int vers, uchar *epm, int nepm, uchar *kd, int nkd); -static TlsSec* tlsSecInitc(int cvers, uchar *crandom); -static int tlsSecSecretc(TlsSec *sec, uchar *sid, int nsid, uchar *srandom, uchar *cert, int ncert, int vers, uchar **epm, int *nepm, uchar *kd, int nkd); -static int tlsSecFinished(TlsSec *sec, MD5state md5, SHAstate sha1, uchar *fin, int nfin, int isclient); -static void tlsSecOk(TlsSec *sec); -static void tlsSecKill(TlsSec *sec); -static void tlsSecClose(TlsSec *sec); -static void setMasterSecret(TlsSec *sec, Bytes *pm); -static void serverMasterSecret(TlsSec *sec, uchar *epm, int nepm); -static void setSecrets(TlsSec *sec, uchar *kd, int nkd); -static int clientMasterSecret(TlsSec *sec, RSApub *pub, uchar **epm, int *nepm); -static Bytes *pkcs1_encrypt(Bytes* data, RSApub* key, int blocktype); -static Bytes *pkcs1_decrypt(TlsSec *sec, uchar *epm, int nepm); -static void tlsSetFinished(TlsSec *sec, MD5state hsmd5, SHAstate hssha1, uchar *finished, int isClient); -static void sslSetFinished(TlsSec *sec, MD5state hsmd5, SHAstate hssha1, uchar *finished, int isClient); -static void sslPRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label, - uchar *seed0, int nseed0, uchar *seed1, int nseed1); -static int setVers(TlsSec *sec, int version); - -static AuthRpc* factotum_rsa_open(uchar *cert, int certlen); -static mpint* factotum_rsa_decrypt(AuthRpc *rpc, mpint *cipher); -static void factotum_rsa_close(AuthRpc*rpc); - -static void* emalloc(int); -static void* erealloc(void*, int); -static void put32(uchar *p, u32int); -static void put24(uchar *p, int); -static void put16(uchar *p, int); -static u32int get32(uchar *p); -static int get24(uchar *p); -static int get16(uchar *p); -static Bytes* newbytes(int len); -static Bytes* makebytes(uchar* buf, int len); -static void freebytes(Bytes* b); -static Ints* newints(int len); -static Ints* makeints(int* buf, int len); -static void freeints(Ints* b); - -//================= client/server ======================== - -// push TLS onto fd, returning new (application) file descriptor -// or -1 if error. -int -tlsServer(int fd, TLSconn *conn) -{ - char buf[8]; - char dname[64]; - int n, data, ctl, hand; - TlsConnection *tls; - - if(conn == nil) - return -1; - ctl = open("#a/tls/clone", ORDWR); - if(ctl < 0) - return -1; - n = read(ctl, buf, sizeof(buf)-1); - if(n < 0){ - close(ctl); - return -1; - } - buf[n] = 0; - sprint(conn->dir, "#a/tls/%s", buf); - sprint(dname, "#a/tls/%s/hand", buf); - hand = open(dname, ORDWR); - if(hand < 0){ - close(ctl); - return -1; - } - fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion); - tls = tlsServer2(ctl, hand, conn->cert, conn->certlen, conn->trace); - sprint(dname, "#a/tls/%s/data", buf); - data = open(dname, ORDWR); - close(fd); - close(hand); - close(ctl); - if(data < 0){ - return -1; - } - if(tls == nil){ - close(data); - return -1; - } - if(conn->cert) - free(conn->cert); - conn->cert = 0; // client certificates are not yet implemented - conn->certlen = 0; - conn->sessionIDlen = tls->sid->len; - conn->sessionID = emalloc(conn->sessionIDlen); - memcpy(conn->sessionID, tls->sid->data, conn->sessionIDlen); - tlsConnectionFree(tls); - return data; -} - -// push TLS onto fd, returning new (application) file descriptor -// or -1 if error. -int -tlsClient(int fd, TLSconn *conn) -{ - char buf[8]; - char dname[64]; - int n, data, ctl, hand; - TlsConnection *tls; - - if(!conn) - return -1; - ctl = open("#a/tls/clone", ORDWR); - if(ctl < 0) - return -1; - n = read(ctl, buf, sizeof(buf)-1); - if(n < 0){ - close(ctl); - return -1; - } - buf[n] = 0; - sprint(conn->dir, "#a/tls/%s", buf); - sprint(dname, "#a/tls/%s/hand", buf); - hand = open(dname, ORDWR); - if(hand < 0){ - close(ctl); - return -1; - } - sprint(dname, "#a/tls/%s/data", buf); - data = open(dname, ORDWR); - if(data < 0) - return -1; - fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion); - tls = tlsClient2(ctl, hand, conn->sessionID, conn->sessionIDlen, conn->trace); - close(fd); - close(hand); - close(ctl); - if(tls == nil){ - close(data); - return -1; - } - conn->certlen = tls->cert->len; - conn->cert = emalloc(conn->certlen); - memcpy(conn->cert, tls->cert->data, conn->certlen); - conn->sessionIDlen = tls->sid->len; - conn->sessionID = emalloc(conn->sessionIDlen); - memcpy(conn->sessionID, tls->sid->data, conn->sessionIDlen); - tlsConnectionFree(tls); - return data; -} - -static TlsConnection * -tlsServer2(int ctl, int hand, uchar *cert, int ncert, int (*trace)(char*fmt, ...)) -{ - TlsConnection *c; - Msg m; - Bytes *csid; - uchar sid[SidSize], kd[MaxKeyData]; - char *secrets; - int cipher, compressor, nsid, rv; - - if(trace) - trace("tlsServer2\n"); - if(!initCiphers()) - return nil; - c = emalloc(sizeof(TlsConnection)); - c->ctl = ctl; - c->hand = hand; - c->trace = trace; - c->version = ProtocolVersion; - - memset(&m, 0, sizeof(m)); - if(!msgRecv(c, &m)){ - if(trace) - trace("initial msgRecv failed\n"); - goto Err; - } - if(m.tag != HClientHello) { - tlsError(c, EUnexpectedMessage, "expected a client hello"); - goto Err; - } - c->clientVersion = m.u.clientHello.version; - if(trace) - trace("ClientHello version %x\n", c->clientVersion); - if(setVersion(c, m.u.clientHello.version) < 0) { - tlsError(c, EIllegalParameter, "incompatible version"); - goto Err; - } - - memmove(c->crandom, m.u.clientHello.random, RandomSize); - cipher = okCipher(m.u.clientHello.ciphers); - if(cipher < 0) { - // reply with EInsufficientSecurity if we know that's the case - if(cipher == -2) - tlsError(c, EInsufficientSecurity, "cipher suites too weak"); - else - tlsError(c, EHandshakeFailure, "no matching cipher suite"); - goto Err; - } - if(!setAlgs(c, cipher)){ - tlsError(c, EHandshakeFailure, "no matching cipher suite"); - goto Err; - } - compressor = okCompression(m.u.clientHello.compressors); - if(compressor < 0) { - tlsError(c, EHandshakeFailure, "no matching compressor"); - goto Err; - } - - csid = m.u.clientHello.sid; - if(trace) - trace(" cipher %d, compressor %d, csidlen %d\n", cipher, compressor, csid->len); - c->sec = tlsSecInits(c->clientVersion, csid->data, csid->len, c->crandom, sid, &nsid, c->srandom); - if(c->sec == nil){ - tlsError(c, EHandshakeFailure, "can't initialize security: %r"); - goto Err; - } - c->sec->rpc = factotum_rsa_open(cert, ncert); - if(c->sec->rpc == nil){ - tlsError(c, EHandshakeFailure, "factotum_rsa_open: %r"); - goto Err; - } - c->sec->rsapub = X509toRSApub(cert, ncert, nil, 0); - msgClear(&m); - - m.tag = HServerHello; - m.u.serverHello.version = c->version; - memmove(m.u.serverHello.random, c->srandom, RandomSize); - m.u.serverHello.cipher = cipher; - m.u.serverHello.compressor = compressor; - c->sid = makebytes(sid, nsid); - m.u.serverHello.sid = makebytes(c->sid->data, c->sid->len); - if(!msgSend(c, &m, AQueue)) - goto Err; - msgClear(&m); - - m.tag = HCertificate; - m.u.certificate.ncert = 1; - m.u.certificate.certs = emalloc(m.u.certificate.ncert * sizeof(Bytes)); - m.u.certificate.certs[0] = makebytes(cert, ncert); - if(!msgSend(c, &m, AQueue)) - goto Err; - msgClear(&m); - - m.tag = HServerHelloDone; - if(!msgSend(c, &m, AFlush)) - goto Err; - msgClear(&m); - - if(!msgRecv(c, &m)) - goto Err; - if(m.tag != HClientKeyExchange) { - tlsError(c, EUnexpectedMessage, "expected a client key exchange"); - goto Err; - } - if(tlsSecSecrets(c->sec, c->version, m.u.clientKeyExchange.key->data, m.u.clientKeyExchange.key->len, kd, c->nsecret) < 0){ - tlsError(c, EHandshakeFailure, "couldn't set secrets: %r"); - goto Err; - } - if(trace) - trace("tls secrets\n"); - secrets = (char*)emalloc(2*c->nsecret); - enc64(secrets, 2*c->nsecret, kd, c->nsecret); - rv = fprint(c->ctl, "secret %s %s 0 %s", c->digest, c->enc, secrets); - memset(secrets, 0, 2*c->nsecret); - free(secrets); - memset(kd, 0, c->nsecret); - if(rv < 0){ - tlsError(c, EHandshakeFailure, "can't set keys: %r"); - goto Err; - } - msgClear(&m); - - /* no CertificateVerify; skip to Finished */ - if(tlsSecFinished(c->sec, c->hsmd5, c->hssha1, c->finished.verify, c->finished.n, 1) < 0){ - tlsError(c, EInternalError, "can't set finished: %r"); - goto Err; - } - if(!msgRecv(c, &m)) - goto Err; - if(m.tag != HFinished) { - tlsError(c, EUnexpectedMessage, "expected a finished"); - goto Err; - } - if(!finishedMatch(c, &m.u.finished)) { - tlsError(c, EHandshakeFailure, "finished verification failed"); - goto Err; - } - msgClear(&m); - - /* change cipher spec */ - if(fprint(c->ctl, "changecipher") < 0){ - tlsError(c, EInternalError, "can't enable cipher: %r"); - goto Err; - } - - if(tlsSecFinished(c->sec, c->hsmd5, c->hssha1, c->finished.verify, c->finished.n, 0) < 0){ - tlsError(c, EInternalError, "can't set finished: %r"); - goto Err; - } - m.tag = HFinished; - m.u.finished = c->finished; - if(!msgSend(c, &m, AFlush)) - goto Err; - msgClear(&m); - if(trace) - trace("tls finished\n"); - - if(fprint(c->ctl, "opened") < 0) - goto Err; - tlsSecOk(c->sec); - return c; - -Err: - msgClear(&m); - tlsConnectionFree(c); - return 0; -} - -static TlsConnection * -tlsClient2(int ctl, int hand, uchar *csid, int ncsid, int (*trace)(char*fmt, ...)) -{ - TlsConnection *c; - Msg m; - uchar kd[MaxKeyData], *epm; - char *secrets; - int creq, nepm, rv; - - if(!initCiphers()) - return nil; - epm = nil; - c = emalloc(sizeof(TlsConnection)); - c->version = ProtocolVersion; - c->ctl = ctl; - c->hand = hand; - c->trace = trace; - c->isClient = 1; - c->clientVersion = c->version; - - c->sec = tlsSecInitc(c->clientVersion, c->crandom); - if(c->sec == nil) - goto Err; - - /* client hello */ - memset(&m, 0, sizeof(m)); - m.tag = HClientHello; - m.u.clientHello.version = c->clientVersion; - memmove(m.u.clientHello.random, c->crandom, RandomSize); - m.u.clientHello.sid = makebytes(csid, ncsid); - m.u.clientHello.ciphers = makeciphers(); - m.u.clientHello.compressors = makebytes(compressors,sizeof(compressors)); - if(!msgSend(c, &m, AFlush)) - goto Err; - msgClear(&m); - - /* server hello */ - if(!msgRecv(c, &m)) - goto Err; - if(m.tag != HServerHello) { - tlsError(c, EUnexpectedMessage, "expected a server hello"); - goto Err; - } - if(setVersion(c, m.u.serverHello.version) < 0) { - tlsError(c, EIllegalParameter, "incompatible version %r"); - goto Err; - } - memmove(c->srandom, m.u.serverHello.random, RandomSize); - c->sid = makebytes(m.u.serverHello.sid->data, m.u.serverHello.sid->len); - if(c->sid->len != 0 && c->sid->len != SidSize) { - tlsError(c, EIllegalParameter, "invalid server session identifier"); - goto Err; - } - if(!setAlgs(c, m.u.serverHello.cipher)) { - tlsError(c, EIllegalParameter, "invalid cipher suite"); - goto Err; - } - if(m.u.serverHello.compressor != CompressionNull) { - tlsError(c, EIllegalParameter, "invalid compression"); - goto Err; - } - msgClear(&m); - - /* certificate */ - if(!msgRecv(c, &m) || m.tag != HCertificate) { - tlsError(c, EUnexpectedMessage, "expected a certificate"); - goto Err; - } - if(m.u.certificate.ncert < 1) { - tlsError(c, EIllegalParameter, "runt certificate"); - goto Err; - } - c->cert = makebytes(m.u.certificate.certs[0]->data, m.u.certificate.certs[0]->len); - msgClear(&m); - - /* server key exchange (optional) */ - if(!msgRecv(c, &m)) - goto Err; - if(m.tag == HServerKeyExchange) { - tlsError(c, EUnexpectedMessage, "got an server key exchange"); - goto Err; - // If implementing this later, watch out for rollback attack - // described in Wagner Schneier 1996, section 4.4. - } - - /* certificate request (optional) */ - creq = 0; - if(m.tag == HCertificateRequest) { - creq = 1; - msgClear(&m); - if(!msgRecv(c, &m)) - goto Err; - } - - if(m.tag != HServerHelloDone) { - tlsError(c, EUnexpectedMessage, "expected a server hello done"); - goto Err; - } - msgClear(&m); - - if(tlsSecSecretc(c->sec, c->sid->data, c->sid->len, c->srandom, - c->cert->data, c->cert->len, c->version, &epm, &nepm, - kd, c->nsecret) < 0){ - tlsError(c, EBadCertificate, "invalid x509/rsa certificate"); - goto Err; - } - secrets = (char*)emalloc(2*c->nsecret); - enc64(secrets, 2*c->nsecret, kd, c->nsecret); - rv = fprint(c->ctl, "secret %s %s 1 %s", c->digest, c->enc, secrets); - memset(secrets, 0, 2*c->nsecret); - free(secrets); - memset(kd, 0, c->nsecret); - if(rv < 0){ - tlsError(c, EHandshakeFailure, "can't set keys: %r"); - goto Err; - } - - if(creq) { - /* send a zero length certificate */ - m.tag = HCertificate; - if(!msgSend(c, &m, AFlush)) - goto Err; - msgClear(&m); - } - - /* client key exchange */ - m.tag = HClientKeyExchange; - m.u.clientKeyExchange.key = makebytes(epm, nepm); - free(epm); - epm = nil; - if(m.u.clientKeyExchange.key == nil) { - tlsError(c, EHandshakeFailure, "can't set secret: %r"); - goto Err; - } - if(!msgSend(c, &m, AFlush)) - goto Err; - msgClear(&m); - - /* change cipher spec */ - if(fprint(c->ctl, "changecipher") < 0){ - tlsError(c, EInternalError, "can't enable cipher: %r"); - goto Err; - } - - // Cipherchange must occur immediately before Finished to avoid - // potential hole; see section 4.3 of Wagner Schneier 1996. - if(tlsSecFinished(c->sec, c->hsmd5, c->hssha1, c->finished.verify, c->finished.n, 1) < 0){ - tlsError(c, EInternalError, "can't set finished 1: %r"); - goto Err; - } - m.tag = HFinished; - m.u.finished = c->finished; - - if(!msgSend(c, &m, AFlush)) { - fprint(2, "tlsClient nepm=%d\n", nepm); - tlsError(c, EInternalError, "can't flush after client Finished: %r"); - goto Err; - } - msgClear(&m); - - if(tlsSecFinished(c->sec, c->hsmd5, c->hssha1, c->finished.verify, c->finished.n, 0) < 0){ - fprint(2, "tlsClient nepm=%d\n", nepm); - tlsError(c, EInternalError, "can't set finished 0: %r"); - goto Err; - } - if(!msgRecv(c, &m)) { - fprint(2, "tlsClient nepm=%d\n", nepm); - tlsError(c, EInternalError, "can't read server Finished: %r"); - goto Err; - } - if(m.tag != HFinished) { - fprint(2, "tlsClient nepm=%d\n", nepm); - tlsError(c, EUnexpectedMessage, "expected a Finished msg from server"); - goto Err; - } - - if(!finishedMatch(c, &m.u.finished)) { - tlsError(c, EHandshakeFailure, "finished verification failed"); - goto Err; - } - msgClear(&m); - - if(fprint(c->ctl, "opened") < 0){ - if(trace) - trace("unable to do final open: %r\n"); - goto Err; - } - tlsSecOk(c->sec); - return c; - -Err: - free(epm); - msgClear(&m); - tlsConnectionFree(c); - return 0; -} - - -//================= message functions ======================== - -static uchar sendbuf[9000], *sendp; - -static int -msgSend(TlsConnection *c, Msg *m, int act) -{ - uchar *p; // sendp = start of new message; p = write pointer - int nn, n, i; - - if(sendp == nil) - sendp = sendbuf; - p = sendp; - if(c->trace) - c->trace("send %s", msgPrint((char*)p, (sizeof sendbuf) - (p-sendbuf), m)); - - p[0] = m->tag; // header - fill in size later - p += 4; - - switch(m->tag) { - default: - tlsError(c, EInternalError, "can't encode a %d", m->tag); - goto Err; - case HClientHello: - // version - put16(p, m->u.clientHello.version); - p += 2; - - // random - memmove(p, m->u.clientHello.random, RandomSize); - p += RandomSize; - - // sid - n = m->u.clientHello.sid->len; - assert(n < 256); - p[0] = n; - memmove(p+1, m->u.clientHello.sid->data, n); - p += n+1; - - n = m->u.clientHello.ciphers->len; - assert(n > 0 && n < 200); - put16(p, n*2); - p += 2; - for(i=0; i<n; i++) { - put16(p, m->u.clientHello.ciphers->data[i]); - p += 2; - } - - n = m->u.clientHello.compressors->len; - assert(n > 0); - p[0] = n; - memmove(p+1, m->u.clientHello.compressors->data, n); - p += n+1; - break; - case HServerHello: - put16(p, m->u.serverHello.version); - p += 2; - - // random - memmove(p, m->u.serverHello.random, RandomSize); - p += RandomSize; - - // sid - n = m->u.serverHello.sid->len; - assert(n < 256); - p[0] = n; - memmove(p+1, m->u.serverHello.sid->data, n); - p += n+1; - - put16(p, m->u.serverHello.cipher); - p += 2; - p[0] = m->u.serverHello.compressor; - p += 1; - break; - case HServerHelloDone: - break; - case HCertificate: - nn = 0; - for(i = 0; i < m->u.certificate.ncert; i++) - nn += 3 + m->u.certificate.certs[i]->len; - if(p + 3 + nn - sendbuf > sizeof(sendbuf)) { - tlsError(c, EInternalError, "output buffer too small for certificate"); - goto Err; - } - put24(p, nn); - p += 3; - for(i = 0; i < m->u.certificate.ncert; i++){ - put24(p, m->u.certificate.certs[i]->len); - p += 3; - memmove(p, m->u.certificate.certs[i]->data, m->u.certificate.certs[i]->len); - p += m->u.certificate.certs[i]->len; - } - break; - case HClientKeyExchange: - n = m->u.clientKeyExchange.key->len; - if(c->version != SSL3Version){ - put16(p, n); - p += 2; - } - memmove(p, m->u.clientKeyExchange.key->data, n); - p += n; - break; - case HFinished: - memmove(p, m->u.finished.verify, m->u.finished.n); - p += m->u.finished.n; - break; - } - - // go back and fill in size - n = p-sendp; - assert(p <= sendbuf+sizeof(sendbuf)); - put24(sendp+1, n-4); - - // remember hash of Handshake messages - if(m->tag != HHelloRequest) { - md5(sendp, n, 0, &c->hsmd5); - sha1(sendp, n, 0, &c->hssha1); - } - - sendp = p; - if(act == AFlush){ - sendp = sendbuf; - if(write(c->hand, sendbuf, p-sendbuf) < 0){ - fprint(2, "write error: %r\n"); - goto Err; - } - } - msgClear(m); - return 1; -Err: - msgClear(m); - return 0; -} - -static uchar* -tlsReadN(TlsConnection *c, int n) -{ - uchar *p; - int nn, nr; - - nn = c->ep - c->rp; - if(nn < n){ - if(c->rp != c->buf){ - memmove(c->buf, c->rp, nn); - c->rp = c->buf; - c->ep = &c->buf[nn]; - } - for(; nn < n; nn += nr) { - nr = read(c->hand, &c->rp[nn], n - nn); - if(nr <= 0) - return nil; - c->ep += nr; - } - } - p = c->rp; - c->rp += n; - return p; -} - -static int -msgRecv(TlsConnection *c, Msg *m) -{ - uchar *p; - int type, n, nn, i, nsid, nrandom, nciph; - - for(;;) { - p = tlsReadN(c, 4); - if(p == nil) - return 0; - type = p[0]; - n = get24(p+1); - - if(type != HHelloRequest) - break; - if(n != 0) { - tlsError(c, EDecodeError, "invalid hello request during handshake"); - return 0; - } - } - - if(n > sizeof(c->buf)) { - tlsError(c, EDecodeError, "handshake message too long %d %d", n, sizeof(c->buf)); - return 0; - } - - if(type == HSSL2ClientHello){ - /* Cope with an SSL3 ClientHello expressed in SSL2 record format. - This is sent by some clients that we must interoperate - with, such as Java's JSSE and Microsoft's Internet Explorer. */ - p = tlsReadN(c, n); - if(p == nil) - return 0; - md5(p, n, 0, &c->hsmd5); - sha1(p, n, 0, &c->hssha1); - m->tag = HClientHello; - if(n < 22) - goto Short; - m->u.clientHello.version = get16(p+1); - p += 3; - n -= 3; - nn = get16(p); /* cipher_spec_len */ - nsid = get16(p + 2); - nrandom = get16(p + 4); - p += 6; - n -= 6; - if(nsid != 0 /* no sid's, since shouldn't restart using ssl2 header */ - || nrandom < 16 || nn % 3) - goto Err; - if(c->trace && (n - nrandom != nn)) - c->trace("n-nrandom!=nn: n=%d nrandom=%d nn=%d\n", n, nrandom, nn); - /* ignore ssl2 ciphers and look for {0x00, ssl3 cipher} */ - nciph = 0; - for(i = 0; i < nn; i += 3) - if(p[i] == 0) - nciph++; - m->u.clientHello.ciphers = newints(nciph); - nciph = 0; - for(i = 0; i < nn; i += 3) - if(p[i] == 0) - m->u.clientHello.ciphers->data[nciph++] = get16(&p[i + 1]); - p += nn; - m->u.clientHello.sid = makebytes(nil, 0); - if(nrandom > RandomSize) - nrandom = RandomSize; - memset(m->u.clientHello.random, 0, RandomSize - nrandom); - memmove(&m->u.clientHello.random[RandomSize - nrandom], p, nrandom); - m->u.clientHello.compressors = newbytes(1); - m->u.clientHello.compressors->data[0] = CompressionNull; - goto Ok; - } - - md5(p, 4, 0, &c->hsmd5); - sha1(p, 4, 0, &c->hssha1); - - p = tlsReadN(c, n); - if(p == nil) - return 0; - - md5(p, n, 0, &c->hsmd5); - sha1(p, n, 0, &c->hssha1); - - m->tag = type; - - switch(type) { - default: - tlsError(c, EUnexpectedMessage, "can't decode a %d", type); - goto Err; - case HClientHello: - if(n < 2) - goto Short; - m->u.clientHello.version = get16(p); - p += 2; - n -= 2; - - if(n < RandomSize) - goto Short; - memmove(m->u.clientHello.random, p, RandomSize); - p += RandomSize; - n -= RandomSize; - if(n < 1 || n < p[0]+1) - goto Short; - m->u.clientHello.sid = makebytes(p+1, p[0]); - p += m->u.clientHello.sid->len+1; - n -= m->u.clientHello.sid->len+1; - - if(n < 2) - goto Short; - nn = get16(p); - p += 2; - n -= 2; - - if((nn & 1) || n < nn || nn < 2) - goto Short; - m->u.clientHello.ciphers = newints(nn >> 1); - for(i = 0; i < nn; i += 2) - m->u.clientHello.ciphers->data[i >> 1] = get16(&p[i]); - p += nn; - n -= nn; - - if(n < 1 || n < p[0]+1 || p[0] == 0) - goto Short; - nn = p[0]; - m->u.clientHello.compressors = newbytes(nn); - memmove(m->u.clientHello.compressors->data, p+1, nn); - n -= nn + 1; - break; - case HServerHello: - if(n < 2) - goto Short; - m->u.serverHello.version = get16(p); - p += 2; - n -= 2; - - if(n < RandomSize) - goto Short; - memmove(m->u.serverHello.random, p, RandomSize); - p += RandomSize; - n -= RandomSize; - - if(n < 1 || n < p[0]+1) - goto Short; - m->u.serverHello.sid = makebytes(p+1, p[0]); - p += m->u.serverHello.sid->len+1; - n -= m->u.serverHello.sid->len+1; - - if(n < 3) - goto Short; - m->u.serverHello.cipher = get16(p); - m->u.serverHello.compressor = p[2]; - n -= 3; - break; - case HCertificate: - if(n < 3) - goto Short; - nn = get24(p); - p += 3; - n -= 3; - if(n != nn) - goto Short; - /* certs */ - i = 0; - while(n > 0) { - if(n < 3) - goto Short; - nn = get24(p); - p += 3; - n -= 3; - if(nn > n) - goto Short; - m->u.certificate.ncert = i+1; - m->u.certificate.certs = erealloc(m->u.certificate.certs, (i+1)*sizeof(Bytes)); - m->u.certificate.certs[i] = makebytes(p, nn); - p += nn; - n -= nn; - i++; - } - break; - case HCertificateRequest: - if(n < 2) - goto Short; - nn = get16(p); - p += 2; - n -= 2; - if(nn < 1 || nn > n) - goto Short; - m->u.certificateRequest.types = makebytes(p, nn); - nn = get24(p); - p += 3; - n -= 3; - if(nn == 0 || n != nn) - goto Short; - /* cas */ - i = 0; - while(n > 0) { - if(n < 2) - goto Short; - nn = get16(p); - p += 2; - n -= 2; - if(nn < 1 || nn > n) - goto Short; - m->u.certificateRequest.nca = i+1; - m->u.certificateRequest.cas = erealloc(m->u.certificateRequest.cas, (i+1)*sizeof(Bytes)); - m->u.certificateRequest.cas[i] = makebytes(p, nn); - p += nn; - n -= nn; - i++; - } - break; - case HServerHelloDone: - break; - case HClientKeyExchange: - /* - * this message depends upon the encryption selected - * assume rsa. - */ - if(c->version == SSL3Version) - nn = n; - else{ - if(n < 2) - goto Short; - nn = get16(p); - p += 2; - n -= 2; - } - if(n < nn) - goto Short; - m->u.clientKeyExchange.key = makebytes(p, nn); - n -= nn; - break; - case HFinished: - m->u.finished.n = c->finished.n; - if(n < m->u.finished.n) - goto Short; - memmove(m->u.finished.verify, p, m->u.finished.n); - n -= m->u.finished.n; - break; - } - - if(type != HClientHello && n != 0) - goto Short; -Ok: - if(c->trace){ - char buf[8000]; - c->trace("recv %s", msgPrint(buf, sizeof buf, m)); - } - return 1; -Short: - tlsError(c, EDecodeError, "handshake message has invalid length"); -Err: - msgClear(m); - return 0; -} - -static void -msgClear(Msg *m) -{ - int i; - - switch(m->tag) { - default: - sysfatal("msgClear: unknown message type: %d", m->tag); - case HHelloRequest: - break; - case HClientHello: - freebytes(m->u.clientHello.sid); - freeints(m->u.clientHello.ciphers); - freebytes(m->u.clientHello.compressors); - break; - case HServerHello: - freebytes(m->u.clientHello.sid); - break; - case HCertificate: - for(i=0; i<m->u.certificate.ncert; i++) - freebytes(m->u.certificate.certs[i]); - free(m->u.certificate.certs); - break; - case HCertificateRequest: - freebytes(m->u.certificateRequest.types); - for(i=0; i<m->u.certificateRequest.nca; i++) - freebytes(m->u.certificateRequest.cas[i]); - free(m->u.certificateRequest.cas); - break; - case HServerHelloDone: - break; - case HClientKeyExchange: - freebytes(m->u.clientKeyExchange.key); - break; - case HFinished: - break; - } - memset(m, 0, sizeof(Msg)); -} - -static char * -bytesPrint(char *bs, char *be, char *s0, Bytes *b, char *s1) -{ - int i; - - if(s0) - bs = seprint(bs, be, "%s", s0); - bs = seprint(bs, be, "["); - if(b == nil) - bs = seprint(bs, be, "nil"); - else - for(i=0; i<b->len; i++) - bs = seprint(bs, be, "%.2x ", b->data[i]); - bs = seprint(bs, be, "]"); - if(s1) - bs = seprint(bs, be, "%s", s1); - return bs; -} - -static char * -intsPrint(char *bs, char *be, char *s0, Ints *b, char *s1) -{ - int i; - - if(s0) - bs = seprint(bs, be, "%s", s0); - bs = seprint(bs, be, "["); - if(b == nil) - bs = seprint(bs, be, "nil"); - else - for(i=0; i<b->len; i++) - bs = seprint(bs, be, "%x ", b->data[i]); - bs = seprint(bs, be, "]"); - if(s1) - bs = seprint(bs, be, "%s", s1); - return bs; -} - -static char* -msgPrint(char *buf, int n, Msg *m) -{ - int i; - char *bs = buf, *be = buf+n; - - switch(m->tag) { - default: - bs = seprint(bs, be, "unknown %d\n", m->tag); - break; - case HClientHello: - bs = seprint(bs, be, "ClientHello\n"); - bs = seprint(bs, be, "\tversion: %.4x\n", m->u.clientHello.version); - bs = seprint(bs, be, "\trandom: "); - for(i=0; i<RandomSize; i++) - bs = seprint(bs, be, "%.2x", m->u.clientHello.random[i]); - bs = seprint(bs, be, "\n"); - bs = bytesPrint(bs, be, "\tsid: ", m->u.clientHello.sid, "\n"); - bs = intsPrint(bs, be, "\tciphers: ", m->u.clientHello.ciphers, "\n"); - bs = bytesPrint(bs, be, "\tcompressors: ", m->u.clientHello.compressors, "\n"); - break; - case HServerHello: - bs = seprint(bs, be, "ServerHello\n"); - bs = seprint(bs, be, "\tversion: %.4x\n", m->u.serverHello.version); - bs = seprint(bs, be, "\trandom: "); - for(i=0; i<RandomSize; i++) - bs = seprint(bs, be, "%.2x", m->u.serverHello.random[i]); - bs = seprint(bs, be, "\n"); - bs = bytesPrint(bs, be, "\tsid: ", m->u.serverHello.sid, "\n"); - bs = seprint(bs, be, "\tcipher: %.4x\n", m->u.serverHello.cipher); - bs = seprint(bs, be, "\tcompressor: %.2x\n", m->u.serverHello.compressor); - break; - case HCertificate: - bs = seprint(bs, be, "Certificate\n"); - for(i=0; i<m->u.certificate.ncert; i++) - bs = bytesPrint(bs, be, "\t", m->u.certificate.certs[i], "\n"); - break; - case HCertificateRequest: - bs = seprint(bs, be, "CertificateRequest\n"); - bs = bytesPrint(bs, be, "\ttypes: ", m->u.certificateRequest.types, "\n"); - bs = seprint(bs, be, "\tcertificateauthorities\n"); - for(i=0; i<m->u.certificateRequest.nca; i++) - bs = bytesPrint(bs, be, "\t\t", m->u.certificateRequest.cas[i], "\n"); - break; - case HServerHelloDone: - bs = seprint(bs, be, "ServerHelloDone\n"); - break; - case HClientKeyExchange: - bs = seprint(bs, be, "HClientKeyExchange\n"); - bs = bytesPrint(bs, be, "\tkey: ", m->u.clientKeyExchange.key, "\n"); - break; - case HFinished: - bs = seprint(bs, be, "HFinished\n"); - for(i=0; i<m->u.finished.n; i++) - bs = seprint(bs, be, "%.2x", m->u.finished.verify[i]); - bs = seprint(bs, be, "\n"); - break; - } - USED(bs); - return buf; -} - -static void -tlsError(TlsConnection *c, int err, char *fmt, ...) -{ - char msg[512]; - va_list arg; - - va_start(arg, fmt); - vseprint(msg, msg+sizeof(msg), fmt, arg); - va_end(arg); - if(c->trace) - c->trace("tlsError: %s\n", msg); - else if(c->erred) - fprint(2, "double error: %r, %s", msg); - else - werrstr("tls: local %s", msg); - c->erred = 1; - fprint(c->ctl, "alert %d", err); -} - -// commit to specific version number -static int -setVersion(TlsConnection *c, int version) -{ - if(c->verset || version > MaxProtoVersion || version < MinProtoVersion) - return -1; - if(version > c->version) - version = c->version; - if(version == SSL3Version) { - c->version = version; - c->finished.n = SSL3FinishedLen; - }else if(version == TLSVersion){ - c->version = version; - c->finished.n = TLSFinishedLen; - }else - return -1; - c->verset = 1; - return fprint(c->ctl, "version 0x%x", version); -} - -// confirm that received Finished message matches the expected value -static int -finishedMatch(TlsConnection *c, Finished *f) -{ - return memcmp(f->verify, c->finished.verify, f->n) == 0; -} - -// free memory associated with TlsConnection struct -// (but don't close the TLS channel itself) -static void -tlsConnectionFree(TlsConnection *c) -{ - tlsSecClose(c->sec); - freebytes(c->sid); - freebytes(c->cert); - memset(c, 0, sizeof(c)); - free(c); -} - - -//================= cipher choices ======================== - -static int weakCipher[CipherMax] = -{ - 1, /* TLS_NULL_WITH_NULL_NULL */ - 1, /* TLS_RSA_WITH_NULL_MD5 */ - 1, /* TLS_RSA_WITH_NULL_SHA */ - 1, /* TLS_RSA_EXPORT_WITH_RC4_40_MD5 */ - 0, /* TLS_RSA_WITH_RC4_128_MD5 */ - 0, /* TLS_RSA_WITH_RC4_128_SHA */ - 1, /* TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 */ - 0, /* TLS_RSA_WITH_IDEA_CBC_SHA */ - 1, /* TLS_RSA_EXPORT_WITH_DES40_CBC_SHA */ - 0, /* TLS_RSA_WITH_DES_CBC_SHA */ - 0, /* TLS_RSA_WITH_3DES_EDE_CBC_SHA */ - 1, /* TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA */ - 0, /* TLS_DH_DSS_WITH_DES_CBC_SHA */ - 0, /* TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA */ - 1, /* TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA */ - 0, /* TLS_DH_RSA_WITH_DES_CBC_SHA */ - 0, /* TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA */ - 1, /* TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA */ - 0, /* TLS_DHE_DSS_WITH_DES_CBC_SHA */ - 0, /* TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA */ - 1, /* TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA */ - 0, /* TLS_DHE_RSA_WITH_DES_CBC_SHA */ - 0, /* TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA */ - 1, /* TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 */ - 1, /* TLS_DH_anon_WITH_RC4_128_MD5 */ - 1, /* TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA */ - 1, /* TLS_DH_anon_WITH_DES_CBC_SHA */ - 1, /* TLS_DH_anon_WITH_3DES_EDE_CBC_SHA */ -}; - -static int -setAlgs(TlsConnection *c, int a) -{ - int i; - - for(i = 0; i < nelem(cipherAlgs); i++){ - if(cipherAlgs[i].tlsid == a){ - c->enc = cipherAlgs[i].enc; - c->digest = cipherAlgs[i].digest; - c->nsecret = cipherAlgs[i].nsecret; - if(c->nsecret > MaxKeyData) - return 0; - return 1; - } - } - return 0; -} - -static int -okCipher(Ints *cv) -{ - int weak, i, j, c; - - weak = 1; - for(i = 0; i < cv->len; i++) { - c = cv->data[i]; - if(c >= CipherMax) - weak = 0; - else - weak &= weakCipher[c]; - for(j = 0; j < nelem(cipherAlgs); j++) - if(cipherAlgs[j].ok && cipherAlgs[j].tlsid == c) - return c; - } - if(weak) - return -2; - return -1; -} - -static int -okCompression(Bytes *cv) -{ - int i, j, c; - - for(i = 0; i < cv->len; i++) { - c = cv->data[i]; - for(j = 0; j < nelem(compressors); j++) { - if(compressors[j] == c) - return c; - } - } - return -1; -} - -static Lock ciphLock; -static int nciphers; - -static int -initCiphers(void) -{ - enum {MaxAlgF = 1024, MaxAlgs = 10}; - char s[MaxAlgF], *flds[MaxAlgs]; - int i, j, n, ok; - - lock(&ciphLock); - if(nciphers){ - unlock(&ciphLock); - return nciphers; - } - j = open("#a/tls/encalgs", OREAD); - if(j < 0){ - werrstr("can't open #a/tls/encalgs: %r"); - return 0; - } - n = read(j, s, MaxAlgF-1); - close(j); - if(n <= 0){ - werrstr("nothing in #a/tls/encalgs: %r"); - return 0; - } - s[n] = 0; - n = getfields(s, flds, MaxAlgs, 1, " \t\r\n"); - for(i = 0; i < nelem(cipherAlgs); i++){ - ok = 0; - for(j = 0; j < n; j++){ - if(strcmp(cipherAlgs[i].enc, flds[j]) == 0){ - ok = 1; - break; - } - } - cipherAlgs[i].ok = ok; - } - - j = open("#a/tls/hashalgs", OREAD); - if(j < 0){ - werrstr("can't open #a/tls/hashalgs: %r"); - return 0; - } - n = read(j, s, MaxAlgF-1); - close(j); - if(n <= 0){ - werrstr("nothing in #a/tls/hashalgs: %r"); - return 0; - } - s[n] = 0; - n = getfields(s, flds, MaxAlgs, 1, " \t\r\n"); - for(i = 0; i < nelem(cipherAlgs); i++){ - ok = 0; - for(j = 0; j < n; j++){ - if(strcmp(cipherAlgs[i].digest, flds[j]) == 0){ - ok = 1; - break; - } - } - cipherAlgs[i].ok &= ok; - if(cipherAlgs[i].ok) - nciphers++; - } - unlock(&ciphLock); - return nciphers; -} - -static Ints* -makeciphers(void) -{ - Ints *is; - int i, j; - - is = newints(nciphers); - j = 0; - for(i = 0; i < nelem(cipherAlgs); i++){ - if(cipherAlgs[i].ok) - is->data[j++] = cipherAlgs[i].tlsid; - } - return is; -} - - - -//================= security functions ======================== - -// given X.509 certificate, set up connection to factotum -// for using corresponding private key -static AuthRpc* -factotum_rsa_open(uchar *cert, int certlen) -{ - int afd; - char *s; - mpint *pub = nil; - RSApub *rsapub; - AuthRpc *rpc; - - // start talking to factotum - if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0) - return nil; - if((rpc = auth_allocrpc(afd)) == nil){ - close(afd); - return nil; - } - s = "proto=rsa service=tls role=client"; - if(auth_rpc(rpc, "start", s, strlen(s)) != ARok){ - factotum_rsa_close(rpc); - return nil; - } - - // roll factotum keyring around to match certificate - rsapub = X509toRSApub(cert, certlen, nil, 0); - while(1){ - if(auth_rpc(rpc, "read", nil, 0) != ARok){ - factotum_rsa_close(rpc); - rpc = nil; - goto done; - } - pub = strtomp(rpc->arg, nil, 16, nil); - assert(pub != nil); - if(mpcmp(pub,rsapub->n) == 0) - break; - } -done: - mpfree(pub); - rsapubfree(rsapub); - return rpc; -} - -static mpint* -factotum_rsa_decrypt(AuthRpc *rpc, mpint *cipher) -{ - char *p; - int rv; - - if((p = mptoa(cipher, 16, nil, 0)) == nil) - return nil; - rv = auth_rpc(rpc, "write", p, strlen(p)); - free(p); - if(rv != ARok || auth_rpc(rpc, "read", nil, 0) != ARok) - return nil; - mpfree(cipher); - return strtomp(rpc->arg, nil, 16, nil); -} - -static void -factotum_rsa_close(AuthRpc*rpc) -{ - if(!rpc) - return; - close(rpc->afd); - auth_freerpc(rpc); -} - -static void -tlsPmd5(uchar *buf, int nbuf, uchar *key, int nkey, uchar *label, int nlabel, uchar *seed0, int nseed0, uchar *seed1, int nseed1) -{ - uchar ai[MD5dlen], tmp[MD5dlen]; - int i, n; - MD5state *s; - - // generate a1 - s = hmac_md5(label, nlabel, key, nkey, nil, nil); - s = hmac_md5(seed0, nseed0, key, nkey, nil, s); - hmac_md5(seed1, nseed1, key, nkey, ai, s); - - while(nbuf > 0) { - s = hmac_md5(ai, MD5dlen, key, nkey, nil, nil); - s = hmac_md5(label, nlabel, key, nkey, nil, s); - s = hmac_md5(seed0, nseed0, key, nkey, nil, s); - hmac_md5(seed1, nseed1, key, nkey, tmp, s); - n = MD5dlen; - if(n > nbuf) - n = nbuf; - for(i = 0; i < n; i++) - buf[i] ^= tmp[i]; - buf += n; - nbuf -= n; - hmac_md5(ai, MD5dlen, key, nkey, tmp, nil); - memmove(ai, tmp, MD5dlen); - } -} - -static void -tlsPsha1(uchar *buf, int nbuf, uchar *key, int nkey, uchar *label, int nlabel, uchar *seed0, int nseed0, uchar *seed1, int nseed1) -{ - uchar ai[SHA1dlen], tmp[SHA1dlen]; - int i, n; - SHAstate *s; - - // generate a1 - s = hmac_sha1(label, nlabel, key, nkey, nil, nil); - s = hmac_sha1(seed0, nseed0, key, nkey, nil, s); - hmac_sha1(seed1, nseed1, key, nkey, ai, s); - - while(nbuf > 0) { - s = hmac_sha1(ai, SHA1dlen, key, nkey, nil, nil); - s = hmac_sha1(label, nlabel, key, nkey, nil, s); - s = hmac_sha1(seed0, nseed0, key, nkey, nil, s); - hmac_sha1(seed1, nseed1, key, nkey, tmp, s); - n = SHA1dlen; - if(n > nbuf) - n = nbuf; - for(i = 0; i < n; i++) - buf[i] ^= tmp[i]; - buf += n; - nbuf -= n; - hmac_sha1(ai, SHA1dlen, key, nkey, tmp, nil); - memmove(ai, tmp, SHA1dlen); - } -} - -// fill buf with md5(args)^sha1(args) -static void -tlsPRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label, uchar *seed0, int nseed0, uchar *seed1, int nseed1) -{ - int i; - int nlabel = strlen(label); - int n = (nkey + 1) >> 1; - - for(i = 0; i < nbuf; i++) - buf[i] = 0; - tlsPmd5(buf, nbuf, key, n, (uchar*)label, nlabel, seed0, nseed0, seed1, nseed1); - tlsPsha1(buf, nbuf, key+nkey-n, n, (uchar*)label, nlabel, seed0, nseed0, seed1, nseed1); -} - -/* - * for setting server session id's - */ -static Lock sidLock; -static long maxSid = 1; - -/* the keys are verified to have the same public components - * and to function correctly with pkcs 1 encryption and decryption. */ -static TlsSec* -tlsSecInits(int cvers, uchar *csid, int ncsid, uchar *crandom, uchar *ssid, int *nssid, uchar *srandom) -{ - TlsSec *sec = emalloc(sizeof(*sec)); - - USED(csid); USED(ncsid); // ignore csid for now - - memmove(sec->crandom, crandom, RandomSize); - sec->clientVers = cvers; - - put32(sec->srandom, time(0)); - genrandom(sec->srandom+4, RandomSize-4); - memmove(srandom, sec->srandom, RandomSize); - - /* - * make up a unique sid: use our pid, and and incrementing id - * can signal no sid by setting nssid to 0. - */ - memset(ssid, 0, SidSize); - put32(ssid, getpid()); - lock(&sidLock); - put32(ssid+4, maxSid++); - unlock(&sidLock); - *nssid = SidSize; - return sec; -} - -static int -tlsSecSecrets(TlsSec *sec, int vers, uchar *epm, int nepm, uchar *kd, int nkd) -{ - if(epm != nil){ - if(setVers(sec, vers) < 0) - goto Err; - serverMasterSecret(sec, epm, nepm); - }else if(sec->vers != vers){ - werrstr("mismatched session versions"); - goto Err; - } - setSecrets(sec, kd, nkd); - return 0; -Err: - sec->ok = -1; - return -1; -} - -static TlsSec* -tlsSecInitc(int cvers, uchar *crandom) -{ - TlsSec *sec = emalloc(sizeof(*sec)); - sec->clientVers = cvers; - put32(sec->crandom, time(0)); - genrandom(sec->crandom+4, RandomSize-4); - memmove(crandom, sec->crandom, RandomSize); - return sec; -} - -static int -tlsSecSecretc(TlsSec *sec, uchar *sid, int nsid, uchar *srandom, uchar *cert, int ncert, int vers, uchar **epm, int *nepm, uchar *kd, int nkd) -{ - RSApub *pub; - - pub = nil; - - USED(sid); - USED(nsid); - - memmove(sec->srandom, srandom, RandomSize); - - if(setVers(sec, vers) < 0) - goto Err; - - pub = X509toRSApub(cert, ncert, nil, 0); - if(pub == nil){ - werrstr("invalid x509/rsa certificate"); - goto Err; - } - if(clientMasterSecret(sec, pub, epm, nepm) < 0) - goto Err; - rsapubfree(pub); - setSecrets(sec, kd, nkd); - return 0; - -Err: - if(pub != nil) - rsapubfree(pub); - sec->ok = -1; - return -1; -} - -static int -tlsSecFinished(TlsSec *sec, MD5state md5, SHAstate sha1, uchar *fin, int nfin, int isclient) -{ - if(sec->nfin != nfin){ - sec->ok = -1; - werrstr("invalid finished exchange"); - return -1; - } - md5.malloced = 0; - sha1.malloced = 0; - (*sec->setFinished)(sec, md5, sha1, fin, isclient); - return 1; -} - -static void -tlsSecOk(TlsSec *sec) -{ - if(sec->ok == 0) - sec->ok = 1; -} - -static void -tlsSecKill(TlsSec *sec) -{ - if(!sec) - return; - factotum_rsa_close(sec->rpc); - sec->ok = -1; -} - -static void -tlsSecClose(TlsSec *sec) -{ - if(!sec) - return; - factotum_rsa_close(sec->rpc); - free(sec->server); - free(sec); -} - -static int -setVers(TlsSec *sec, int v) -{ - if(v == SSL3Version){ - sec->setFinished = sslSetFinished; - sec->nfin = SSL3FinishedLen; - sec->prf = sslPRF; - }else if(v == TLSVersion){ - sec->setFinished = tlsSetFinished; - sec->nfin = TLSFinishedLen; - sec->prf = tlsPRF; - }else{ - werrstr("invalid version"); - return -1; - } - sec->vers = v; - return 0; -} - -/* - * generate secret keys from the master secret. - * - * different crypto selections will require different amounts - * of key expansion and use of key expansion data, - * but it's all generated using the same function. - */ -static void -setSecrets(TlsSec *sec, uchar *kd, int nkd) -{ - (*sec->prf)(kd, nkd, sec->sec, MasterSecretSize, "key expansion", - sec->srandom, RandomSize, sec->crandom, RandomSize); -} - -/* - * set the master secret from the pre-master secret. - */ -static void -setMasterSecret(TlsSec *sec, Bytes *pm) -{ - (*sec->prf)(sec->sec, MasterSecretSize, pm->data, MasterSecretSize, "master secret", - sec->crandom, RandomSize, sec->srandom, RandomSize); -} - -static void -serverMasterSecret(TlsSec *sec, uchar *epm, int nepm) -{ - Bytes *pm; - - pm = pkcs1_decrypt(sec, epm, nepm); - - // if the client messed up, just continue as if everything is ok, - // to prevent attacks to check for correctly formatted messages. - // Hence the fprint(2,) can't be replaced by tlsError(), which sends an Alert msg to the client. - if(sec->ok < 0 || pm == nil || get16(pm->data) != sec->clientVers){ - fprint(2, "serverMasterSecret failed ok=%d pm=%p pmvers=%x cvers=%x nepm=%d\n", - sec->ok, pm, pm ? get16(pm->data) : -1, sec->clientVers, nepm); - sec->ok = -1; - if(pm != nil) - freebytes(pm); - pm = newbytes(MasterSecretSize); - genrandom(pm->data, MasterSecretSize); - } - setMasterSecret(sec, pm); - memset(pm->data, 0, pm->len); - freebytes(pm); -} - -static int -clientMasterSecret(TlsSec *sec, RSApub *pub, uchar **epm, int *nepm) -{ - Bytes *pm, *key; - - pm = newbytes(MasterSecretSize); - put16(pm->data, sec->clientVers); - genrandom(pm->data+2, MasterSecretSize - 2); - - setMasterSecret(sec, pm); - - key = pkcs1_encrypt(pm, pub, 2); - memset(pm->data, 0, pm->len); - freebytes(pm); - if(key == nil){ - werrstr("tls pkcs1_encrypt failed"); - return -1; - } - - *nepm = key->len; - *epm = malloc(*nepm); - if(*epm == nil){ - freebytes(key); - werrstr("out of memory"); - return -1; - } - memmove(*epm, key->data, *nepm); - - freebytes(key); - - return 1; -} - -static void -sslSetFinished(TlsSec *sec, MD5state hsmd5, SHAstate hssha1, uchar *finished, int isClient) -{ - DigestState *s; - uchar h0[MD5dlen], h1[SHA1dlen], pad[48]; - char *label; - - if(isClient) - label = "CLNT"; - else - label = "SRVR"; - - md5((uchar*)label, 4, nil, &hsmd5); - md5(sec->sec, MasterSecretSize, nil, &hsmd5); - memset(pad, 0x36, 48); - md5(pad, 48, nil, &hsmd5); - md5(nil, 0, h0, &hsmd5); - memset(pad, 0x5C, 48); - s = md5(sec->sec, MasterSecretSize, nil, nil); - s = md5(pad, 48, nil, s); - md5(h0, MD5dlen, finished, s); - - sha1((uchar*)label, 4, nil, &hssha1); - sha1(sec->sec, MasterSecretSize, nil, &hssha1); - memset(pad, 0x36, 40); - sha1(pad, 40, nil, &hssha1); - sha1(nil, 0, h1, &hssha1); - memset(pad, 0x5C, 40); - s = sha1(sec->sec, MasterSecretSize, nil, nil); - s = sha1(pad, 40, nil, s); - sha1(h1, SHA1dlen, finished + MD5dlen, s); -} - -// fill "finished" arg with md5(args)^sha1(args) -static void -tlsSetFinished(TlsSec *sec, MD5state hsmd5, SHAstate hssha1, uchar *finished, int isClient) -{ - uchar h0[MD5dlen], h1[SHA1dlen]; - char *label; - - // get current hash value, but allow further messages to be hashed in - md5(nil, 0, h0, &hsmd5); - sha1(nil, 0, h1, &hssha1); - - if(isClient) - label = "client finished"; - else - label = "server finished"; - tlsPRF(finished, TLSFinishedLen, sec->sec, MasterSecretSize, label, h0, MD5dlen, h1, SHA1dlen); -} - -static void -sslPRF(uchar *buf, int nbuf, uchar *key, int nkey, char *label, uchar *seed0, int nseed0, uchar *seed1, int nseed1) -{ - DigestState *s; - uchar sha1dig[SHA1dlen], md5dig[MD5dlen], tmp[26]; - int i, n, len; - - USED(label); - len = 1; - while(nbuf > 0){ - if(len > 26) - return; - for(i = 0; i < len; i++) - tmp[i] = 'A' - 1 + len; - s = sha1(tmp, len, nil, nil); - s = sha1(key, nkey, nil, s); - s = sha1(seed0, nseed0, nil, s); - sha1(seed1, nseed1, sha1dig, s); - s = md5(key, nkey, nil, nil); - md5(sha1dig, SHA1dlen, md5dig, s); - n = MD5dlen; - if(n > nbuf) - n = nbuf; - memmove(buf, md5dig, n); - buf += n; - nbuf -= n; - len++; - } -} - -static mpint* -bytestomp(Bytes* bytes) -{ - mpint* ans; - - ans = betomp(bytes->data, bytes->len, nil); - return ans; -} - -/* - * Convert mpint* to Bytes, putting high order byte first. - */ -static Bytes* -mptobytes(mpint* big) -{ - int n, m; - uchar *a; - Bytes* ans; - - n = (mpsignif(big)+7)/8; - m = mptobe(big, nil, n, &a); - ans = makebytes(a, m); - return ans; -} - -// Do RSA computation on block according to key, and pad -// result on left with zeros to make it modlen long. -static Bytes* -rsacomp(Bytes* block, RSApub* key, int modlen) -{ - mpint *x, *y; - Bytes *a, *ybytes; - int ylen; - - x = bytestomp(block); - y = rsaencrypt(key, x, nil); - mpfree(x); - ybytes = mptobytes(y); - ylen = ybytes->len; - - if(ylen < modlen) { - a = newbytes(modlen); - memset(a->data, 0, modlen-ylen); - memmove(a->data+modlen-ylen, ybytes->data, ylen); - freebytes(ybytes); - ybytes = a; - } - else if(ylen > modlen) { - // assume it has leading zeros (mod should make it so) - a = newbytes(modlen); - memmove(a->data, ybytes->data, modlen); - freebytes(ybytes); - ybytes = a; - } - mpfree(y); - return ybytes; -} - -// encrypt data according to PKCS#1, /lib/rfc/rfc2437 9.1.2.1 -static Bytes* -pkcs1_encrypt(Bytes* data, RSApub* key, int blocktype) -{ - Bytes *pad, *eb, *ans; - int i, dlen, padlen, modlen; - - modlen = (mpsignif(key->n)+7)/8; - dlen = data->len; - if(modlen < 12 || dlen > modlen - 11) - return nil; - padlen = modlen - 3 - dlen; - pad = newbytes(padlen); - genrandom(pad->data, padlen); - for(i = 0; i < padlen; i++) { - if(blocktype == 0) - pad->data[i] = 0; - else if(blocktype == 1) - pad->data[i] = 255; - else if(pad->data[i] == 0) - pad->data[i] = 1; - } - eb = newbytes(modlen); - eb->data[0] = 0; - eb->data[1] = blocktype; - memmove(eb->data+2, pad->data, padlen); - eb->data[padlen+2] = 0; - memmove(eb->data+padlen+3, data->data, dlen); - ans = rsacomp(eb, key, modlen); - freebytes(eb); - freebytes(pad); - return ans; -} - -// decrypt data according to PKCS#1, with given key. -// expect a block type of 2. -static Bytes* -pkcs1_decrypt(TlsSec *sec, uchar *epm, int nepm) -{ - Bytes *eb, *ans = nil; - int i, modlen; - mpint *x, *y; - - modlen = (mpsignif(sec->rsapub->n)+7)/8; - if(nepm != modlen) - return nil; - x = betomp(epm, nepm, nil); - y = factotum_rsa_decrypt(sec->rpc, x); - if(y == nil) - return nil; - eb = mptobytes(y); - if(eb->len < modlen){ // pad on left with zeros - ans = newbytes(modlen); - memset(ans->data, 0, modlen-eb->len); - memmove(ans->data+modlen-eb->len, eb->data, eb->len); - freebytes(eb); - eb = ans; - } - if(eb->data[0] == 0 && eb->data[1] == 2) { - for(i = 2; i < modlen; i++) - if(eb->data[i] == 0) - break; - if(i < modlen - 1) - ans = makebytes(eb->data+i+1, modlen-(i+1)); - } - freebytes(eb); - return ans; -} - - -//================= general utility functions ======================== - -static void * -emalloc(int n) -{ - void *p; - if(n==0) - n=1; - p = malloc(n); - if(p == nil){ - exits("out of memory"); - } - memset(p, 0, n); - return p; -} - -static void * -erealloc(void *ReallocP, int ReallocN) -{ - if(ReallocN == 0) - ReallocN = 1; - if(!ReallocP) - ReallocP = emalloc(ReallocN); - else if(!(ReallocP = realloc(ReallocP, ReallocN))){ - exits("out of memory"); - } - return(ReallocP); -} - -static void -put32(uchar *p, u32int x) -{ - p[0] = x>>24; - p[1] = x>>16; - p[2] = x>>8; - p[3] = x; -} - -static void -put24(uchar *p, int x) -{ - p[0] = x>>16; - p[1] = x>>8; - p[2] = x; -} - -static void -put16(uchar *p, int x) -{ - p[0] = x>>8; - p[1] = x; -} - -static u32int -get32(uchar *p) -{ - return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]; -} - -static int -get24(uchar *p) -{ - return (p[0]<<16)|(p[1]<<8)|p[2]; -} - -static int -get16(uchar *p) -{ - return (p[0]<<8)|p[1]; -} - -/* ANSI offsetof() */ -#define OFFSET(x, s) ((int)(&(((s*)0)->x))) - -/* - * malloc and return a new Bytes structure capable of - * holding len bytes. (len >= 0) - * Used to use crypt_malloc, which aborts if malloc fails. - */ -static Bytes* -newbytes(int len) -{ - Bytes* ans; - - ans = (Bytes*)malloc(OFFSET(data[0], Bytes) + len); - ans->len = len; - return ans; -} - -/* - * newbytes(len), with data initialized from buf - */ -static Bytes* -makebytes(uchar* buf, int len) -{ - Bytes* ans; - - ans = newbytes(len); - memmove(ans->data, buf, len); - return ans; -} - -static void -freebytes(Bytes* b) -{ - if(b != nil) - free(b); -} - -/* len is number of ints */ -static Ints* -newints(int len) -{ - Ints* ans; - - ans = (Ints*)malloc(OFFSET(data[0], Ints) + len*sizeof(int)); - ans->len = len; - return ans; -} - -static Ints* -makeints(int* buf, int len) -{ - Ints* ans; - - ans = newints(len); - if(len > 0) - memmove(ans->data, buf, len*sizeof(int)); - return ans; -} - -static void -freeints(Ints* b) -{ - if(b != nil) - free(b); -} diff --git a/sys/src/cmd/unix/drawterm/libsec/x509.c b/sys/src/cmd/unix/drawterm/libsec/x509.c deleted file mode 100644 index 081dd8fc0..000000000 --- a/sys/src/cmd/unix/drawterm/libsec/x509.c +++ /dev/null @@ -1,2520 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <mp.h> -#include <libsec.h> - -typedef DigestState*(*DigestFun)(uchar*,ulong,uchar*,DigestState*); - -/* ANSI offsetof, backwards. */ -#define OFFSETOF(a, b) offsetof(b, a) - -/*=============================================================*/ -/* general ASN1 declarations and parsing - * - * For now, this is used only for extracting the key from an - * X509 certificate, so the entire collection is hidden. But - * someday we should probably make the functions visible and - * give them their own man page. - */ -typedef struct Elem Elem; -typedef struct Tag Tag; -typedef struct Value Value; -typedef struct Bytes Bytes; -typedef struct Ints Ints; -typedef struct Bits Bits; -typedef struct Elist Elist; - -/* tag classes */ -#define Universal 0 -#define Context 0x80 - -/* universal tags */ -#define BOOLEAN 1 -#define INTEGER 2 -#define BIT_STRING 3 -#define OCTET_STRING 4 -#define NULLTAG 5 -#define OBJECT_ID 6 -#define ObjectDescriptor 7 -#define EXTERNAL 8 -#define REAL 9 -#define ENUMERATED 10 -#define EMBEDDED_PDV 11 -#define SEQUENCE 16 /* also SEQUENCE OF */ -#define SETOF 17 /* also SETOF OF */ -#define NumericString 18 -#define PrintableString 19 -#define TeletexString 20 -#define VideotexString 21 -#define IA5String 22 -#define UTCTime 23 -#define GeneralizedTime 24 -#define GraphicString 25 -#define VisibleString 26 -#define GeneralString 27 -#define UniversalString 28 -#define BMPString 30 - -struct Bytes { - int len; - uchar data[1]; -}; - -struct Ints { - int len; - int data[1]; -}; - -struct Bits { - int len; /* number of bytes */ - int unusedbits; /* unused bits in last byte */ - uchar data[1]; /* most-significant bit first */ -}; - -struct Tag { - int class; - int num; -}; - -enum { VBool, VInt, VOctets, VBigInt, VReal, VOther, - VBitString, VNull, VEOC, VObjId, VString, VSeq, VSet }; -struct Value { - int tag; /* VBool, etc. */ - union { - int boolval; - int intval; - Bytes* octetsval; - Bytes* bigintval; - Bytes* realval; /* undecoded; hardly ever used */ - Bytes* otherval; - Bits* bitstringval; - Ints* objidval; - char* stringval; - Elist* seqval; - Elist* setval; - } u; /* (Don't use anonymous unions, for ease of porting) */ -}; - -struct Elem { - Tag tag; - Value val; -}; - -struct Elist { - Elist* tl; - Elem hd; -}; - -/* decoding errors */ -enum { ASN_OK, ASN_ESHORT, ASN_ETOOBIG, ASN_EVALLEN, - ASN_ECONSTR, ASN_EPRIM, ASN_EINVAL, ASN_EUNIMPL }; - - -/* here are the functions to consider making extern someday */ -static Bytes* newbytes(int len); -static Bytes* makebytes(uchar* buf, int len); -static void freebytes(Bytes* b); -static Bytes* catbytes(Bytes* b1, Bytes* b2); -static Ints* newints(int len); -static Ints* makeints(int* buf, int len); -static void freeints(Ints* b); -static Bits* newbits(int len); -static Bits* makebits(uchar* buf, int len, int unusedbits); -static void freebits(Bits* b); -static Elist* mkel(Elem e, Elist* tail); -static void freeelist(Elist* el); -static int elistlen(Elist* el); -static int is_seq(Elem* pe, Elist** pseq); -static int is_set(Elem* pe, Elist** pset); -static int is_int(Elem* pe, int* pint); -static int is_bigint(Elem* pe, Bytes** pbigint); -static int is_bitstring(Elem* pe, Bits** pbits); -static int is_octetstring(Elem* pe, Bytes** poctets); -static int is_oid(Elem* pe, Ints** poid); -static int is_string(Elem* pe, char** pstring); -static int is_time(Elem* pe, char** ptime); -static int decode(uchar* a, int alen, Elem* pelem); -static int decode_seq(uchar* a, int alen, Elist** pelist); -static int decode_value(uchar* a, int alen, int kind, int isconstr, Value* pval); -static int encode(Elem e, Bytes** pbytes); -static int oid_lookup(Ints* o, Ints** tab); -static void freevalfields(Value* v); -static mpint *asn1mpint(Elem *e); - - - -#define TAG_MASK 0x1F -#define CONSTR_MASK 0x20 -#define CLASS_MASK 0xC0 -#define MAXOBJIDLEN 20 - -static int ber_decode(uchar** pp, uchar* pend, Elem* pelem); -static int tag_decode(uchar** pp, uchar* pend, Tag* ptag, int* pisconstr); -static int length_decode(uchar** pp, uchar* pend, int* plength); -static int value_decode(uchar** pp, uchar* pend, int length, int kind, int isconstr, Value* pval); -static int int_decode(uchar** pp, uchar* pend, int count, int unsgned, int* pint); -static int uint7_decode(uchar** pp, uchar* pend, int* pint); -static int octet_decode(uchar** pp, uchar* pend, int length, int isconstr, Bytes** pbytes); -static int seq_decode(uchar** pp, uchar* pend, int length, int isconstr, Elist** pelist); -static int enc(uchar** pp, Elem e, int lenonly); -static int val_enc(uchar** pp, Elem e, int *pconstr, int lenonly); -static void uint7_enc(uchar** pp, int num, int lenonly); -static void int_enc(uchar** pp, int num, int unsgned, int lenonly); - -static void * -emalloc(int n) -{ - void *p; - if(n==0) - n=1; - p = malloc(n); - if(p == nil){ - exits("out of memory"); - } - memset(p, 0, n); - return p; -} - -static char* -estrdup(char *s) -{ - char *d, *d0; - - if(!s) - return 0; - d = d0 = emalloc(strlen(s)+1); - while(*d++ = *s++) - ; - return d0; -} - - -/* - * Decode a[0..len] as a BER encoding of an ASN1 type. - * The return value is one of ASN_OK, etc. - * Depending on the error, the returned elem may or may not - * be nil. - */ -static int -decode(uchar* a, int alen, Elem* pelem) -{ - uchar* p = a; - - return ber_decode(&p, &a[alen], pelem); -} - -/* - * Like decode, but continue decoding after first element - * of array ends. - */ -static int -decode_seq(uchar* a, int alen, Elist** pelist) -{ - uchar* p = a; - - return seq_decode(&p, &a[alen], -1, 1, pelist); -} - -/* - * Decode the whole array as a BER encoding of an ASN1 value, - * (i.e., the part after the tag and length). - * Assume the value is encoded as universal tag "kind". - * The constr arg is 1 if the value is constructed, 0 if primitive. - * If there's an error, the return string will contain the error. - * Depending on the error, the returned value may or may not - * be nil. - */ -static int -decode_value(uchar* a, int alen, int kind, int isconstr, Value* pval) -{ - uchar* p = a; - - return value_decode(&p, &a[alen], alen, kind, isconstr, pval); -} - -/* - * All of the following decoding routines take arguments: - * uchar **pp; - * uchar *pend; - * Where parsing is supposed to start at **pp, and when parsing - * is done, *pp is updated to point at next char to be parsed. - * The pend pointer is just past end of string; an error should - * be returned parsing hasn't finished by then. - * - * The returned int is ASN_OK if all went fine, else ASN_ESHORT, etc. - * The remaining argument(s) are pointers to where parsed entity goes. - */ - -/* Decode an ASN1 'Elem' (tag, length, value) */ -static int -ber_decode(uchar** pp, uchar* pend, Elem* pelem) -{ - int err; - int isconstr; - int length; - Tag tag; - Value val; - - err = tag_decode(pp, pend, &tag, &isconstr); - if(err == ASN_OK) { - err = length_decode(pp, pend, &length); - if(err == ASN_OK) { - if(tag.class == Universal) - err = value_decode(pp, pend, length, tag.num, isconstr, &val); - else - err = value_decode(pp, pend, length, OCTET_STRING, 0, &val); - if(err == ASN_OK) { - pelem->tag = tag; - pelem->val = val; - } - } - } - return err; -} - -/* Decode a tag field */ -static int -tag_decode(uchar** pp, uchar* pend, Tag* ptag, int* pisconstr) -{ - int err; - int v; - uchar* p; - - err = ASN_OK; - p = *pp; - if(pend-p >= 2) { - v = *p++; - ptag->class = v&CLASS_MASK; - if(v&CONSTR_MASK) - *pisconstr = 1; - else - *pisconstr = 0; - v &= TAG_MASK; - if(v == TAG_MASK) - err = uint7_decode(&p, pend, &v); - ptag->num = v; - } - else - err = ASN_ESHORT; - *pp = p; - return err; -} - -/* Decode a length field */ -static int -length_decode(uchar** pp, uchar* pend, int* plength) -{ - int err; - int num; - int v; - uchar* p; - - err = ASN_OK; - num = 0; - p = *pp; - if(p < pend) { - v = *p++; - if(v&0x80) - err = int_decode(&p, pend, v&0x7F, 1, &num); - else if(v == 0x80) - num = -1; - else - num = v; - } - else - err = ASN_ESHORT; - *pp = p; - *plength = num; - return err; -} - -/* Decode a value field */ -static int -value_decode(uchar** pp, uchar* pend, int length, int kind, int isconstr, Value* pval) -{ - int err; - Bytes* va; - int num; - int bitsunused; - int subids[MAXOBJIDLEN]; - int isubid; - Elist* vl; - uchar* p; - uchar* pe; - - err = ASN_OK; - p = *pp; - if(length == -1) { /* "indefinite" length spec */ - if(!isconstr) - err = ASN_EINVAL; - } - else if(p + length > pend) - err = ASN_EVALLEN; - if(err != ASN_OK) - return err; - - switch(kind) { - case 0: - /* marker for end of indefinite constructions */ - if(length == 0) - pval->tag = VNull; - else - err = ASN_EINVAL; - break; - - case BOOLEAN: - if(isconstr) - err = ASN_ECONSTR; - else if(length != 1) - err = ASN_EVALLEN; - else { - pval->tag = VBool; - pval->u.boolval = (*p++ != 0); - } - break; - - case INTEGER: - case ENUMERATED: - if(isconstr) - err = ASN_ECONSTR; - else if(length <= 4) { - err = int_decode(&p, pend, length, 0, &num); - if(err == ASN_OK) { - pval->tag = VInt; - pval->u.intval = num; - } - } - else { - pval->tag = VBigInt; - pval->u.bigintval = makebytes(p, length); - p += length; - } - break; - - case BIT_STRING: - pval->tag = VBitString; - if(isconstr) { - if(length == -1 && p + 2 <= pend && *p == 0 && *(p+1) ==0) { - pval->u.bitstringval = makebits(0, 0, 0); - p += 2; - } - else - /* TODO: recurse and concat results */ - err = ASN_EUNIMPL; - } - else { - if(length < 2) { - if(length == 1 && *p == 0) { - pval->u.bitstringval = makebits(0, 0, 0); - p++; - } - else - err = ASN_EINVAL; - } - else { - bitsunused = *p; - if(bitsunused > 7) - err = ASN_EINVAL; - else if(length > 0x0FFFFFFF) - err = ASN_ETOOBIG; - else { - pval->u.bitstringval = makebits(p+1, length-1, bitsunused); - p += length; - } - } - } - break; - - case OCTET_STRING: - case ObjectDescriptor: - err = octet_decode(&p, pend, length, isconstr, &va); - if(err == ASN_OK) { - pval->tag = VOctets; - pval->u.octetsval = va; - } - break; - - case NULLTAG: - if(isconstr) - err = ASN_ECONSTR; - else if(length != 0) - err = ASN_EVALLEN; - else - pval->tag = VNull; - break; - - case OBJECT_ID: - if(isconstr) - err = ASN_ECONSTR; - else if(length == 0) - err = ASN_EVALLEN; - else { - isubid = 0; - pe = p+length; - while(p < pe && isubid < MAXOBJIDLEN) { - err = uint7_decode(&p, pend, &num); - if(err != ASN_OK) - break; - if(isubid == 0) { - subids[isubid++] = num / 40; - subids[isubid++] = num % 40; - } - else - subids[isubid++] = num; - } - if(err == ASN_OK) { - if(p != pe) - err = ASN_EVALLEN; - else { - pval->tag = VObjId; - pval->u.objidval = makeints(subids, isubid); - } - } - } - break; - - case EXTERNAL: - case EMBEDDED_PDV: - /* TODO: parse this internally */ - if(p+length > pend) - err = ASN_EVALLEN; - else { - pval->tag = VOther; - pval->u.otherval = makebytes(p, length); - p += length; - } - break; - - case REAL: - /* Let the application decode */ - if(isconstr) - err = ASN_ECONSTR; - else if(p+length > pend) - err = ASN_EVALLEN; - else { - pval->tag = VReal; - pval->u.realval = makebytes(p, length); - p += length; - } - break; - - case SEQUENCE: - err = seq_decode(&p, pend, length, isconstr, &vl); - if(err == ASN_OK) { - pval->tag = VSeq ; - pval->u.seqval = vl; - } - break; - - case SETOF: - err = seq_decode(&p, pend, length, isconstr, &vl); - if(err == ASN_OK) { - pval->tag = VSet; - pval->u.setval = vl; - } - break; - - case NumericString: - case PrintableString: - case TeletexString: - case VideotexString: - case IA5String: - case UTCTime: - case GeneralizedTime: - case GraphicString: - case VisibleString: - case GeneralString: - case UniversalString: - case BMPString: - /* TODO: figure out when character set conversion is necessary */ - err = octet_decode(&p, pend, length, isconstr, &va); - if(err == ASN_OK) { - pval->tag = VString; - pval->u.stringval = (char*)emalloc(va->len+1); - memmove(pval->u.stringval, va->data, va->len); - pval->u.stringval[va->len] = 0; - free(va); - } - break; - - default: - if(p+length > pend) - err = ASN_EVALLEN; - else { - pval->tag = VOther; - pval->u.otherval = makebytes(p, length); - p += length; - } - break; - } - *pp = p; - return err; -} - -/* - * Decode an int in format where count bytes are - * concatenated to form value. - * Although ASN1 allows any size integer, we return - * an error if the result doesn't fit in a 32-bit int. - * If unsgned is not set, make sure to propagate sign bit. - */ -static int -int_decode(uchar** pp, uchar* pend, int count, int unsgned, int* pint) -{ - int err; - int num; - uchar* p; - - p = *pp; - err = ASN_OK; - num = 0; - if(p+count <= pend) { - if((count > 4) || (unsgned && count == 4 && (*p&0x80))) - err = ASN_ETOOBIG; - else { - if(!unsgned && count > 0 && count < 4 && (*p&0x80)) - num = -1; // set all bits, initially - while(count--) - num = (num << 8)|(*p++); - } - } - else - err = ASN_ESHORT; - *pint = num; - *pp = p; - return err; -} - -/* - * Decode an unsigned int in format where each - * byte except last has high bit set, and remaining - * seven bits of each byte are concatenated to form value. - * Although ASN1 allows any size integer, we return - * an error if the result doesn't fit in a 32 bit int. - */ -static int -uint7_decode(uchar** pp, uchar* pend, int* pint) -{ - int err; - int num; - int more; - int v; - uchar* p; - - p = *pp; - err = ASN_OK; - num = 0; - more = 1; - while(more && p < pend) { - v = *p++; - if(num&0x7F000000) { - err = ASN_ETOOBIG; - break; - } - num <<= 7; - more = v&0x80; - num |= (v&0x7F); - } - if(p == pend) - err = ASN_ESHORT; - *pint = num; - *pp = p; - return err; -} - -/* - * Decode an octet string, recursively if isconstr. - * We've already checked that length==-1 implies isconstr==1, - * and otherwise that specified length fits within (*pp..pend) - */ -static int -octet_decode(uchar** pp, uchar* pend, int length, int isconstr, Bytes** pbytes) -{ - int err; - uchar* p; - Bytes* ans; - Bytes* newans; - uchar* pstart; - uchar* pold; - Elem elem; - - err = ASN_OK; - p = *pp; - ans = nil; - if(length >= 0 && !isconstr) { - ans = makebytes(p, length); - p += length; - } - else { - /* constructed, either definite or indefinite length */ - pstart = p; - for(;;) { - if(length >= 0 && p >= pstart + length) { - if(p != pstart + length) - err = ASN_EVALLEN; - break; - } - pold = p; - err = ber_decode(&p, pend, &elem); - if(err != ASN_OK) - break; - switch(elem.val.tag) { - case VOctets: - newans = catbytes(ans, elem.val.u.octetsval); - freebytes(ans); - ans = newans; - break; - - case VEOC: - if(length != -1) { - p = pold; - err = ASN_EINVAL; - } - goto cloop_done; - - default: - p = pold; - err = ASN_EINVAL; - goto cloop_done; - } - } -cloop_done: - ; - } - *pp = p; - *pbytes = ans; - return err; -} - -/* - * Decode a sequence or set. - * We've already checked that length==-1 implies isconstr==1, - * and otherwise that specified length fits within (*p..pend) - */ -static int -seq_decode(uchar** pp, uchar* pend, int length, int isconstr, Elist** pelist) -{ - int err; - uchar* p; - uchar* pstart; - uchar* pold; - Elist* ans; - Elem elem; - Elist* lve; - Elist* lveold; - - err = ASN_OK; - ans = nil; - p = *pp; - if(!isconstr) - err = ASN_EPRIM; - else { - /* constructed, either definite or indefinite length */ - lve = nil; - pstart = p; - for(;;) { - if(length >= 0 && p >= pstart + length) { - if(p != pstart + length) - err = ASN_EVALLEN; - break; - } - pold = p; - err = ber_decode(&p, pend, &elem); - if(err != ASN_OK) - break; - if(elem.val.tag == VEOC) { - if(length != -1) { - p = pold; - err = ASN_EINVAL; - } - break; - } - else - lve = mkel(elem, lve); - } - if(err == ASN_OK) { - /* reverse back to original order */ - while(lve != nil) { - lveold = lve; - lve = lve->tl; - lveold->tl = ans; - ans = lveold; - } - } - } - *pp = p; - *pelist = ans; - return err; -} - -/* - * Encode e by BER rules, putting answer in *pbytes. - * This is done by first calling enc with lenonly==1 - * to get the length of the needed buffer, - * then allocating the buffer and using enc again to fill it up. - */ -static int -encode(Elem e, Bytes** pbytes) -{ - uchar* p; - Bytes* ans; - int err; - uchar uc; - - p = &uc; - err = enc(&p, e, 1); - if(err == ASN_OK) { - ans = newbytes(p-&uc); - p = ans->data; - err = enc(&p, e, 0); - *pbytes = ans; - } - return err; -} - -/* - * The various enc functions take a pointer to a pointer - * into a buffer, and encode their entity starting there, - * updating the pointer afterwards. - * If lenonly is 1, only the pointer update is done, - * allowing enc to be called first to calculate the needed - * buffer length. - * If lenonly is 0, it is assumed that the answer will fit. - */ - -static int -enc(uchar** pp, Elem e, int lenonly) -{ - int err; - int vlen; - int constr; - Tag tag; - int v; - int ilen; - uchar* p; - uchar* psave; - - p = *pp; - err = val_enc(&p, e, &constr, 1); - if(err != ASN_OK) - return err; - vlen = p - *pp; - p = *pp; - tag = e.tag; - v = tag.class|constr; - if(tag.num < 31) { - if(!lenonly) - *p = (v|tag.num); - p++; - } - else { - if(!lenonly) - *p = (v|31); - p++; - if(tag.num < 0) - return ASN_EINVAL; - uint7_enc(&p, tag.num, lenonly); - } - if(vlen < 0x80) { - if(!lenonly) - *p = vlen; - p++; - } - else { - psave = p; - int_enc(&p, vlen, 1, 1); - ilen = p-psave; - p = psave; - if(!lenonly) { - *p++ = (0x80 | ilen); - int_enc(&p, vlen, 1, 0); - } - else - p += 1 + ilen; - } - if(!lenonly) - val_enc(&p, e, &constr, 0); - else - p += vlen; - *pp = p; - return err; -} - -static int -val_enc(uchar** pp, Elem e, int *pconstr, int lenonly) -{ - int err; - uchar* p; - int kind; - int cl; - int v; - Bytes* bb = nil; - Bits* bits; - Ints* oid; - int k; - Elist* el; - char* s; - - p = *pp; - err = ASN_OK; - kind = e.tag.num; - cl = e.tag.class; - *pconstr = 0; - if(cl != Universal) { - switch(e.val.tag) { - case VBool: - kind = BOOLEAN; - break; - case VInt: - kind = INTEGER; - break; - case VBigInt: - kind = INTEGER; - break; - case VOctets: - kind = OCTET_STRING; - break; - case VReal: - kind = REAL; - break; - case VOther: - kind = OCTET_STRING; - break; - case VBitString: - kind = BIT_STRING; - break; - case VNull: - kind = NULLTAG; - break; - case VObjId: - kind = OBJECT_ID; - break; - case VString: - kind = UniversalString; - break; - case VSeq: - kind = SEQUENCE; - break; - case VSet: - kind = SETOF; - break; - } - } - switch(kind) { - case BOOLEAN: - if(is_int(&e, &v)) { - if(v != 0) - v = 255; - int_enc(&p, v, 1, lenonly); - } - else - err = ASN_EINVAL; - break; - - case INTEGER: - case ENUMERATED: - if(is_int(&e, &v)) - int_enc(&p, v, 0, lenonly); - else { - if(is_bigint(&e, &bb)) { - if(!lenonly) - memmove(p, bb->data, bb->len); - p += bb->len; - } - else - err = ASN_EINVAL; - } - break; - - case BIT_STRING: - if(is_bitstring(&e, &bits)) { - if(bits->len == 0) { - if(!lenonly) - *p = 0; - p++; - } - else { - v = bits->unusedbits; - if(v < 0 || v > 7) - err = ASN_EINVAL; - else { - if(!lenonly) { - *p = v; - memmove(p+1, bits->data, bits->len); - } - p += 1 + bits->len; - } - } - } - else - err = ASN_EINVAL; - break; - - case OCTET_STRING: - case ObjectDescriptor: - case EXTERNAL: - case REAL: - case EMBEDDED_PDV: - bb = nil; - switch(e.val.tag) { - case VOctets: - bb = e.val.u.octetsval; - break; - case VReal: - bb = e.val.u.realval; - break; - case VOther: - bb = e.val.u.otherval; - break; - } - if(bb != nil) { - if(!lenonly) - memmove(p, bb->data, bb->len); - p += bb->len; - } - else - err = ASN_EINVAL; - break; - - case NULLTAG: - break; - - case OBJECT_ID: - if(is_oid(&e, &oid)) { - for(k = 0; k < oid->len; k++) { - v = oid->data[k]; - if(k == 0) { - v *= 40; - if(oid->len > 1) - v += oid->data[++k]; - } - uint7_enc(&p, v, lenonly); - } - } - else - err = ASN_EINVAL; - break; - - case SEQUENCE: - case SETOF: - el = nil; - if(e.val.tag == VSeq) - el = e.val.u.seqval; - else if(e.val.tag == VSet) - el = e.val.u.setval; - else - err = ASN_EINVAL; - if(el != nil) { - *pconstr = CONSTR_MASK; - for(; el != nil; el = el->tl) { - err = enc(&p, el->hd, lenonly); - if(err != ASN_OK) - break; - } - } - break; - - case NumericString: - case PrintableString: - case TeletexString: - case VideotexString: - case IA5String: - case UTCTime: - case GeneralizedTime: - case GraphicString: - case VisibleString: - case GeneralString: - case UniversalString: - case BMPString: - if(e.val.tag == VString) { - s = e.val.u.stringval; - if(s != nil) { - v = strlen(s); - if(!lenonly) - memmove(p, s, v); - p += v; - } - } - else - err = ASN_EINVAL; - break; - - default: - err = ASN_EINVAL; - } - *pp = p; - return err; -} - -/* - * Encode num as unsigned 7 bit values with top bit 1 on all bytes - * except last, only putting in bytes if !lenonly. - */ -static void -uint7_enc(uchar** pp, int num, int lenonly) -{ - int n; - int v; - int k; - uchar* p; - - p = *pp; - n = 1; - v = num >> 7; - while(v > 0) { - v >>= 7; - n++; - } - if(lenonly) - p += n; - else { - for(k = (n - 1)*7; k > 0; k -= 7) - *p++= ((num >> k)|0x80); - *p++ = (num&0x7F); - } - *pp = p; -} - -/* - * Encode num as unsigned or signed integer, - * only putting in bytes if !lenonly. - * Encoding is length followed by bytes to concatenate. - */ -static void -int_enc(uchar** pp, int num, int unsgned, int lenonly) -{ - int v; - int n; - int prevv; - int k; - uchar* p; - - p = *pp; - v = num; - if(v < 0) - v = -(v + 1); - n = 1; - prevv = v; - v >>= 8; - while(v > 0) { - prevv = v; - v >>= 8; - n++; - } - if(!unsgned && (prevv&0x80)) - n++; - if(lenonly) - p += n; - else { - for(k = (n - 1)*8; k >= 0; k -= 8) - *p++ = (num >> k); - } - *pp = p; -} - -static int -ints_eq(Ints* a, Ints* b) -{ - int alen; - int i; - - alen = a->len; - if(alen != b->len) - return 0; - for(i = 0; i < alen; i++) - if(a->data[i] != b->data[i]) - return 0; - return 1; -} - -/* - * Look up o in tab (which must have nil entry to terminate). - * Return index of matching entry, or -1 if none. - */ -static int -oid_lookup(Ints* o, Ints** tab) -{ - int i; - - for(i = 0; tab[i] != nil; i++) - if(ints_eq(o, tab[i])) - return i; - return -1; -} - -/* - * Return true if *pe is a SEQUENCE, and set *pseq to - * the value of the sequence if so. - */ -static int -is_seq(Elem* pe, Elist** pseq) -{ - if(pe->tag.class == Universal && pe->tag.num == SEQUENCE && pe->val.tag == VSeq) { - *pseq = pe->val.u.seqval; - return 1; - } - return 0; -} - -static int -is_set(Elem* pe, Elist** pset) -{ - if(pe->tag.class == Universal && pe->tag.num == SETOF && pe->val.tag == VSet) { - *pset = pe->val.u.setval; - return 1; - } - return 0; -} - -static int -is_int(Elem* pe, int* pint) -{ - if(pe->tag.class == Universal) { - if(pe->tag.num == INTEGER && pe->val.tag == VInt) { - *pint = pe->val.u.intval; - return 1; - } - else if(pe->tag.num == BOOLEAN && pe->val.tag == VBool) { - *pint = pe->val.u.boolval; - return 1; - } - } - return 0; -} - -/* - * for convience, all VInt's are readable via this routine, - * as well as all VBigInt's - */ -static int -is_bigint(Elem* pe, Bytes** pbigint) -{ - int v, n, i; - - if(pe->tag.class == Universal && pe->tag.num == INTEGER) { - if(pe->val.tag == VBigInt) - *pbigint = pe->val.u.bigintval; - else if(pe->val.tag == VInt){ - v = pe->val.u.intval; - for(n = 1; n < 4; n++) - if((1 << (8 * n)) > v) - break; - *pbigint = newbytes(n); - for(i = 0; i < n; i++) - (*pbigint)->data[i] = (v >> ((n - 1 - i) * 8)); - }else - return 0; - return 1; - } - return 0; -} - -static int -is_bitstring(Elem* pe, Bits** pbits) -{ - if(pe->tag.class == Universal && pe->tag.num == BIT_STRING && pe->val.tag == VBitString) { - *pbits = pe->val.u.bitstringval; - return 1; - } - return 0; -} - -static int -is_octetstring(Elem* pe, Bytes** poctets) -{ - if(pe->tag.class == Universal && pe->tag.num == OCTET_STRING && pe->val.tag == VOctets) { - *poctets = pe->val.u.octetsval; - return 1; - } - return 0; -} - -static int -is_oid(Elem* pe, Ints** poid) -{ - if(pe->tag.class == Universal && pe->tag.num == OBJECT_ID && pe->val.tag == VObjId) { - *poid = pe->val.u.objidval; - return 1; - } - return 0; -} - -static int -is_string(Elem* pe, char** pstring) -{ - if(pe->tag.class == Universal) { - switch(pe->tag.num) { - case NumericString: - case PrintableString: - case TeletexString: - case VideotexString: - case IA5String: - case GraphicString: - case VisibleString: - case GeneralString: - case UniversalString: - case BMPString: - if(pe->val.tag == VString) { - *pstring = pe->val.u.stringval; - return 1; - } - } - } - return 0; -} - -static int -is_time(Elem* pe, char** ptime) -{ - if(pe->tag.class == Universal - && (pe->tag.num == UTCTime || pe->tag.num == GeneralizedTime) - && pe->val.tag == VString) { - *ptime = pe->val.u.stringval; - return 1; - } - return 0; -} - - -/* - * malloc and return a new Bytes structure capable of - * holding len bytes. (len >= 0) - */ -static Bytes* -newbytes(int len) -{ - Bytes* ans; - - ans = (Bytes*)emalloc(OFFSETOF(data[0], Bytes) + len); - ans->len = len; - return ans; -} - -/* - * newbytes(len), with data initialized from buf - */ -static Bytes* -makebytes(uchar* buf, int len) -{ - Bytes* ans; - - ans = newbytes(len); - memmove(ans->data, buf, len); - return ans; -} - -static void -freebytes(Bytes* b) -{ - if(b != nil) - free(b); -} - -/* - * Make a new Bytes, containing bytes of b1 followed by those of b2. - * Either b1 or b2 or both can be nil. - */ -static Bytes* -catbytes(Bytes* b1, Bytes* b2) -{ - Bytes* ans; - int n; - - if(b1 == nil) { - if(b2 == nil) - ans = newbytes(0); - else - ans = makebytes(b2->data, b2->len); - } - else if(b2 == nil) { - ans = makebytes(b1->data, b1->len); - } - else { - n = b1->len + b2->len; - ans = newbytes(n); - ans->len = n; - memmove(ans->data, b1->data, b1->len); - memmove(ans->data+b1->len, b2->data, b2->len); - } - return ans; -} - -/* len is number of ints */ -static Ints* -newints(int len) -{ - Ints* ans; - - ans = (Ints*)emalloc(OFFSETOF(data[0], Ints) + len*sizeof(int)); - ans->len = len; - return ans; -} - -static Ints* -makeints(int* buf, int len) -{ - Ints* ans; - - ans = newints(len); - if(len > 0) - memmove(ans->data, buf, len*sizeof(int)); - return ans; -} - -static void -freeints(Ints* b) -{ - if(b != nil) - free(b); -} - -/* len is number of bytes */ -static Bits* -newbits(int len) -{ - Bits* ans; - - ans = (Bits*)emalloc(OFFSETOF(data[0], Bits) + len); - ans->len = len; - ans->unusedbits = 0; - return ans; -} - -static Bits* -makebits(uchar* buf, int len, int unusedbits) -{ - Bits* ans; - - ans = newbits(len); - memmove(ans->data, buf, len); - ans->unusedbits = unusedbits; - return ans; -} - -static void -freebits(Bits* b) -{ - if(b != nil) - free(b); -} - -static Elist* -mkel(Elem e, Elist* tail) -{ - Elist* el; - - el = (Elist*)emalloc(sizeof(Elist)); - el->hd = e; - el->tl = tail; - return el; -} - -static int -elistlen(Elist* el) -{ - int ans = 0; - while(el != nil) { - ans++; - el = el->tl; - } - return ans; -} - -/* Frees elist, but not fields inside values of constituent elems */ -static void -freeelist(Elist* el) -{ - Elist* next; - - while(el != nil) { - next = el->tl; - free(el); - el = next; - } -} - -/* free any allocated structures inside v (recursively freeing Elists) */ -static void -freevalfields(Value* v) -{ - Elist* el; - Elist* l; - if(v == nil) - return; - switch(v->tag) { - case VOctets: - freebytes(v->u.octetsval); - break; - case VBigInt: - freebytes(v->u.bigintval); - break; - case VReal: - freebytes(v->u.realval); - break; - case VOther: - freebytes(v->u.otherval); - break; - case VBitString: - freebits(v->u.bitstringval); - break; - case VObjId: - freeints(v->u.objidval); - break; - case VString: - if (v->u.stringval) - free(v->u.stringval); - break; - case VSeq: - el = v->u.seqval; - for(l = el; l != nil; l = l->tl) - freevalfields(&l->hd.val); - if (el) - freeelist(el); - break; - case VSet: - el = v->u.setval; - for(l = el; l != nil; l = l->tl) - freevalfields(&l->hd.val); - if (el) - freeelist(el); - break; - } -} - -/* end of general ASN1 functions */ - - - - - -/*=============================================================*/ -/* - * Decode and parse an X.509 Certificate, defined by this ASN1: - * Certificate ::= SEQUENCE { - * certificateInfo CertificateInfo, - * signatureAlgorithm AlgorithmIdentifier, - * signature BIT STRING } - * - * CertificateInfo ::= SEQUENCE { - * version [0] INTEGER DEFAULT v1 (0), - * serialNumber INTEGER, - * signature AlgorithmIdentifier, - * issuer Name, - * validity Validity, - * subject Name, - * subjectPublicKeyInfo SubjectPublicKeyInfo } - * (version v2 has two more fields, optional unique identifiers for - * issuer and subject; since we ignore these anyway, we won't parse them) - * - * Validity ::= SEQUENCE { - * notBefore UTCTime, - * notAfter UTCTime } - * - * SubjectPublicKeyInfo ::= SEQUENCE { - * algorithm AlgorithmIdentifier, - * subjectPublicKey BIT STRING } - * - * AlgorithmIdentifier ::= SEQUENCE { - * algorithm OBJECT IDENTIFER, - * parameters ANY DEFINED BY ALGORITHM OPTIONAL } - * - * Name ::= SEQUENCE OF RelativeDistinguishedName - * - * RelativeDistinguishedName ::= SETOF SIZE(1..MAX) OF AttributeTypeAndValue - * - * AttributeTypeAndValue ::= SEQUENCE { - * type OBJECT IDENTIFER, - * value DirectoryString } - * (selected attributes have these Object Ids: - * commonName {2 5 4 3} - * countryName {2 5 4 6} - * localityName {2 5 4 7} - * stateOrProvinceName {2 5 4 8} - * organizationName {2 5 4 10} - * organizationalUnitName {2 5 4 11} - * ) - * - * DirectoryString ::= CHOICE { - * teletexString TeletexString, - * printableString PrintableString, - * universalString UniversalString } - * - * See rfc1423, rfc2437 for AlgorithmIdentifier, subjectPublicKeyInfo, signature. - * - * Not yet implemented: - * CertificateRevocationList ::= SIGNED SEQUENCE{ - * signature AlgorithmIdentifier, - * issuer Name, - * lastUpdate UTCTime, - * nextUpdate UTCTime, - * revokedCertificates - * SEQUENCE OF CRLEntry OPTIONAL} - * CRLEntry ::= SEQUENCE{ - * userCertificate SerialNumber, - * revocationDate UTCTime} - */ - -typedef struct CertX509 { - int serial; - char* issuer; - char* validity_start; - char* validity_end; - char* subject; - int publickey_alg; - Bytes* publickey; - int signature_alg; - Bytes* signature; -} CertX509; - -/* Algorithm object-ids */ -enum { - ALG_rsaEncryption, - ALG_md2WithRSAEncryption, - ALG_md4WithRSAEncryption, - ALG_md5WithRSAEncryption, - ALG_sha1WithRSAEncryption, - ALG_md5, - NUMALGS -}; -typedef struct Ints7 { - int len; - int data[7]; -} Ints7; -static Ints7 oid_rsaEncryption = {7, 1, 2, 840, 113549, 1, 1, 1 }; -static Ints7 oid_md2WithRSAEncryption = {7, 1, 2, 840, 113549, 1, 1, 2 }; -static Ints7 oid_md4WithRSAEncryption = {7, 1, 2, 840, 113549, 1, 1, 3 }; -static Ints7 oid_md5WithRSAEncryption = {7, 1, 2, 840, 113549, 1, 1, 4 }; -static Ints7 oid_sha1WithRSAEncryption ={7, 1, 2, 840, 113549, 1, 1, 5 }; -static Ints7 oid_md5 ={6, 1, 2, 840, 113549, 2, 5, 0 }; -static Ints *alg_oid_tab[NUMALGS+1] = { - (Ints*)&oid_rsaEncryption, - (Ints*)&oid_md2WithRSAEncryption, - (Ints*)&oid_md4WithRSAEncryption, - (Ints*)&oid_md5WithRSAEncryption, - (Ints*)&oid_sha1WithRSAEncryption, - (Ints*)&oid_md5, - nil -}; -static DigestFun digestalg[NUMALGS+1] = { md5, md5, md5, md5, sha1, md5, nil }; - -static void -freecert(CertX509* c) -{ - if (!c) return; - if(c->issuer != nil) - free(c->issuer); - if(c->validity_start != nil) - free(c->validity_start); - if(c->validity_end != nil) - free(c->validity_end); - if(c->subject != nil) - free(c->subject); - freebytes(c->publickey); - freebytes(c->signature); -} - -/* - * Parse the Name ASN1 type. - * The sequence of RelativeDistinguishedName's gives a sort of pathname, - * from most general to most specific. Each element of the path can be - * one or more (but usually just one) attribute-value pair, such as - * countryName="US". - * We'll just form a "postal-style" address string by concatenating the elements - * from most specific to least specific, separated by commas. - * Return name-as-string (which must be freed by caller). - */ -static char* -parse_name(Elem* e) -{ - Elist* el; - Elem* es; - Elist* esetl; - Elem* eat; - Elist* eatl; - char* s; - enum { MAXPARTS = 100 }; - char* parts[MAXPARTS]; - int i; - int plen; - char* ans = nil; - - if(!is_seq(e, &el)) - goto errret; - i = 0; - plen = 0; - while(el != nil) { - es = &el->hd; - if(!is_set(es, &esetl)) - goto errret; - while(esetl != nil) { - eat = &esetl->hd; - if(!is_seq(eat, &eatl) || elistlen(eatl) != 2) - goto errret; - if(!is_string(&eatl->tl->hd, &s) || i>=MAXPARTS) - goto errret; - parts[i++] = s; - plen += strlen(s) + 2; /* room for ", " after */ - esetl = esetl->tl; - } - el = el->tl; - } - if(i > 0) { - ans = (char*)emalloc(plen); - *ans = '\0'; - while(--i >= 0) { - s = parts[i]; - strcat(ans, s); - if(i > 0) - strcat(ans, ", "); - } - } - -errret: - return ans; -} - -/* - * Parse an AlgorithmIdentifer ASN1 type. - * Look up the oid in oid_tab and return one of OID_rsaEncryption, etc.., - * or -1 if not found. - * For now, ignore parameters, since none of our algorithms need them. - */ -static int -parse_alg(Elem* e) -{ - Elist* el; - Ints* oid; - - if(!is_seq(e, &el) || el == nil || !is_oid(&el->hd, &oid)) - return -1; - return oid_lookup(oid, alg_oid_tab); -} - -static CertX509* -decode_cert(Bytes* a) -{ - int ok = 0; - int n; - CertX509* c = nil; - Elem ecert; - Elem* ecertinfo; - Elem* esigalg; - Elem* esig; - Elem* eserial; - Elem* eissuer; - Elem* evalidity; - Elem* esubj; - Elem* epubkey; - Elist* el; - Elist* elcert = nil; - Elist* elcertinfo = nil; - Elist* elvalidity = nil; - Elist* elpubkey = nil; - Bits* bits = nil; - Bytes* b; - Elem* e; - - if(decode(a->data, a->len, &ecert) != ASN_OK) - goto errret; - - c = (CertX509*)emalloc(sizeof(CertX509)); - c->serial = -1; - c->issuer = nil; - c->validity_start = nil; - c->validity_end = nil; - c->subject = nil; - c->publickey_alg = -1; - c->publickey = nil; - c->signature_alg = -1; - c->signature = nil; - - /* Certificate */ - if(!is_seq(&ecert, &elcert) || elistlen(elcert) !=3) - goto errret; - ecertinfo = &elcert->hd; - el = elcert->tl; - esigalg = &el->hd; - c->signature_alg = parse_alg(esigalg); - el = el->tl; - esig = &el->hd; - - /* Certificate Info */ - if(!is_seq(ecertinfo, &elcertinfo)) - goto errret; - n = elistlen(elcertinfo); - if(n < 6) - goto errret; - eserial =&elcertinfo->hd; - el = elcertinfo->tl; - /* check for optional version, marked by explicit context tag 0 */ - if(eserial->tag.class == Context && eserial->tag.num == 0) { - eserial = &el->hd; - if(n < 7) - goto errret; - el = el->tl; - } - - if(parse_alg(&el->hd) != c->signature_alg) - goto errret; - el = el->tl; - eissuer = &el->hd; - el = el->tl; - evalidity = &el->hd; - el = el->tl; - esubj = &el->hd; - el = el->tl; - epubkey = &el->hd; - if(!is_int(eserial, &c->serial)) { - if(!is_bigint(eserial, &b)) - goto errret; - c->serial = -1; /* else we have to change cert struct */ - } - c->issuer = parse_name(eissuer); - if(c->issuer == nil) - goto errret; - /* Validity */ - if(!is_seq(evalidity, &elvalidity)) - goto errret; - if(elistlen(elvalidity) != 2) - goto errret; - e = &elvalidity->hd; - if(!is_time(e, &c->validity_start)) - goto errret; - e->val.u.stringval = nil; /* string ownership transfer */ - e = &elvalidity->tl->hd; - if(!is_time(e, &c->validity_end)) - goto errret; - e->val.u.stringval = nil; /* string ownership transfer */ - - /* resume CertificateInfo */ - c->subject = parse_name(esubj); - if(c->subject == nil) - goto errret; - - /* SubjectPublicKeyInfo */ - if(!is_seq(epubkey, &elpubkey)) - goto errret; - if(elistlen(elpubkey) != 2) - goto errret; - - c->publickey_alg = parse_alg(&elpubkey->hd); - if(c->publickey_alg < 0) - goto errret; - if(!is_bitstring(&elpubkey->tl->hd, &bits)) - goto errret; - if(bits->unusedbits != 0) - goto errret; - c->publickey = makebytes(bits->data, bits->len); - - /*resume Certificate */ - if(c->signature_alg < 0) - goto errret; - if(!is_bitstring(esig, &bits)) - goto errret; - c->signature = makebytes(bits->data, bits->len); - ok = 1; - -errret: - freevalfields(&ecert.val); /* recurses through lists, too */ - if(!ok){ - freecert(c); - c = nil; - } - return c; -} - -/* - * RSAPublickKey :: SEQUENCE { - * modulus INTEGER, - * publicExponent INTEGER - * } - */ -static RSApub* -decode_rsapubkey(Bytes* a) -{ - Elem e; - Elist *el; - mpint *mp; - RSApub* key; - - key = rsapuballoc(); - if(decode(a->data, a->len, &e) != ASN_OK) - goto errret; - if(!is_seq(&e, &el) || elistlen(el) != 2) - goto errret; - - key->n = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - el = el->tl; - key->ek = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - return key; -errret: - rsapubfree(key); - return nil; -} - -/* - * RSAPrivateKey ::= SEQUENCE { - * version Version, - * modulus INTEGER, -- n - * publicExponent INTEGER, -- e - * privateExponent INTEGER, -- d - * prime1 INTEGER, -- p - * prime2 INTEGER, -- q - * exponent1 INTEGER, -- d mod (p-1) - * exponent2 INTEGER, -- d mod (q-1) - * coefficient INTEGER -- (inverse of q) mod p } - */ -static RSApriv* -decode_rsaprivkey(Bytes* a) -{ - int version; - Elem e; - Elist *el; - mpint *mp; - RSApriv* key; - - key = rsaprivalloc(); - if(decode(a->data, a->len, &e) != ASN_OK) - goto errret; - if(!is_seq(&e, &el) || elistlen(el) != 9) - goto errret; - if(!is_int(&el->hd, &version) || version != 0) - goto errret; - - el = el->tl; - key->pub.n = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - el = el->tl; - key->pub.ek = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - el = el->tl; - key->dk = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - el = el->tl; - key->q = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - el = el->tl; - key->p = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - el = el->tl; - key->kq = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - el = el->tl; - key->kp = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - el = el->tl; - key->c2 = mp = asn1mpint(&el->hd); - if(mp == nil) - goto errret; - - return key; -errret: - rsaprivfree(key); - return nil; -} - -static mpint* -asn1mpint(Elem *e) -{ - Bytes *b; - mpint *mp; - int v; - - if(is_int(e, &v)) - return itomp(v, nil); - if(is_bigint(e, &b)) { - mp = betomp(b->data, b->len, nil); - freebytes(b); - return mp; - } - return nil; -} - -static mpint* -pkcs1pad(Bytes *b, mpint *modulus) -{ - int n = (mpsignif(modulus)+7)/8; - int pm1, i; - uchar *p; - mpint *mp; - - pm1 = n - 1 - b->len; - p = (uchar*)emalloc(n); - p[0] = 0; - p[1] = 1; - for(i = 2; i < pm1; i++) - p[i] = 0xFF; - p[pm1] = 0; - memcpy(&p[pm1+1], b->data, b->len); - mp = betomp(p, n, nil); - free(p); - return mp; -} - -RSApriv* -asn1toRSApriv(uchar *kd, int kn) -{ - Bytes *b; - RSApriv *key; - - b = makebytes(kd, kn); - key = decode_rsaprivkey(b); - freebytes(b); - return key; -} - -/* - * digest(CertificateInfo) - * Our ASN.1 library doesn't return pointers into the original - * data array, so we need to do a little hand decoding. - */ -static void -digest_certinfo(Bytes *cert, DigestFun digestfun, uchar *digest) -{ - uchar *info, *p, *pend; - ulong infolen; - int isconstr, length; - Tag tag; - Elem elem; - - p = cert->data; - pend = cert->data + cert->len; - if(tag_decode(&p, pend, &tag, &isconstr) != ASN_OK || - tag.class != Universal || tag.num != SEQUENCE || - length_decode(&p, pend, &length) != ASN_OK || - p+length > pend) - return; - info = p; - if(ber_decode(&p, pend, &elem) != ASN_OK || elem.tag.num != SEQUENCE) - return; - infolen = p - info; - (*digestfun)(info, infolen, digest, nil); -} - -static char* -verify_signature(Bytes* signature, RSApub *pk, uchar *edigest, Elem **psigalg) -{ - Elem e; - Elist *el; - Bytes *digest; - uchar *pkcs1buf, *buf; - int buflen; - mpint *pkcs1; - - /* see 9.2.1 of rfc2437 */ - pkcs1 = betomp(signature->data, signature->len, nil); - mpexp(pkcs1, pk->ek, pk->n, pkcs1); - buflen = mptobe(pkcs1, nil, 0, &pkcs1buf); - buf = pkcs1buf; - if(buflen < 4 || buf[0] != 1) - return "expected 1"; - buf++; - while(buf[0] == 0xff) - buf++; - if(buf[0] != 0) - return "expected 0"; - buf++; - buflen -= buf-pkcs1buf; - if(decode(buf, buflen, &e) != ASN_OK || !is_seq(&e, &el) || elistlen(el) != 2 || - !is_octetstring(&el->tl->hd, &digest)) - return "signature parse error"; - *psigalg = &el->hd; - if(memcmp(digest->data, edigest, digest->len) == 0) - return nil; - return "digests did not match"; -} - -RSApub* -X509toRSApub(uchar *cert, int ncert, char *name, int nname) -{ - char *e; - Bytes *b; - CertX509 *c; - RSApub *pk; - - b = makebytes(cert, ncert); - c = decode_cert(b); - freebytes(b); - if(c == nil) - return nil; - if(name != nil && c->subject != nil){ - e = strchr(c->subject, ','); - if(e != nil) - *e = 0; // take just CN part of Distinguished Name - strncpy(name, c->subject, nname); - } - pk = decode_rsapubkey(c->publickey); - freecert(c); - return pk; -} - -char* -X509verify(uchar *cert, int ncert, RSApub *pk) -{ - char *e; - Bytes *b; - CertX509 *c; - uchar digest[SHA1dlen]; - Elem *sigalg; - - b = makebytes(cert, ncert); - c = decode_cert(b); - if(c != nil) - digest_certinfo(b, digestalg[c->signature_alg], digest); - freebytes(b); - if(c == nil) - return "cannot decode cert"; - e = verify_signature(c->signature, pk, digest, &sigalg); - freecert(c); - return e; -} - -/* ------- Elem constructors ---------- */ -static Elem -Null(void) -{ - Elem e; - - e.tag.class = Universal; - e.tag.num = NULLTAG; - e.val.tag = VNull; - return e; -} - -static Elem -mkint(int j) -{ - Elem e; - - e.tag.class = Universal; - e.tag.num = INTEGER; - e.val.tag = VInt; - e.val.u.intval = j; - return e; -} - -static Elem -mkbigint(mpint *p) -{ - Elem e; - uchar *buf; - int buflen; - - e.tag.class = Universal; - e.tag.num = INTEGER; - e.val.tag = VBigInt; - buflen = mptobe(p, nil, 0, &buf); - e.val.u.bigintval = makebytes(buf, buflen); - free(buf); - return e; -} - -static Elem -mkstring(char *s) -{ - Elem e; - - e.tag.class = Universal; - e.tag.num = IA5String; - e.val.tag = VString; - e.val.u.stringval = estrdup(s); - return e; -} - -static Elem -mkoctet(uchar *buf, int buflen) -{ - Elem e; - - e.tag.class = Universal; - e.tag.num = OCTET_STRING; - e.val.tag = VOctets; - e.val.u.octetsval = makebytes(buf, buflen); - return e; -} - -static Elem -mkbits(uchar *buf, int buflen) -{ - Elem e; - - e.tag.class = Universal; - e.tag.num = BIT_STRING; - e.val.tag = VBitString; - e.val.u.bitstringval = makebits(buf, buflen, 0); - return e; -} - -static Elem -mkutc(long t) -{ - Elem e; - char utc[50]; - Tm *tm = gmtime(t); - - e.tag.class = Universal; - e.tag.num = UTCTime; - e.val.tag = VString; - snprint(utc, 50, "%.2d%.2d%.2d%.2d%.2d%.2dZ", - tm->year % 100, tm->mon+1, tm->mday, tm->hour, tm->min, tm->sec); - e.val.u.stringval = estrdup(utc); - return e; -} - -static Elem -mkoid(Ints *oid) -{ - Elem e; - - e.tag.class = Universal; - e.tag.num = OBJECT_ID; - e.val.tag = VObjId; - e.val.u.objidval = makeints(oid->data, oid->len); - return e; -} - -static Elem -mkseq(Elist *el) -{ - Elem e; - - e.tag.class = Universal; - e.tag.num = SEQUENCE; - e.val.tag = VSeq; - e.val.u.seqval = el; - return e; -} - -static Elem -mkset(Elist *el) -{ - Elem e; - - e.tag.class = Universal; - e.tag.num = SETOF; - e.val.tag = VSet; - e.val.u.setval = el; - return e; -} - -static Elem -mkalg(int alg) -{ - return mkseq(mkel(mkoid(alg_oid_tab[alg]), mkel(Null(), nil))); -} - -typedef struct Ints7pref { - int len; - int data[7]; - char prefix[4]; -} Ints7pref; -Ints7pref DN_oid[] = { - {4, 2, 5, 4, 6, 0, 0, 0, "C="}, - {4, 2, 5, 4, 8, 0, 0, 0, "ST="}, - {4, 2, 5, 4, 7, 0, 0, 0, "L="}, - {4, 2, 5, 4, 10, 0, 0, 0, "O="}, - {4, 2, 5, 4, 11, 0, 0, 0, "OU="}, - {4, 2, 5, 4, 3, 0, 0, 0, "CN="}, - {7, 1,2,840,113549,1,9,1, "E="}, -}; - -static Elem -mkname(Ints7pref *oid, char *subj) -{ - return mkset(mkel(mkseq(mkel(mkoid((Ints*)oid), mkel(mkstring(subj), nil))), nil)); -} - -static Elem -mkDN(char *dn) -{ - int i, j, nf; - char *f[20], *prefix, *d2 = estrdup(dn); - Elist* el = nil; - - nf = tokenize(d2, f, nelem(f)); - for(i=nf-1; i>=0; i--){ - for(j=0; j<nelem(DN_oid); j++){ - prefix = DN_oid[j].prefix; - if(strncmp(f[i],prefix,strlen(prefix))==0){ - el = mkel(mkname(&DN_oid[j],f[i]+strlen(prefix)), el); - break; - } - } - } - free(d2); - return mkseq(el); -} - - -uchar* -X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen) -{ - int serial = 0; - uchar *cert = nil; - RSApub *pk = rsaprivtopub(priv); - Bytes *certbytes, *pkbytes, *certinfobytes, *sigbytes; - Elem e, certinfo, issuer, subject, pubkey, validity, sig; - uchar digest[MD5dlen], *buf; - int buflen; - mpint *pkcs1; - - e.val.tag = VInt; /* so freevalfields at errret is no-op */ - issuer = mkDN(subj); - subject = mkDN(subj); - pubkey = mkseq(mkel(mkbigint(pk->n),mkel(mkint(mptoi(pk->ek)),nil))); - if(encode(pubkey, &pkbytes) != ASN_OK) - goto errret; - freevalfields(&pubkey.val); - pubkey = mkseq( - mkel(mkalg(ALG_rsaEncryption), - mkel(mkbits(pkbytes->data, pkbytes->len), - nil))); - freebytes(pkbytes); - validity = mkseq( - mkel(mkutc(valid[0]), - mkel(mkutc(valid[1]), - nil))); - certinfo = mkseq( - mkel(mkint(serial), - mkel(mkalg(ALG_md5WithRSAEncryption), - mkel(issuer, - mkel(validity, - mkel(subject, - mkel(pubkey, - nil))))))); - if(encode(certinfo, &certinfobytes) != ASN_OK) - goto errret; - md5(certinfobytes->data, certinfobytes->len, digest, 0); - freebytes(certinfobytes); - sig = mkseq( - mkel(mkalg(ALG_md5), - mkel(mkoctet(digest, MD5dlen), - nil))); - if(encode(sig, &sigbytes) != ASN_OK) - goto errret; - pkcs1 = pkcs1pad(sigbytes, pk->n); - freebytes(sigbytes); - rsadecrypt(priv, pkcs1, pkcs1); - buflen = mptobe(pkcs1, nil, 0, &buf); - mpfree(pkcs1); - e = mkseq( - mkel(certinfo, - mkel(mkalg(ALG_md5WithRSAEncryption), - mkel(mkbits(buf, buflen), - nil)))); - free(buf); - if(encode(e, &certbytes) != ASN_OK) - goto errret; - if(certlen) - *certlen = certbytes->len; - cert = certbytes->data; -errret: - freevalfields(&e.val); - return cert; -} - -uchar* -X509req(RSApriv *priv, char *subj, int *certlen) -{ - /* RFC 2314, PKCS #10 Certification Request Syntax */ - int version = 0; - uchar *cert = nil; - RSApub *pk = rsaprivtopub(priv); - Bytes *certbytes, *pkbytes, *certinfobytes, *sigbytes; - Elem e, certinfo, subject, pubkey, sig; - uchar digest[MD5dlen], *buf; - int buflen; - mpint *pkcs1; - - e.val.tag = VInt; /* so freevalfields at errret is no-op */ - subject = mkDN(subj); - pubkey = mkseq(mkel(mkbigint(pk->n),mkel(mkint(mptoi(pk->ek)),nil))); - if(encode(pubkey, &pkbytes) != ASN_OK) - goto errret; - freevalfields(&pubkey.val); - pubkey = mkseq( - mkel(mkalg(ALG_rsaEncryption), - mkel(mkbits(pkbytes->data, pkbytes->len), - nil))); - freebytes(pkbytes); - certinfo = mkseq( - mkel(mkint(version), - mkel(subject, - mkel(pubkey, - nil)))); - if(encode(certinfo, &certinfobytes) != ASN_OK) - goto errret; - md5(certinfobytes->data, certinfobytes->len, digest, 0); - freebytes(certinfobytes); - sig = mkseq( - mkel(mkalg(ALG_md5), - mkel(mkoctet(digest, MD5dlen), - nil))); - if(encode(sig, &sigbytes) != ASN_OK) - goto errret; - pkcs1 = pkcs1pad(sigbytes, pk->n); - freebytes(sigbytes); - rsadecrypt(priv, pkcs1, pkcs1); - buflen = mptobe(pkcs1, nil, 0, &buf); - mpfree(pkcs1); - e = mkseq( - mkel(certinfo, - mkel(mkalg(ALG_md5), - mkel(mkbits(buf, buflen), - nil)))); - free(buf); - if(encode(e, &certbytes) != ASN_OK) - goto errret; - if(certlen) - *certlen = certbytes->len; - cert = certbytes->data; -errret: - freevalfields(&e.val); - return cert; -} - -static char* -tagdump(Tag tag) -{ - if(tag.class != Universal) - return smprint("class%d,num%d", tag.class, tag.num); - switch(tag.num){ - case BOOLEAN: return "BOOLEAN"; break; - case INTEGER: return "INTEGER"; break; - case BIT_STRING: return "BIT STRING"; break; - case OCTET_STRING: return "OCTET STRING"; break; - case NULLTAG: return "NULLTAG"; break; - case OBJECT_ID: return "OID"; break; - case ObjectDescriptor: return "OBJECT_DES"; break; - case EXTERNAL: return "EXTERNAL"; break; - case REAL: return "REAL"; break; - case ENUMERATED: return "ENUMERATED"; break; - case EMBEDDED_PDV: return "EMBEDDED PDV"; break; - case SEQUENCE: return "SEQUENCE"; break; - case SETOF: return "SETOF"; break; - case NumericString: return "NumericString"; break; - case PrintableString: return "PrintableString"; break; - case TeletexString: return "TeletexString"; break; - case VideotexString: return "VideotexString"; break; - case IA5String: return "IA5String"; break; - case UTCTime: return "UTCTime"; break; - case GeneralizedTime: return "GeneralizedTime"; break; - case GraphicString: return "GraphicString"; break; - case VisibleString: return "VisibleString"; break; - case GeneralString: return "GeneralString"; break; - case UniversalString: return "UniversalString"; break; - case BMPString: return "BMPString"; break; - default: - return smprint("Universal,num%d", tag.num); - } -} - -static void -edump(Elem e) -{ - Value v; - Elist *el; - int i; - - print("%s{", tagdump(e.tag)); - v = e.val; - switch(v.tag){ - case VBool: print("Bool %d",v.u.boolval); break; - case VInt: print("Int %d",v.u.intval); break; - case VOctets: print("Octets[%d] %.2x%.2x...",v.u.octetsval->len,v.u.octetsval->data[0],v.u.octetsval->data[1]); break; - case VBigInt: print("BigInt[%d] %.2x%.2x...",v.u.bigintval->len,v.u.bigintval->data[0],v.u.bigintval->data[1]); break; - case VReal: print("Real..."); break; - case VOther: print("Other..."); break; - case VBitString: print("BitString..."); break; - case VNull: print("Null"); break; - case VEOC: print("EOC..."); break; - case VObjId: print("ObjId"); - for(i = 0; i<v.u.objidval->len; i++) - print(" %d", v.u.objidval->data[i]); - break; - case VString: print("String \"%s\"",v.u.stringval); break; - case VSeq: print("Seq\n"); - for(el = v.u.seqval; el!=nil; el = el->tl) - edump(el->hd); - break; - case VSet: print("Set\n"); - for(el = v.u.setval; el!=nil; el = el->tl) - edump(el->hd); - break; - } - print("}\n"); -} - -void -asn1dump(uchar *der, int len) -{ - Elem e; - - if(decode(der, len, &e) != ASN_OK){ - print("didn't parse\n"); - exits("didn't parse"); - } - edump(e); -} - -void -X509dump(uchar *cert, int ncert) -{ - char *e; - Bytes *b; - CertX509 *c; - RSApub *pk; - uchar digest[SHA1dlen]; - Elem *sigalg; - - print("begin X509dump\n"); - b = makebytes(cert, ncert); - c = decode_cert(b); - if(c != nil) - digest_certinfo(b, digestalg[c->signature_alg], digest); - freebytes(b); - if(c == nil){ - print("cannot decode cert"); - return; - } - - print("serial %d\n", c->serial); - print("issuer %s\n", c->issuer); - print("validity %s %s\n", c->validity_start, c->validity_end); - print("subject %s\n", c->subject); - pk = decode_rsapubkey(c->publickey); - print("pubkey e=%B n(%d)=%B\n", pk->ek, mpsignif(pk->n), pk->n); - - print("sigalg=%d digest=%.*H\n", c->signature_alg, MD5dlen, digest); - e = verify_signature(c->signature, pk, digest, &sigalg); - if(e==nil){ - e = "nil (meaning ok)"; - print("sigalg=\n"); - if(sigalg) - edump(*sigalg); - } - print("self-signed verify_signature returns: %s\n", e); - - rsapubfree(pk); - freecert(c); - print("end X509dump\n"); -} diff --git a/sys/src/cmd/unix/drawterm/main.c b/sys/src/cmd/unix/drawterm/main.c deleted file mode 100644 index 16e9ece46..000000000 --- a/sys/src/cmd/unix/drawterm/main.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "kern/dat.h" -#include "kern/fns.h" -#include "user.h" - -#include "drawterm.h" - -char *argv0; -char *user; - -extern int errfmt(Fmt*); -void -sizebug(void) -{ - /* - * Needed by various parts of the code. - * This is a huge bug. - */ - assert(sizeof(char)==1); - assert(sizeof(short)==2); - assert(sizeof(ushort)==2); - assert(sizeof(int)==4); - assert(sizeof(uint)==4); - assert(sizeof(long)==4); - assert(sizeof(ulong)==4); - assert(sizeof(vlong)==8); - assert(sizeof(uvlong)==8); -} - -int -main(int argc, char **argv) -{ - eve = getuser(); - if(eve == nil) - eve = "drawterm"; - - sizebug(); - - osinit(); - procinit0(); - printinit(); - screeninit(); - - chandevreset(); - chandevinit(); - quotefmtinstall(); - - if(bind("#c", "/dev", MBEFORE) < 0) - panic("bind #c: %r"); - if(bind("#m", "/dev", MBEFORE) < 0) - panic("bind #m: %r"); - if(bind("#i", "/dev", MBEFORE) < 0) - panic("bind #i: %r"); - if(bind("#I", "/net", MBEFORE) < 0) - panic("bind #I: %r"); - if(bind("#U", "/", MAFTER) < 0) - panic("bind #U: %r"); - bind("#A", "/dev", MAFTER); - - if(open("/dev/cons", OREAD) != 0) - panic("open0: %r"); - if(open("/dev/cons", OWRITE) != 1) - panic("open1: %r"); - if(open("/dev/cons", OWRITE) != 2) - panic("open2: %r"); - - cpumain(argc, argv); - return 0; -} - -char* -getkey(char *user, char *dom) -{ - char buf[1024]; - - snprint(buf, sizeof buf, "%s@%s password", user, dom); - return readcons(buf, nil, 1); -} - -char* -findkey(char **puser, char *dom) -{ - char buf[1024], *f[50], *p, *ep, *nextp, *pass, *user; - int nf, haveproto, havedom, i; - - for(p=secstorebuf; *p; p=nextp){ - nextp = strchr(p, '\n'); - if(nextp == nil){ - ep = p+strlen(p); - nextp = ""; - }else{ - ep = nextp++; - } - if(ep-p >= sizeof buf){ - print("warning: skipping long line in secstore factotum file\n"); - continue; - } - memmove(buf, p, ep-p); - buf[ep-p] = 0; - nf = tokenize(buf, f, nelem(f)); - if(nf == 0 || strcmp(f[0], "key") != 0) - continue; - pass = nil; - haveproto = havedom = 0; - user = nil; - for(i=1; i<nf; i++){ - if(strncmp(f[i], "user=", 5) == 0) - user = f[i]+5; - if(strncmp(f[i], "!password=", 10) == 0) - pass = f[i]+10; - if(strncmp(f[i], "dom=", 4) == 0 && strcmp(f[i]+4, dom) == 0) - havedom = 1; - if(strcmp(f[i], "proto=p9sk1") == 0) - haveproto = 1; - } - if(!haveproto || !havedom || !pass || !user) - continue; - *puser = strdup(user); - pass = strdup(pass); - memset(buf, 0, sizeof buf); - return pass; - } - return nil; -} - diff --git a/sys/src/cmd/unix/drawterm/posix-386/Makefile b/sys/src/cmd/unix/drawterm/posix-386/Makefile deleted file mode 100644 index 51475c242..000000000 --- a/sys/src/cmd/unix/drawterm/posix-386/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=../libmachdep.a - -OFILES=\ - getcallerpc.$O\ - md5block.$O\ - sha1block.$O\ - tas.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - -%.$O: %.s - $(AS) -o $*.$O $*.s - -md5block.s: md5block.spp - gcc -E - < md5block.spp >md5block.s - -sha1block.s: sha1block.spp - gcc -E - < sha1block.spp >sha1block.s - diff --git a/sys/src/cmd/unix/drawterm/posix-386/getcallerpc.c b/sys/src/cmd/unix/drawterm/posix-386/getcallerpc.c deleted file mode 100644 index 3614c593c..000000000 --- a/sys/src/cmd/unix/drawterm/posix-386/getcallerpc.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "u.h" -#include "libc.h" - -uintptr -getcallerpc(void *a) -{ - return ((uintptr*)a)[-1]; -} diff --git a/sys/src/cmd/unix/drawterm/posix-386/md5block.s b/sys/src/cmd/unix/drawterm/posix-386/md5block.s deleted file mode 100644 index 41f1f4835..000000000 --- a/sys/src/cmd/unix/drawterm/posix-386/md5block.s +++ /dev/null @@ -1,137 +0,0 @@ -# 1 "<stdin>" -# 1 "<built-in>" -# 1 "<command line>" -# 1 "<stdin>" -# 116 "<stdin>" - .text - - .p2align 2,0x90 - - .globl __md5block - __md5block: - - - - - - - pushl %ebp - subl $(20), %esp - movl %ebx, (20 -8)(%esp) - movl %esi, (20 -12)(%esp) - movl %edi, (20 -16)(%esp) - - movl (20 +8)(%esp), %eax - addl (20 +12)(%esp), %eax - movl %eax, (20 -4)(%esp) - - movl (20 +8)(%esp), %ebp - -0: - movl (20 +16)(%esp), %esi - movl (%esi), %eax - movl 4(%esi), %ebx - movl 8(%esi), %ecx - movl 12(%esi), %edx - - movl %ecx, %edi; xorl %edx, %edi; andl %ebx, %edi; xorl %edx, %edi; leal 0xd76aa478(%eax, %edi, 1), %eax; addl 0*4(%ebp), %eax; roll $7, %eax; addl %ebx, %eax; - movl %ebx, %edi; xorl %ecx, %edi; andl %eax, %edi; xorl %ecx, %edi; leal 0xe8c7b756(%edx, %edi, 1), %edx; addl 1*4(%ebp), %edx; roll $12, %edx; addl %eax, %edx; - movl %eax, %edi; xorl %ebx, %edi; andl %edx, %edi; xorl %ebx, %edi; leal 0x242070db(%ecx, %edi, 1), %ecx; addl 2*4(%ebp), %ecx; roll $17, %ecx; addl %edx, %ecx; - movl %edx, %edi; xorl %eax, %edi; andl %ecx, %edi; xorl %eax, %edi; leal 0xc1bdceee(%ebx, %edi, 1), %ebx; addl 3*4(%ebp), %ebx; roll $22, %ebx; addl %ecx, %ebx; - - movl %ecx, %edi; xorl %edx, %edi; andl %ebx, %edi; xorl %edx, %edi; leal 0xf57c0faf(%eax, %edi, 1), %eax; addl 4*4(%ebp), %eax; roll $7, %eax; addl %ebx, %eax; - movl %ebx, %edi; xorl %ecx, %edi; andl %eax, %edi; xorl %ecx, %edi; leal 0x4787c62a(%edx, %edi, 1), %edx; addl 5*4(%ebp), %edx; roll $12, %edx; addl %eax, %edx; - movl %eax, %edi; xorl %ebx, %edi; andl %edx, %edi; xorl %ebx, %edi; leal 0xa8304613(%ecx, %edi, 1), %ecx; addl 6*4(%ebp), %ecx; roll $17, %ecx; addl %edx, %ecx; - movl %edx, %edi; xorl %eax, %edi; andl %ecx, %edi; xorl %eax, %edi; leal 0xfd469501(%ebx, %edi, 1), %ebx; addl 7*4(%ebp), %ebx; roll $22, %ebx; addl %ecx, %ebx; - - movl %ecx, %edi; xorl %edx, %edi; andl %ebx, %edi; xorl %edx, %edi; leal 0x698098d8(%eax, %edi, 1), %eax; addl 8*4(%ebp), %eax; roll $7, %eax; addl %ebx, %eax; - movl %ebx, %edi; xorl %ecx, %edi; andl %eax, %edi; xorl %ecx, %edi; leal 0x8b44f7af(%edx, %edi, 1), %edx; addl 9*4(%ebp), %edx; roll $12, %edx; addl %eax, %edx; - movl %eax, %edi; xorl %ebx, %edi; andl %edx, %edi; xorl %ebx, %edi; leal 0xffff5bb1(%ecx, %edi, 1), %ecx; addl 10*4(%ebp), %ecx; roll $17, %ecx; addl %edx, %ecx; - movl %edx, %edi; xorl %eax, %edi; andl %ecx, %edi; xorl %eax, %edi; leal 0x895cd7be(%ebx, %edi, 1), %ebx; addl 11*4(%ebp), %ebx; roll $22, %ebx; addl %ecx, %ebx; - - movl %ecx, %edi; xorl %edx, %edi; andl %ebx, %edi; xorl %edx, %edi; leal 0x6b901122(%eax, %edi, 1), %eax; addl 12*4(%ebp), %eax; roll $7, %eax; addl %ebx, %eax; - movl %ebx, %edi; xorl %ecx, %edi; andl %eax, %edi; xorl %ecx, %edi; leal 0xfd987193(%edx, %edi, 1), %edx; addl 13*4(%ebp), %edx; roll $12, %edx; addl %eax, %edx; - movl %eax, %edi; xorl %ebx, %edi; andl %edx, %edi; xorl %ebx, %edi; leal 0xa679438e(%ecx, %edi, 1), %ecx; addl 14*4(%ebp), %ecx; roll $17, %ecx; addl %edx, %ecx; - movl %edx, %edi; xorl %eax, %edi; andl %ecx, %edi; xorl %eax, %edi; leal 0x49b40821(%ebx, %edi, 1), %ebx; addl 15*4(%ebp), %ebx; roll $22, %ebx; addl %ecx, %ebx; - - - movl %ebx, %edi; xorl %ecx, %edi; andl %edx, %edi; xorl %ecx, %edi; leal 0xf61e2562(%eax, %edi, 1), %eax; addl (1*4)(%ebp), %eax; roll $5, %eax; addl %ebx,%eax; - movl %eax, %edi; xorl %ebx, %edi; andl %ecx, %edi; xorl %ebx, %edi; leal 0xc040b340(%edx, %edi, 1), %edx; addl (6*4)(%ebp), %edx; roll $9, %edx; addl %eax,%edx; - movl %edx, %edi; xorl %eax, %edi; andl %ebx, %edi; xorl %eax, %edi; leal 0x265e5a51(%ecx, %edi, 1), %ecx; addl (11*4)(%ebp), %ecx; roll $14, %ecx; addl %edx,%ecx; - movl %ecx, %edi; xorl %edx, %edi; andl %eax, %edi; xorl %edx, %edi; leal 0xe9b6c7aa(%ebx, %edi, 1), %ebx; addl (0*4)(%ebp), %ebx; roll $20, %ebx; addl %ecx,%ebx; - - movl %ebx, %edi; xorl %ecx, %edi; andl %edx, %edi; xorl %ecx, %edi; leal 0xd62f105d(%eax, %edi, 1), %eax; addl (5*4)(%ebp), %eax; roll $5, %eax; addl %ebx,%eax; - movl %eax, %edi; xorl %ebx, %edi; andl %ecx, %edi; xorl %ebx, %edi; leal 0x02441453(%edx, %edi, 1), %edx; addl (10*4)(%ebp), %edx; roll $9, %edx; addl %eax,%edx; - movl %edx, %edi; xorl %eax, %edi; andl %ebx, %edi; xorl %eax, %edi; leal 0xd8a1e681(%ecx, %edi, 1), %ecx; addl (15*4)(%ebp), %ecx; roll $14, %ecx; addl %edx,%ecx; - movl %ecx, %edi; xorl %edx, %edi; andl %eax, %edi; xorl %edx, %edi; leal 0xe7d3fbc8(%ebx, %edi, 1), %ebx; addl (4*4)(%ebp), %ebx; roll $20, %ebx; addl %ecx,%ebx; - - movl %ebx, %edi; xorl %ecx, %edi; andl %edx, %edi; xorl %ecx, %edi; leal 0x21e1cde6(%eax, %edi, 1), %eax; addl (9*4)(%ebp), %eax; roll $5, %eax; addl %ebx,%eax; - movl %eax, %edi; xorl %ebx, %edi; andl %ecx, %edi; xorl %ebx, %edi; leal 0xc33707d6(%edx, %edi, 1), %edx; addl (14*4)(%ebp), %edx; roll $9, %edx; addl %eax,%edx; - movl %edx, %edi; xorl %eax, %edi; andl %ebx, %edi; xorl %eax, %edi; leal 0xf4d50d87(%ecx, %edi, 1), %ecx; addl (3*4)(%ebp), %ecx; roll $14, %ecx; addl %edx,%ecx; - movl %ecx, %edi; xorl %edx, %edi; andl %eax, %edi; xorl %edx, %edi; leal 0x455a14ed(%ebx, %edi, 1), %ebx; addl (8*4)(%ebp), %ebx; roll $20, %ebx; addl %ecx,%ebx; - - movl %ebx, %edi; xorl %ecx, %edi; andl %edx, %edi; xorl %ecx, %edi; leal 0xa9e3e905(%eax, %edi, 1), %eax; addl (13*4)(%ebp), %eax; roll $5, %eax; addl %ebx,%eax; - movl %eax, %edi; xorl %ebx, %edi; andl %ecx, %edi; xorl %ebx, %edi; leal 0xfcefa3f8(%edx, %edi, 1), %edx; addl (2*4)(%ebp), %edx; roll $9, %edx; addl %eax,%edx; - movl %edx, %edi; xorl %eax, %edi; andl %ebx, %edi; xorl %eax, %edi; leal 0x676f02d9(%ecx, %edi, 1), %ecx; addl (7*4)(%ebp), %ecx; roll $14, %ecx; addl %edx,%ecx; - movl %ecx, %edi; xorl %edx, %edi; andl %eax, %edi; xorl %edx, %edi; leal 0x8d2a4c8a(%ebx, %edi, 1), %ebx; addl (12*4)(%ebp), %ebx; roll $20, %ebx; addl %ecx,%ebx; - - - movl %ebx, %edi; xorl %ecx, %edi; xorl %edx, %edi; leal 0xfffa3942(%eax, %edi, 1), %eax; addl (5*4)(%ebp), %eax; roll $4, %eax; addl %ebx,%eax; - movl %eax, %edi; xorl %ebx, %edi; xorl %ecx, %edi; leal 0x8771f681(%edx, %edi, 1), %edx; addl (8*4)(%ebp), %edx; roll $11, %edx; addl %eax,%edx; - movl %edx, %edi; xorl %eax, %edi; xorl %ebx, %edi; leal 0x6d9d6122(%ecx, %edi, 1), %ecx; addl (11*4)(%ebp), %ecx; roll $16, %ecx; addl %edx,%ecx; - movl %ecx, %edi; xorl %edx, %edi; xorl %eax, %edi; leal 0xfde5380c(%ebx, %edi, 1), %ebx; addl (14*4)(%ebp), %ebx; roll $23, %ebx; addl %ecx,%ebx; - - movl %ebx, %edi; xorl %ecx, %edi; xorl %edx, %edi; leal 0xa4beea44(%eax, %edi, 1), %eax; addl (1*4)(%ebp), %eax; roll $4, %eax; addl %ebx,%eax; - movl %eax, %edi; xorl %ebx, %edi; xorl %ecx, %edi; leal 0x4bdecfa9(%edx, %edi, 1), %edx; addl (4*4)(%ebp), %edx; roll $11, %edx; addl %eax,%edx; - movl %edx, %edi; xorl %eax, %edi; xorl %ebx, %edi; leal 0xf6bb4b60(%ecx, %edi, 1), %ecx; addl (7*4)(%ebp), %ecx; roll $16, %ecx; addl %edx,%ecx; - movl %ecx, %edi; xorl %edx, %edi; xorl %eax, %edi; leal 0xbebfbc70(%ebx, %edi, 1), %ebx; addl (10*4)(%ebp), %ebx; roll $23, %ebx; addl %ecx,%ebx; - - movl %ebx, %edi; xorl %ecx, %edi; xorl %edx, %edi; leal 0x289b7ec6(%eax, %edi, 1), %eax; addl (13*4)(%ebp), %eax; roll $4, %eax; addl %ebx,%eax; - movl %eax, %edi; xorl %ebx, %edi; xorl %ecx, %edi; leal 0xeaa127fa(%edx, %edi, 1), %edx; addl (0*4)(%ebp), %edx; roll $11, %edx; addl %eax,%edx; - movl %edx, %edi; xorl %eax, %edi; xorl %ebx, %edi; leal 0xd4ef3085(%ecx, %edi, 1), %ecx; addl (3*4)(%ebp), %ecx; roll $16, %ecx; addl %edx,%ecx; - movl %ecx, %edi; xorl %edx, %edi; xorl %eax, %edi; leal 0x04881d05(%ebx, %edi, 1), %ebx; addl (6*4)(%ebp), %ebx; roll $23, %ebx; addl %ecx,%ebx; - - movl %ebx, %edi; xorl %ecx, %edi; xorl %edx, %edi; leal 0xd9d4d039(%eax, %edi, 1), %eax; addl (9*4)(%ebp), %eax; roll $4, %eax; addl %ebx,%eax; - movl %eax, %edi; xorl %ebx, %edi; xorl %ecx, %edi; leal 0xe6db99e5(%edx, %edi, 1), %edx; addl (12*4)(%ebp), %edx; roll $11, %edx; addl %eax,%edx; - movl %edx, %edi; xorl %eax, %edi; xorl %ebx, %edi; leal 0x1fa27cf8(%ecx, %edi, 1), %ecx; addl (15*4)(%ebp), %ecx; roll $16, %ecx; addl %edx,%ecx; - movl %ecx, %edi; xorl %edx, %edi; xorl %eax, %edi; leal 0xc4ac5665(%ebx, %edi, 1), %ebx; addl (2*4)(%ebp), %ebx; roll $23, %ebx; addl %ecx,%ebx; - - - movl %edx, %edi; xorl $-1, %edi; orl %ebx, %edi; xorl %ecx, %edi; leal 0xf4292244(%eax, %edi, 1), %eax; addl (0*4)(%ebp), %eax; roll $6, %eax; addl %ebx,%eax; - movl %ecx, %edi; xorl $-1, %edi; orl %eax, %edi; xorl %ebx, %edi; leal 0x432aff97(%edx, %edi, 1), %edx; addl (7*4)(%ebp), %edx; roll $10, %edx; addl %eax,%edx; - movl %ebx, %edi; xorl $-1, %edi; orl %edx, %edi; xorl %eax, %edi; leal 0xab9423a7(%ecx, %edi, 1), %ecx; addl (14*4)(%ebp), %ecx; roll $15, %ecx; addl %edx,%ecx; - movl %eax, %edi; xorl $-1, %edi; orl %ecx, %edi; xorl %edx, %edi; leal 0xfc93a039(%ebx, %edi, 1), %ebx; addl (5*4)(%ebp), %ebx; roll $21, %ebx; addl %ecx,%ebx; - - movl %edx, %edi; xorl $-1, %edi; orl %ebx, %edi; xorl %ecx, %edi; leal 0x655b59c3(%eax, %edi, 1), %eax; addl (12*4)(%ebp), %eax; roll $6, %eax; addl %ebx,%eax; - movl %ecx, %edi; xorl $-1, %edi; orl %eax, %edi; xorl %ebx, %edi; leal 0x8f0ccc92(%edx, %edi, 1), %edx; addl (3*4)(%ebp), %edx; roll $10, %edx; addl %eax,%edx; - movl %ebx, %edi; xorl $-1, %edi; orl %edx, %edi; xorl %eax, %edi; leal 0xffeff47d(%ecx, %edi, 1), %ecx; addl (10*4)(%ebp), %ecx; roll $15, %ecx; addl %edx,%ecx; - movl %eax, %edi; xorl $-1, %edi; orl %ecx, %edi; xorl %edx, %edi; leal 0x85845dd1(%ebx, %edi, 1), %ebx; addl (1*4)(%ebp), %ebx; roll $21, %ebx; addl %ecx,%ebx; - - movl %edx, %edi; xorl $-1, %edi; orl %ebx, %edi; xorl %ecx, %edi; leal 0x6fa87e4f(%eax, %edi, 1), %eax; addl (8*4)(%ebp), %eax; roll $6, %eax; addl %ebx,%eax; - movl %ecx, %edi; xorl $-1, %edi; orl %eax, %edi; xorl %ebx, %edi; leal 0xfe2ce6e0(%edx, %edi, 1), %edx; addl (15*4)(%ebp), %edx; roll $10, %edx; addl %eax,%edx; - movl %ebx, %edi; xorl $-1, %edi; orl %edx, %edi; xorl %eax, %edi; leal 0xa3014314(%ecx, %edi, 1), %ecx; addl (6*4)(%ebp), %ecx; roll $15, %ecx; addl %edx,%ecx; - movl %eax, %edi; xorl $-1, %edi; orl %ecx, %edi; xorl %edx, %edi; leal 0x4e0811a1(%ebx, %edi, 1), %ebx; addl (13*4)(%ebp), %ebx; roll $21, %ebx; addl %ecx,%ebx; - - movl %edx, %edi; xorl $-1, %edi; orl %ebx, %edi; xorl %ecx, %edi; leal 0xf7537e82(%eax, %edi, 1), %eax; addl (4*4)(%ebp), %eax; roll $6, %eax; addl %ebx,%eax; - movl %ecx, %edi; xorl $-1, %edi; orl %eax, %edi; xorl %ebx, %edi; leal 0xbd3af235(%edx, %edi, 1), %edx; addl (11*4)(%ebp), %edx; roll $10, %edx; addl %eax,%edx; - movl %ebx, %edi; xorl $-1, %edi; orl %edx, %edi; xorl %eax, %edi; leal 0x2ad7d2bb(%ecx, %edi, 1), %ecx; addl (2*4)(%ebp), %ecx; roll $15, %ecx; addl %edx,%ecx; - movl %eax, %edi; xorl $-1, %edi; orl %ecx, %edi; xorl %edx, %edi; leal 0xeb86d391(%ebx, %edi, 1), %ebx; addl (9*4)(%ebp), %ebx; roll $21, %ebx; addl %ecx,%ebx; - - addl $(16*4), %ebp - movl (20 +16)(%esp), %edi - addl %eax,0(%edi) - addl %ebx,4(%edi) - addl %ecx,8(%edi) - addl %edx,12(%edi) - - movl (20 -4)(%esp), %edi - cmpl %edi, %ebp - jb 0b - - - movl (20 -8)(%esp), %ebx - movl (20 -12)(%esp), %esi - movl (20 -16)(%esp), %edi - addl $(20), %esp - popl %ebp - ret diff --git a/sys/src/cmd/unix/drawterm/posix-386/md5block.spp b/sys/src/cmd/unix/drawterm/posix-386/md5block.spp deleted file mode 100644 index 2a6f75277..000000000 --- a/sys/src/cmd/unix/drawterm/posix-386/md5block.spp +++ /dev/null @@ -1,248 +0,0 @@ -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ -#define S11 7 -#define S12 12 -#define S13 17 -#define S14 22 - -#define S21 5 -#define S22 9 -#define S23 14 -#define S24 20 - -#define S31 4 -#define S32 11 -#define S33 16 -#define S34 23 - -#define S41 6 -#define S42 10 -#define S43 15 -#define S44 21 - -#define PAYME(x) $##x - -/* - * SI is data - * a += FN(B,C,D); - * a += x[sh] + t[sh]; - * a = (a << S11) | (a >> (32 - S11)); - * a += b; - */ - -#define BODY1(off,V,FN,SH,A,B,C,D)\ - FN(B,C,D)\ - leal V(A, %edi, 1), A;\ - addl off(%ebp), A;\ - roll PAYME(SH), A;\ - addl B, A;\ - -#define BODY(off,V,FN,SH,A,B,C,D)\ - FN(B,C,D)\ - leal V(A, %edi, 1), A;\ - addl (off)(%ebp), A;\ - roll PAYME(SH), A;\ - addl B,A;\ - -/* - * fn1 = ((c ^ d) & b) ^ d - */ -#define FN1(B,C,D)\ - movl C, %edi;\ - xorl D, %edi;\ - andl B, %edi;\ - xorl D, %edi;\ - -/* - * fn2 = ((b ^ c) & d) ^ c; - */ -#define FN2(B,C,D)\ - movl B, %edi;\ - xorl C, %edi;\ - andl D, %edi;\ - xorl C, %edi;\ - -/* - * fn3 = b ^ c ^ d; - */ -#define FN3(B,C,D)\ - movl B, %edi;\ - xorl C, %edi;\ - xorl D, %edi;\ - -/* - * fn4 = c ^ (b | ~d); - */ -#define FN4(B,C,D)\ - movl D, %edi;\ - xorl $-1, %edi;\ - orl B, %edi;\ - xorl C, %edi;\ - -#define STACKSIZE 20 - -#define DATA (STACKSIZE+8) -#define LEN (STACKSIZE+12) -#define STATE (STACKSIZE+16) - -#define EDATA (STACKSIZE-4) -#define OLDEBX (STACKSIZE-8) -#define OLDESI (STACKSIZE-12) -#define OLDEDI (STACKSIZE-16) - - .text - - .p2align 2,0x90 -#ifdef __APPLE__ - .globl __md5block - __md5block: -#else - .globl _md5block - _md5block: -#endif - - /* Prelude */ - pushl %ebp - subl $(STACKSIZE), %esp - movl %ebx, OLDEBX(%esp) - movl %esi, OLDESI(%esp) - movl %edi, OLDEDI(%esp) - - movl DATA(%esp), %eax - addl LEN(%esp), %eax - movl %eax, EDATA(%esp) - - movl DATA(%esp), %ebp - -0: - movl STATE(%esp), %esi - movl (%esi), %eax - movl 4(%esi), %ebx - movl 8(%esi), %ecx - movl 12(%esi), %edx - - BODY1( 0*4,0xd76aa478,FN1,S11,%eax,%ebx,%ecx,%edx) - BODY1( 1*4,0xe8c7b756,FN1,S12,%edx,%eax,%ebx,%ecx) - BODY1( 2*4,0x242070db,FN1,S13,%ecx,%edx,%eax,%ebx) - BODY1( 3*4,0xc1bdceee,FN1,S14,%ebx,%ecx,%edx,%eax) - - BODY1( 4*4,0xf57c0faf,FN1,S11,%eax,%ebx,%ecx,%edx) - BODY1( 5*4,0x4787c62a,FN1,S12,%edx,%eax,%ebx,%ecx) - BODY1( 6*4,0xa8304613,FN1,S13,%ecx,%edx,%eax,%ebx) - BODY1( 7*4,0xfd469501,FN1,S14,%ebx,%ecx,%edx,%eax) - - BODY1( 8*4,0x698098d8,FN1,S11,%eax,%ebx,%ecx,%edx) - BODY1( 9*4,0x8b44f7af,FN1,S12,%edx,%eax,%ebx,%ecx) - BODY1(10*4,0xffff5bb1,FN1,S13,%ecx,%edx,%eax,%ebx) - BODY1(11*4,0x895cd7be,FN1,S14,%ebx,%ecx,%edx,%eax) - - BODY1(12*4,0x6b901122,FN1,S11,%eax,%ebx,%ecx,%edx) - BODY1(13*4,0xfd987193,FN1,S12,%edx,%eax,%ebx,%ecx) - BODY1(14*4,0xa679438e,FN1,S13,%ecx,%edx,%eax,%ebx) - BODY1(15*4,0x49b40821,FN1,S14,%ebx,%ecx,%edx,%eax) - - - BODY( 1*4,0xf61e2562,FN2,S21,%eax,%ebx,%ecx,%edx) - BODY( 6*4,0xc040b340,FN2,S22,%edx,%eax,%ebx,%ecx) - BODY(11*4,0x265e5a51,FN2,S23,%ecx,%edx,%eax,%ebx) - BODY( 0*4,0xe9b6c7aa,FN2,S24,%ebx,%ecx,%edx,%eax) - - BODY( 5*4,0xd62f105d,FN2,S21,%eax,%ebx,%ecx,%edx) - BODY(10*4,0x02441453,FN2,S22,%edx,%eax,%ebx,%ecx) - BODY(15*4,0xd8a1e681,FN2,S23,%ecx,%edx,%eax,%ebx) - BODY( 4*4,0xe7d3fbc8,FN2,S24,%ebx,%ecx,%edx,%eax) - - BODY( 9*4,0x21e1cde6,FN2,S21,%eax,%ebx,%ecx,%edx) - BODY(14*4,0xc33707d6,FN2,S22,%edx,%eax,%ebx,%ecx) - BODY( 3*4,0xf4d50d87,FN2,S23,%ecx,%edx,%eax,%ebx) - BODY( 8*4,0x455a14ed,FN2,S24,%ebx,%ecx,%edx,%eax) - - BODY(13*4,0xa9e3e905,FN2,S21,%eax,%ebx,%ecx,%edx) - BODY( 2*4,0xfcefa3f8,FN2,S22,%edx,%eax,%ebx,%ecx) - BODY( 7*4,0x676f02d9,FN2,S23,%ecx,%edx,%eax,%ebx) - BODY(12*4,0x8d2a4c8a,FN2,S24,%ebx,%ecx,%edx,%eax) - - - BODY( 5*4,0xfffa3942,FN3,S31,%eax,%ebx,%ecx,%edx) - BODY( 8*4,0x8771f681,FN3,S32,%edx,%eax,%ebx,%ecx) - BODY(11*4,0x6d9d6122,FN3,S33,%ecx,%edx,%eax,%ebx) - BODY(14*4,0xfde5380c,FN3,S34,%ebx,%ecx,%edx,%eax) - - BODY( 1*4,0xa4beea44,FN3,S31,%eax,%ebx,%ecx,%edx) - BODY( 4*4,0x4bdecfa9,FN3,S32,%edx,%eax,%ebx,%ecx) - BODY( 7*4,0xf6bb4b60,FN3,S33,%ecx,%edx,%eax,%ebx) - BODY(10*4,0xbebfbc70,FN3,S34,%ebx,%ecx,%edx,%eax) - - BODY(13*4,0x289b7ec6,FN3,S31,%eax,%ebx,%ecx,%edx) - BODY( 0*4,0xeaa127fa,FN3,S32,%edx,%eax,%ebx,%ecx) - BODY( 3*4,0xd4ef3085,FN3,S33,%ecx,%edx,%eax,%ebx) - BODY( 6*4,0x04881d05,FN3,S34,%ebx,%ecx,%edx,%eax) - - BODY( 9*4,0xd9d4d039,FN3,S31,%eax,%ebx,%ecx,%edx) - BODY(12*4,0xe6db99e5,FN3,S32,%edx,%eax,%ebx,%ecx) - BODY(15*4,0x1fa27cf8,FN3,S33,%ecx,%edx,%eax,%ebx) - BODY( 2*4,0xc4ac5665,FN3,S34,%ebx,%ecx,%edx,%eax) - - - BODY( 0*4,0xf4292244,FN4,S41,%eax,%ebx,%ecx,%edx) - BODY( 7*4,0x432aff97,FN4,S42,%edx,%eax,%ebx,%ecx) - BODY(14*4,0xab9423a7,FN4,S43,%ecx,%edx,%eax,%ebx) - BODY( 5*4,0xfc93a039,FN4,S44,%ebx,%ecx,%edx,%eax) - - BODY(12*4,0x655b59c3,FN4,S41,%eax,%ebx,%ecx,%edx) - BODY( 3*4,0x8f0ccc92,FN4,S42,%edx,%eax,%ebx,%ecx) - BODY(10*4,0xffeff47d,FN4,S43,%ecx,%edx,%eax,%ebx) - BODY( 1*4,0x85845dd1,FN4,S44,%ebx,%ecx,%edx,%eax) - - BODY( 8*4,0x6fa87e4f,FN4,S41,%eax,%ebx,%ecx,%edx) - BODY(15*4,0xfe2ce6e0,FN4,S42,%edx,%eax,%ebx,%ecx) - BODY( 6*4,0xa3014314,FN4,S43,%ecx,%edx,%eax,%ebx) - BODY(13*4,0x4e0811a1,FN4,S44,%ebx,%ecx,%edx,%eax) - - BODY( 4*4,0xf7537e82,FN4,S41,%eax,%ebx,%ecx,%edx) - BODY(11*4,0xbd3af235,FN4,S42,%edx,%eax,%ebx,%ecx) - BODY( 2*4,0x2ad7d2bb,FN4,S43,%ecx,%edx,%eax,%ebx) - BODY( 9*4,0xeb86d391,FN4,S44,%ebx,%ecx,%edx,%eax) - - addl $(16*4), %ebp - movl STATE(%esp), %edi - addl %eax,0(%edi) - addl %ebx,4(%edi) - addl %ecx,8(%edi) - addl %edx,12(%edi) - - movl EDATA(%esp), %edi - cmpl %edi, %ebp - jb 0b - - /* Postlude */ - movl OLDEBX(%esp), %ebx - movl OLDESI(%esp), %esi - movl OLDEDI(%esp), %edi - addl $(STACKSIZE), %esp - popl %ebp - ret - diff --git a/sys/src/cmd/unix/drawterm/posix-386/sha1block.s b/sys/src/cmd/unix/drawterm/posix-386/sha1block.s deleted file mode 100644 index 403982b47..000000000 --- a/sys/src/cmd/unix/drawterm/posix-386/sha1block.s +++ /dev/null @@ -1,123 +0,0 @@ -# 1 "<stdin>" -# 1 "<built-in>" -# 1 "<command line>" -# 1 "<stdin>" -.text - -.p2align 2,0x90 - -.globl __sha1block -__sha1block: -# 110 "<stdin>" - pushl %ebp - subl $((48+80*4)), %esp - - mov %ebx, ((48+80*4)-36-(80*4))(%esp) - mov %esi, ((48+80*4)-40-(80*4))(%esp) - mov %edi, ((48+80*4)-44-(80*4))(%esp) - - movl ((48+80*4)+8)(%esp), %eax - addl ((48+80*4)+12)(%esp), %eax - movl %eax, ((48+80*4)-32-(80*4))(%esp) - - leal (((48+80*4)-4-(80*4))+15*4)(%esp), %edi - movl %edi, ((48+80*4)-16-(80*4))(%esp) - leal (((48+80*4)-4-(80*4))+40*4)(%esp), %edx - movl %edx, ((48+80*4)-20-(80*4))(%esp) - leal (((48+80*4)-4-(80*4))+60*4)(%esp), %ecx - movl %ecx, ((48+80*4)-24-(80*4))(%esp) - leal (((48+80*4)-4-(80*4))+80*4)(%esp), %edi - movl %edi, ((48+80*4)-28-(80*4))(%esp) - -0: - leal ((48+80*4)-4-(80*4))(%esp), %ebp - - movl ((48+80*4)+16)(%esp), %edi - movl (%edi),%eax - movl 4(%edi),%ebx - movl %ebx, ((48+80*4)-8-(80*4))(%esp) - movl 8(%edi), %ecx - movl 12(%edi), %edx - movl 16(%edi), %esi - - movl ((48+80*4)+8)(%esp), %ebx - -1: - movl 0(%ebx), %edi; bswap %edi; movl %edi, 0(%ebp); leal 0x5a827999(%edi,%esi,1), %esi; movl %eax, %edi; roll $5,%edi; addl %edi,%esi; movl %ecx, %edi; xorl %edx, %edi; andl ((48+80*4)-8-(80*4))(%esp), %edi; xorl %edx, %edi; addl %edi,%esi; rorl $2,((48+80*4)-8-(80*4))(%esp); - movl %esi,((48+80*4)-12-(80*4))(%esp) - movl 4(%ebx), %edi; bswap %edi; movl %edi, 4(%ebp); leal 0x5a827999(%edi,%edx,1), %edx; movl %esi, %edi; roll $5,%edi; addl %edi,%edx; movl ((48+80*4)-8-(80*4))(%esp), %edi; xorl %ecx, %edi; andl %eax, %edi; xorl %ecx, %edi; addl %edi,%edx; rorl $2,%eax; - movl ((48+80*4)-8-(80*4))(%esp),%esi - movl 8(%ebx), %edi; bswap %edi; movl %edi, 8(%ebp); leal 0x5a827999(%edi,%ecx,1), %ecx; movl %edx, %edi; roll $5,%edi; addl %edi,%ecx; movl %eax, %edi; xorl %esi, %edi; andl ((48+80*4)-12-(80*4))(%esp), %edi; xorl %esi, %edi; addl %edi,%ecx; rorl $2,((48+80*4)-12-(80*4))(%esp); - movl 12(%ebx), %edi; bswap %edi; movl %edi, 12(%ebp); leal 0x5a827999(%edi,%esi,1), %esi; movl %ecx, %edi; roll $5,%edi; addl %edi,%esi; movl ((48+80*4)-12-(80*4))(%esp), %edi; xorl %eax, %edi; andl %edx, %edi; xorl %eax, %edi; addl %edi,%esi; rorl $2,%edx; - movl %esi,((48+80*4)-8-(80*4))(%esp) - movl 16(%ebx), %edi; bswap %edi; movl %edi, 16(%ebp); leal 0x5a827999(%edi,%eax,1), %eax; movl %esi, %edi; roll $5,%edi; addl %edi,%eax; movl %edx, %edi; xorl ((48+80*4)-12-(80*4))(%esp), %edi; andl %ecx, %edi; xorl ((48+80*4)-12-(80*4))(%esp), %edi; addl %edi,%eax; rorl $2,%ecx; - movl ((48+80*4)-12-(80*4))(%esp),%esi - - addl $20, %ebx - addl $20, %ebp - cmpl ((48+80*4)-16-(80*4))(%esp), %ebp - jb 1b - - movl 0(%ebx), %edi; bswap %edi; movl %edi, 0(%ebp); leal 0x5a827999(%edi,%esi,1), %esi; movl %eax, %edi; roll $5,%edi; addl %edi,%esi; movl %ecx, %edi; xorl %edx, %edi; andl ((48+80*4)-8-(80*4))(%esp), %edi; xorl %edx, %edi; addl %edi,%esi; rorl $2,((48+80*4)-8-(80*4))(%esp); - addl $4, %ebx - MOVL %ebx, ((48+80*4)+8)(%esp) - MOVL ((48+80*4)-8-(80*4))(%esp),%ebx - - movl (4 -64)(%ebp), %edi; xorl (4 -56)(%ebp), %edi; xorl (4 -32)(%ebp), %edi; xorl (4 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 4(%ebp); leal 0x5a827999(%edi, %edx, 1), %edx; movl %esi, %edi; roll $5, %edi; addl %edi, %edx; movl %ebx, %edi; xorl %ecx, %edi; andl %eax, %edi; xorl %ecx, %edi; addl %edi, %edx; rorl $2, %eax; - movl (8 -64)(%ebp), %edi; xorl (8 -56)(%ebp), %edi; xorl (8 -32)(%ebp), %edi; xorl (8 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 8(%ebp); leal 0x5a827999(%edi, %ecx, 1), %ecx; movl %edx, %edi; roll $5, %edi; addl %edi, %ecx; movl %eax, %edi; xorl %ebx, %edi; andl %esi, %edi; xorl %ebx, %edi; addl %edi, %ecx; rorl $2, %esi; - movl (12 -64)(%ebp), %edi; xorl (12 -56)(%ebp), %edi; xorl (12 -32)(%ebp), %edi; xorl (12 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 12(%ebp); leal 0x5a827999(%edi, %ebx, 1), %ebx; movl %ecx, %edi; roll $5, %edi; addl %edi, %ebx; movl %esi, %edi; xorl %eax, %edi; andl %edx, %edi; xorl %eax, %edi; addl %edi, %ebx; rorl $2, %edx; - movl (16 -64)(%ebp), %edi; xorl (16 -56)(%ebp), %edi; xorl (16 -32)(%ebp), %edi; xorl (16 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 16(%ebp); leal 0x5a827999(%edi, %eax, 1), %eax; movl %ebx, %edi; roll $5, %edi; addl %edi, %eax; movl %edx, %edi; xorl %esi, %edi; andl %ecx, %edi; xorl %esi, %edi; addl %edi, %eax; rorl $2, %ecx; - - addl $20, %ebp - -2: - movl (0 -64)(%ebp), %edi; xorl (0 -56)(%ebp), %edi; xorl (0 -32)(%ebp), %edi; xorl (0 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 0(%ebp); leal 0x6ed9eba1(%edi, %esi, 1), %esi; movl %eax, %edi; roll $5, %edi; addl %edi, %esi; movl %ebx, %edi; xorl %ecx, %edi; xorl %edx, %edi; addl %edi, %esi; rorl $2, %ebx; - movl (4 -64)(%ebp), %edi; xorl (4 -56)(%ebp), %edi; xorl (4 -32)(%ebp), %edi; xorl (4 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 4(%ebp); leal 0x6ed9eba1(%edi, %edx, 1), %edx; movl %esi, %edi; roll $5, %edi; addl %edi, %edx; movl %eax, %edi; xorl %ebx, %edi; xorl %ecx, %edi; addl %edi, %edx; rorl $2, %eax; - movl (8 -64)(%ebp), %edi; xorl (8 -56)(%ebp), %edi; xorl (8 -32)(%ebp), %edi; xorl (8 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 8(%ebp); leal 0x6ed9eba1(%edi, %ecx, 1), %ecx; movl %edx, %edi; roll $5, %edi; addl %edi, %ecx; movl %esi, %edi; xorl %eax, %edi; xorl %ebx, %edi; addl %edi, %ecx; rorl $2, %esi; - movl (12 -64)(%ebp), %edi; xorl (12 -56)(%ebp), %edi; xorl (12 -32)(%ebp), %edi; xorl (12 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 12(%ebp); leal 0x6ed9eba1(%edi, %ebx, 1), %ebx; movl %ecx, %edi; roll $5, %edi; addl %edi, %ebx; movl %edx, %edi; xorl %esi, %edi; xorl %eax, %edi; addl %edi, %ebx; rorl $2, %edx; - movl (16 -64)(%ebp), %edi; xorl (16 -56)(%ebp), %edi; xorl (16 -32)(%ebp), %edi; xorl (16 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 16(%ebp); leal 0x6ed9eba1(%edi, %eax, 1), %eax; movl %ebx, %edi; roll $5, %edi; addl %edi, %eax; movl %ecx, %edi; xorl %edx, %edi; xorl %esi, %edi; addl %edi, %eax; rorl $2, %ecx; - - addl $20,%ebp - cmpl ((48+80*4)-20-(80*4))(%esp), %ebp - jb 2b - -3: - movl (0 -64)(%ebp), %edi; xorl (0 -56)(%ebp), %edi; xorl (0 -32)(%ebp), %edi; xorl (0 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 0(%ebp); leal 0x8f1bbcdc(%edi, %esi, 1), %esi; movl %eax, %edi; roll $5, %edi; addl %edi, %esi; movl %ebx, %edi; xorl %ecx, %edi; xorl %ebx, %edx; andl %edx, %edi; xorl %ebx, %edi; xorl %ebx, %edx; addl %edi, %esi; rorl $2, %ebx; - movl (4 -64)(%ebp), %edi; xorl (4 -56)(%ebp), %edi; xorl (4 -32)(%ebp), %edi; xorl (4 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 4(%ebp); leal 0x8f1bbcdc(%edi, %edx, 1), %edx; movl %esi, %edi; roll $5, %edi; addl %edi, %edx; movl %eax, %edi; xorl %ebx, %edi; xorl %eax, %ecx; andl %ecx, %edi; xorl %eax, %edi; xorl %eax, %ecx; addl %edi, %edx; rorl $2, %eax; - movl (8 -64)(%ebp), %edi; xorl (8 -56)(%ebp), %edi; xorl (8 -32)(%ebp), %edi; xorl (8 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 8(%ebp); leal 0x8f1bbcdc(%edi, %ecx, 1), %ecx; movl %edx, %edi; roll $5, %edi; addl %edi, %ecx; movl %esi, %edi; xorl %eax, %edi; xorl %esi, %ebx; andl %ebx, %edi; xorl %esi, %edi; xorl %esi, %ebx; addl %edi, %ecx; rorl $2, %esi; - movl (12 -64)(%ebp), %edi; xorl (12 -56)(%ebp), %edi; xorl (12 -32)(%ebp), %edi; xorl (12 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 12(%ebp); leal 0x8f1bbcdc(%edi, %ebx, 1), %ebx; movl %ecx, %edi; roll $5, %edi; addl %edi, %ebx; movl %edx, %edi; xorl %esi, %edi; xorl %edx, %eax; andl %eax, %edi; xorl %edx, %edi; xorl %edx, %eax; addl %edi, %ebx; rorl $2, %edx; - movl (16 -64)(%ebp), %edi; xorl (16 -56)(%ebp), %edi; xorl (16 -32)(%ebp), %edi; xorl (16 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 16(%ebp); leal 0x8f1bbcdc(%edi, %eax, 1), %eax; movl %ebx, %edi; roll $5, %edi; addl %edi, %eax; movl %ecx, %edi; xorl %edx, %edi; xorl %ecx, %esi; andl %esi, %edi; xorl %ecx, %edi; xorl %ecx, %esi; addl %edi, %eax; rorl $2, %ecx; - - addl $20, %ebp - cmpl ((48+80*4)-24-(80*4))(%esp), %ebp - jb 3b - -4: - movl (0 -64)(%ebp), %edi; xorl (0 -56)(%ebp), %edi; xorl (0 -32)(%ebp), %edi; xorl (0 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 0(%ebp); leal 0xca62c1d6(%edi, %esi, 1), %esi; movl %eax, %edi; roll $5, %edi; addl %edi, %esi; movl %ebx, %edi; xorl %ecx, %edi; xorl %edx, %edi; addl %edi, %esi; rorl $2, %ebx; - movl (4 -64)(%ebp), %edi; xorl (4 -56)(%ebp), %edi; xorl (4 -32)(%ebp), %edi; xorl (4 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 4(%ebp); leal 0xca62c1d6(%edi, %edx, 1), %edx; movl %esi, %edi; roll $5, %edi; addl %edi, %edx; movl %eax, %edi; xorl %ebx, %edi; xorl %ecx, %edi; addl %edi, %edx; rorl $2, %eax; - movl (8 -64)(%ebp), %edi; xorl (8 -56)(%ebp), %edi; xorl (8 -32)(%ebp), %edi; xorl (8 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 8(%ebp); leal 0xca62c1d6(%edi, %ecx, 1), %ecx; movl %edx, %edi; roll $5, %edi; addl %edi, %ecx; movl %esi, %edi; xorl %eax, %edi; xorl %ebx, %edi; addl %edi, %ecx; rorl $2, %esi; - movl (12 -64)(%ebp), %edi; xorl (12 -56)(%ebp), %edi; xorl (12 -32)(%ebp), %edi; xorl (12 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 12(%ebp); leal 0xca62c1d6(%edi, %ebx, 1), %ebx; movl %ecx, %edi; roll $5, %edi; addl %edi, %ebx; movl %edx, %edi; xorl %esi, %edi; xorl %eax, %edi; addl %edi, %ebx; rorl $2, %edx; - movl (16 -64)(%ebp), %edi; xorl (16 -56)(%ebp), %edi; xorl (16 -32)(%ebp), %edi; xorl (16 -12)(%ebp), %edi; roll $1, %edi; movl %edi, 16(%ebp); leal 0xca62c1d6(%edi, %eax, 1), %eax; movl %ebx, %edi; roll $5, %edi; addl %edi, %eax; movl %ecx, %edi; xorl %edx, %edi; xorl %esi, %edi; addl %edi, %eax; rorl $2, %ecx; - - addl $20, %ebp - cmpl ((48+80*4)-28-(80*4))(%esp), %ebp - jb 4b - - movl ((48+80*4)+16)(%esp), %edi - addl %eax, 0(%edi) - addl %ebx, 4(%edi) - addl %ecx, 8(%edi) - addl %edx, 12(%edi) - addl %esi, 16(%edi) - - movl ((48+80*4)-32-(80*4))(%esp), %edi - cmpl %edi, ((48+80*4)+8)(%esp) - jb 0b - - - mov ((48+80*4)-36-(80*4))(%esp), %ebx - mov ((48+80*4)-40-(80*4))(%esp), %esi - mov ((48+80*4)-44-(80*4))(%esp), %edi - addl $((48+80*4)), %esp - popl %ebp - ret diff --git a/sys/src/cmd/unix/drawterm/posix-386/sha1block.spp b/sys/src/cmd/unix/drawterm/posix-386/sha1block.spp deleted file mode 100644 index d1aaef68f..000000000 --- a/sys/src/cmd/unix/drawterm/posix-386/sha1block.spp +++ /dev/null @@ -1,221 +0,0 @@ -.text - -.p2align 2,0x90 -#ifdef __APPLE__ -.globl __sha1block -__sha1block: -#else -.globl _sha1block -_sha1block: -#endif - -/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; - * wp[off] = x; - * x += A <<< 5; - * E += 0xca62c1d6 + x; - * x = FN(B,C,D); - * E += x; - * B >>> 2 - */ -#define BSWAPDI BYTE $0x0f; BYTE $0xcf; - -#define BODY(off,FN,V,A,B,C,D,E)\ - movl (off-64)(%ebp), %edi;\ - xorl (off-56)(%ebp), %edi;\ - xorl (off-32)(%ebp), %edi;\ - xorl (off-12)(%ebp), %edi;\ - roll $1, %edi;\ - movl %edi, off(%ebp);\ - leal V(%edi, E, 1), E;\ - movl A, %edi;\ - roll $5, %edi;\ - addl %edi, E;\ - FN(B,C,D)\ - addl %edi, E;\ - rorl $2, B;\ - -#define BODY0(off,FN,V,A,B,C,D,E)\ - movl off(%ebx), %edi;\ - bswap %edi;\ - movl %edi, off(%ebp);\ - leal V(%edi,E,1), E;\ - movl A, %edi;\ - roll $5,%edi;\ - addl %edi,E;\ - FN(B,C,D)\ - addl %edi,E;\ - rorl $2,B;\ - -/* - * fn1 = (((C^D)&B)^D); - */ -#define FN1(B,C,D)\ - movl C, %edi;\ - xorl D, %edi;\ - andl B, %edi;\ - xorl D, %edi;\ - -/* - * fn24 = B ^ C ^ D - */ -#define FN24(B,C,D)\ - movl B, %edi;\ - xorl C, %edi;\ - xorl D, %edi;\ - -/* - * fn3 = ((B ^ C) & (D ^= B)) ^ B - * D ^= B to restore D - */ -#define FN3(B,C,D)\ - movl B, %edi;\ - xorl C, %edi;\ - xorl B, D;\ - andl D, %edi;\ - xorl B, %edi;\ - xorl B, D;\ - -/* - * stack offsets - * void sha1block(uchar *DATA, int LEN, ulong *STATE) - */ -#define STACKSIZE (48+80*4) -#define DATA (STACKSIZE+8) -#define LEN (STACKSIZE+12) -#define STATE (STACKSIZE+16) - -/* - * stack offsets for locals - * ulong w[80]; - * uchar *edata; - * ulong *w15, *w40, *w60, *w80; - * register local - * ulong *wp = %ebp - * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi - * ulong tmp = edi - */ -#define WARRAY (STACKSIZE-4-(80*4)) -#define TMP1 (STACKSIZE-8-(80*4)) -#define TMP2 (STACKSIZE-12-(80*4)) -#define W15 (STACKSIZE-16-(80*4)) -#define W40 (STACKSIZE-20-(80*4)) -#define W60 (STACKSIZE-24-(80*4)) -#define W80 (STACKSIZE-28-(80*4)) -#define EDATA (STACKSIZE-32-(80*4)) -#define OLDEBX (STACKSIZE-36-(80*4)) -#define OLDESI (STACKSIZE-40-(80*4)) -#define OLDEDI (STACKSIZE-44-(80*4)) - - /* Prelude */ - pushl %ebp - subl $(STACKSIZE), %esp - - mov %ebx, OLDEBX(%esp) - mov %esi, OLDESI(%esp) - mov %edi, OLDEDI(%esp) - - movl DATA(%esp), %eax - addl LEN(%esp), %eax - movl %eax, EDATA(%esp) - - leal (WARRAY+15*4)(%esp), %edi /* aw15 */ - movl %edi, W15(%esp) - leal (WARRAY+40*4)(%esp), %edx /* aw40 */ - movl %edx, W40(%esp) - leal (WARRAY+60*4)(%esp), %ecx /* aw60 */ - movl %ecx, W60(%esp) - leal (WARRAY+80*4)(%esp), %edi /* aw80 */ - movl %edi, W80(%esp) - -0: - leal WARRAY(%esp), %ebp /* warray */ - - movl STATE(%esp), %edi /* state */ - movl (%edi),%eax - movl 4(%edi),%ebx - movl %ebx, TMP1(%esp) /* tmp1 */ - movl 8(%edi), %ecx - movl 12(%edi), %edx - movl 16(%edi), %esi - - movl DATA(%esp), %ebx /* data */ - -1: - BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) - movl %esi,TMP2(%esp) - BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx) - movl TMP1(%esp),%esi - BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx) - BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi) - movl %esi,TMP1(%esp) - BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax) - movl TMP2(%esp),%esi - - addl $20, %ebx - addl $20, %ebp - cmpl W15(%esp), %ebp /* w15 */ - jb 1b - - BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) - addl $4, %ebx - MOVL %ebx, DATA(%esp) /* data */ - MOVL TMP1(%esp),%ebx - - BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx) - BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx) - BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx) - BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax) - - addl $20, %ebp - -2: - BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi) - BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx) - BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx) - BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx) - BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax) - - addl $20,%ebp - cmpl W40(%esp), %ebp - jb 2b - -3: - BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi) - BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx) - BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx) - BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx) - BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax) - - addl $20, %ebp - cmpl W60(%esp), %ebp /* w60 */ - jb 3b - -4: - BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi) - BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx) - BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx) - BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx) - BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax) - - addl $20, %ebp - cmpl W80(%esp), %ebp /* w80 */ - jb 4b - - movl STATE(%esp), %edi /* state */ - addl %eax, 0(%edi) - addl %ebx, 4(%edi) - addl %ecx, 8(%edi) - addl %edx, 12(%edi) - addl %esi, 16(%edi) - - movl EDATA(%esp), %edi /* edata */ - cmpl %edi, DATA(%esp) /* data */ - jb 0b - - /* Postlude */ - mov OLDEBX(%esp), %ebx - mov OLDESI(%esp), %esi - mov OLDEDI(%esp), %edi - addl $(STACKSIZE), %esp - popl %ebp - ret diff --git a/sys/src/cmd/unix/drawterm/posix-386/tas.c b/sys/src/cmd/unix/drawterm/posix-386/tas.c deleted file mode 100644 index 8a907d8dc..000000000 --- a/sys/src/cmd/unix/drawterm/posix-386/tas.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "u.h" -#include "libc.h" - -int -tas(long *x) -{ - int v; - - __asm__( "movl $1, %%eax\n\t" - "xchgl %%eax,(%%ecx)" - : "=a" (v) - : "c" (x) - ); - switch(v) { - case 0: - case 1: - return v; - default: - print("canlock: corrupted 0x%lux\n", v); - return 1; - } -} - diff --git a/sys/src/cmd/unix/drawterm/posix-amd64/Makefile b/sys/src/cmd/unix/drawterm/posix-amd64/Makefile deleted file mode 100644 index 868932027..000000000 --- a/sys/src/cmd/unix/drawterm/posix-amd64/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=../libmachdep.a - -OFILES=\ - getcallerpc.$O\ - md5block.$O\ - sha1block.$O\ - tas.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c diff --git a/sys/src/cmd/unix/drawterm/posix-amd64/getcallerpc.c b/sys/src/cmd/unix/drawterm/posix-amd64/getcallerpc.c deleted file mode 100644 index 3614c593c..000000000 --- a/sys/src/cmd/unix/drawterm/posix-amd64/getcallerpc.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "u.h" -#include "libc.h" - -uintptr -getcallerpc(void *a) -{ - return ((uintptr*)a)[-1]; -} diff --git a/sys/src/cmd/unix/drawterm/posix-amd64/md5block.c b/sys/src/cmd/unix/drawterm/posix-amd64/md5block.c deleted file mode 100644 index 30edce479..000000000 --- a/sys/src/cmd/unix/drawterm/posix-amd64/md5block.c +++ /dev/null @@ -1,268 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ - -/* - * Rotate ammounts used in the algorithm - */ -enum -{ - S11= 7, - S12= 12, - S13= 17, - S14= 22, - - S21= 5, - S22= 9, - S23= 14, - S24= 20, - - S31= 4, - S32= 11, - S33= 16, - S34= 23, - - S41= 6, - S42= 10, - S43= 15, - S44= 21, -}; - -static u32int md5tab[] = -{ - /* round 1 */ -/*[0]*/ 0xd76aa478, - 0xe8c7b756, - 0x242070db, - 0xc1bdceee, - 0xf57c0faf, - 0x4787c62a, - 0xa8304613, - 0xfd469501, - 0x698098d8, - 0x8b44f7af, - 0xffff5bb1, - 0x895cd7be, - 0x6b901122, - 0xfd987193, - 0xa679438e, - 0x49b40821, - - /* round 2 */ -/*[16]*/0xf61e2562, - 0xc040b340, - 0x265e5a51, - 0xe9b6c7aa, - 0xd62f105d, - 0x2441453, - 0xd8a1e681, - 0xe7d3fbc8, - 0x21e1cde6, - 0xc33707d6, - 0xf4d50d87, - 0x455a14ed, - 0xa9e3e905, - 0xfcefa3f8, - 0x676f02d9, - 0x8d2a4c8a, - - /* round 3 */ -/*[32]*/0xfffa3942, - 0x8771f681, - 0x6d9d6122, - 0xfde5380c, - 0xa4beea44, - 0x4bdecfa9, - 0xf6bb4b60, - 0xbebfbc70, - 0x289b7ec6, - 0xeaa127fa, - 0xd4ef3085, - 0x4881d05, - 0xd9d4d039, - 0xe6db99e5, - 0x1fa27cf8, - 0xc4ac5665, - - /* round 4 */ -/*[48]*/0xf4292244, - 0x432aff97, - 0xab9423a7, - 0xfc93a039, - 0x655b59c3, - 0x8f0ccc92, - 0xffeff47d, - 0x85845dd1, - 0x6fa87e4f, - 0xfe2ce6e0, - 0xa3014314, - 0x4e0811a1, - 0xf7537e82, - 0xbd3af235, - 0x2ad7d2bb, - 0xeb86d391, -}; - -static void decode(u32int*, uchar*, ulong); -extern void _md5block(uchar *p, ulong len, u32int *s); - -void -_md5block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, sh; - u32int *t; - uchar *end; - u32int x[16]; - - for(end = p+len; p < end; p += 64){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - - decode(x, p, 64); - - t = md5tab; - sh = 0; - for(; sh != 16; t += 4){ - a += ((c ^ d) & b) ^ d; - a += x[sh] + t[0]; - a = (a << S11) | (a >> (32 - S11)); - a += b; - - d += ((b ^ c) & a) ^ c; - d += x[sh + 1] + t[1]; - d = (d << S12) | (d >> (32 - S12)); - d += a; - - c += ((a ^ b) & d) ^ b; - c += x[sh + 2] + t[2]; - c = (c << S13) | (c >> (32 - S13)); - c += d; - - b += ((d ^ a) & c) ^ a; - b += x[sh + 3] + t[3]; - b = (b << S14) | (b >> (32 - S14)); - b += c; - - sh += 4; - } - sh = 1; - for(; sh != 1+20*4; t += 4){ - a += ((b ^ c) & d) ^ c; - a += x[sh & 0xf] + t[0]; - a = (a << S21) | (a >> (32 - S21)); - a += b; - - d += ((a ^ b) & c) ^ b; - d += x[(sh + 5) & 0xf] + t[1]; - d = (d << S22) | (d >> (32 - S22)); - d += a; - - c += ((d ^ a) & b) ^ a; - c += x[(sh + 10) & 0xf] + t[2]; - c = (c << S23) | (c >> (32 - S23)); - c += d; - - b += ((c ^ d) & a) ^ d; - b += x[(sh + 15) & 0xf] + t[3]; - b = (b << S24) | (b >> (32 - S24)); - b += c; - - sh += 20; - } - sh = 5; - for(; sh != 5+12*4; t += 4){ - a += b ^ c ^ d; - a += x[sh & 0xf] + t[0]; - a = (a << S31) | (a >> (32 - S31)); - a += b; - - d += a ^ b ^ c; - d += x[(sh + 3) & 0xf] + t[1]; - d = (d << S32) | (d >> (32 - S32)); - d += a; - - c += d ^ a ^ b; - c += x[(sh + 6) & 0xf] + t[2]; - c = (c << S33) | (c >> (32 - S33)); - c += d; - - b += c ^ d ^ a; - b += x[(sh + 9) & 0xf] + t[3]; - b = (b << S34) | (b >> (32 - S34)); - b += c; - - sh += 12; - } - sh = 0; - for(; sh != 28*4; t += 4){ - a += c ^ (b | ~d); - a += x[sh & 0xf] + t[0]; - a = (a << S41) | (a >> (32 - S41)); - a += b; - - d += b ^ (a | ~c); - d += x[(sh + 7) & 0xf] + t[1]; - d = (d << S42) | (d >> (32 - S42)); - d += a; - - c += a ^ (d | ~b); - c += x[(sh + 14) & 0xf] + t[2]; - c = (c << S43) | (c >> (32 - S43)); - c += d; - - b += d ^ (c | ~a); - b += x[(sh + 21) & 0xf] + t[3]; - b = (b << S44) | (b >> (32 - S44)); - b += c; - - sh += 28; - } - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - } -} - -/* - * decodes input (uchar) into output (u32int). Assumes len is - * a multiple of 4. - */ -static void -decode(u32int *output, uchar *input, ulong len) -{ - uchar *e; - - for(e = input+len; input < e; input += 4) - *output++ = input[0] | (input[1] << 8) | - (input[2] << 16) | (input[3] << 24); -} diff --git a/sys/src/cmd/unix/drawterm/posix-amd64/sha1block.c b/sys/src/cmd/unix/drawterm/posix-amd64/sha1block.c deleted file mode 100644 index 1b49551c4..000000000 --- a/sys/src/cmd/unix/drawterm/posix-amd64/sha1block.c +++ /dev/null @@ -1,189 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -void -_sha1block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, e, x; - uchar *end; - u32int *wp, *wend; - u32int w[80]; - - /* at this point, we have a multiple of 64 bytes */ - for(end = p+len; p < end;){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - e = s[4]; - - wend = w + 15; - for(wp = w; wp < wend; wp += 5){ - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11]; - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15]; - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19]; - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - p += 20; - } - - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - wp += 5; - p += 4; - - wend = w + 40; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x6ed9eba1 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x6ed9eba1 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x6ed9eba1 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x6ed9eba1 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x6ed9eba1 + (c^d^e); - c = (c<<30)|(c>>2); - } - - wend = w + 60; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x8f1bbcdc + ((b&c)|((b|c)&d)); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x8f1bbcdc + ((a&b)|((a|b)&c)); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x8f1bbcdc + ((e&a)|((e|a)&b)); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x8f1bbcdc + ((d&e)|((d|e)&a)); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x8f1bbcdc + ((c&d)|((c|d)&e)); - c = (c<<30)|(c>>2); - } - - wend = w + 80; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0xca62c1d6 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0xca62c1d6 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0xca62c1d6 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0xca62c1d6 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0xca62c1d6 + (c^d^e); - c = (c<<30)|(c>>2); - } - - /* save state */ - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - } -} diff --git a/sys/src/cmd/unix/drawterm/posix-amd64/tas.c b/sys/src/cmd/unix/drawterm/posix-amd64/tas.c deleted file mode 100644 index 9e1d5d8a1..000000000 --- a/sys/src/cmd/unix/drawterm/posix-amd64/tas.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "u.h" -#include "libc.h" - -int -tas(long *x) -{ - int v; - - __asm__( "movl $1, %%eax\n\t" - "xchgl %%eax,(%%rcx)" - : "=a" (v) - : "c" (x) - ); - switch(v) { - case 0: - case 1: - return v; - default: - print("canlock: corrupted 0x%lux\n", v); - return 1; - } -} - diff --git a/sys/src/cmd/unix/drawterm/posix-factotum.c b/sys/src/cmd/unix/drawterm/posix-factotum.c deleted file mode 100644 index 728131bb5..000000000 --- a/sys/src/cmd/unix/drawterm/posix-factotum.c +++ /dev/null @@ -1,106 +0,0 @@ -#include <u.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <ctype.h> -#include <pwd.h> -#include <libc.h> -#include <auth.h> -#include <fcall.h> -#include <authsrv.h> -#include <libsec.h> -#include "drawterm.h" - -#undef socket -#undef connect -#undef getenv -#undef access - -char* -getuser(void) -{ - static char user[64]; - struct passwd *pw; - - pw = getpwuid(getuid()); - if(pw == nil) - return "none"; - strecpy(user, user+sizeof user, pw->pw_name); - return user; -} -/* - * Absent other hints, it works reasonably well to use - * the X11 display name as the name space identifier. - * This is how sam's B has worked since the early days. - * Since most programs using name spaces are also using X, - * this still seems reasonable. Terminal-only sessions - * can set $NAMESPACE. - */ -static char* -nsfromdisplay(void) -{ - char *disp, *p; - - if((disp = getenv("DISPLAY")) == nil){ - werrstr("$DISPLAY not set"); - return nil; - } - - /* canonicalize: xxx:0.0 => xxx:0 */ - p = strrchr(disp, ':'); - if(p){ - p++; - while(isdigit((uchar)*p)) - p++; - if(strcmp(p, ".0") == 0) - *p = 0; - } - - return smprint("/tmp/ns.%s.%s", getuser(), disp); -} - -char* -getns(void) -{ - char *ns; - - ns = getenv("NAMESPACE"); - if(ns == nil) - ns = nsfromdisplay(); - if(ns == nil){ - werrstr("$NAMESPACE not set, %r"); - return nil; - } - return ns; -} - -int -dialfactotum(void) -{ - int fd; - struct sockaddr_un su; - char *name; - - name = smprint("%s/factotum", getns()); - - if(name == nil || access(name, 0) < 0) - return -1; - memset(&su, 0, sizeof su); - su.sun_family = AF_UNIX; - if(strlen(name)+1 > sizeof su.sun_path){ - werrstr("socket name too long"); - return -1; - } - strcpy(su.sun_path, name); - if((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){ - werrstr("socket: %r"); - return -1; - } - if(connect(fd, (struct sockaddr*)&su, sizeof su) < 0){ - werrstr("connect %s: %r", name); - close(fd); - return -1; - } - - return lfdfd(fd); -} - diff --git a/sys/src/cmd/unix/drawterm/posix-mips/Makefile b/sys/src/cmd/unix/drawterm/posix-mips/Makefile deleted file mode 100644 index c452d0321..000000000 --- a/sys/src/cmd/unix/drawterm/posix-mips/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=../libmachdep.a - -OFILES=\ - getcallerpc.$O\ - md5block.$O\ - sha1block.$O\ - tas.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - -%.$O: %.s - $(AS) $(ASFLAGS) -o $*.$O $*.s - -%.s: %.spp - cpp $*.spp >$*.s - - diff --git a/sys/src/cmd/unix/drawterm/posix-mips/getcallerpc.c b/sys/src/cmd/unix/drawterm/posix-mips/getcallerpc.c deleted file mode 100644 index 553c7500e..000000000 --- a/sys/src/cmd/unix/drawterm/posix-mips/getcallerpc.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "u.h" -#include "libc.h" - -ulong -getcallerpc(void *a) -{ - return ((ulong*)a)[-1]; -} diff --git a/sys/src/cmd/unix/drawterm/posix-mips/md5block.c b/sys/src/cmd/unix/drawterm/posix-mips/md5block.c deleted file mode 100644 index 30edce479..000000000 --- a/sys/src/cmd/unix/drawterm/posix-mips/md5block.c +++ /dev/null @@ -1,268 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ - -/* - * Rotate ammounts used in the algorithm - */ -enum -{ - S11= 7, - S12= 12, - S13= 17, - S14= 22, - - S21= 5, - S22= 9, - S23= 14, - S24= 20, - - S31= 4, - S32= 11, - S33= 16, - S34= 23, - - S41= 6, - S42= 10, - S43= 15, - S44= 21, -}; - -static u32int md5tab[] = -{ - /* round 1 */ -/*[0]*/ 0xd76aa478, - 0xe8c7b756, - 0x242070db, - 0xc1bdceee, - 0xf57c0faf, - 0x4787c62a, - 0xa8304613, - 0xfd469501, - 0x698098d8, - 0x8b44f7af, - 0xffff5bb1, - 0x895cd7be, - 0x6b901122, - 0xfd987193, - 0xa679438e, - 0x49b40821, - - /* round 2 */ -/*[16]*/0xf61e2562, - 0xc040b340, - 0x265e5a51, - 0xe9b6c7aa, - 0xd62f105d, - 0x2441453, - 0xd8a1e681, - 0xe7d3fbc8, - 0x21e1cde6, - 0xc33707d6, - 0xf4d50d87, - 0x455a14ed, - 0xa9e3e905, - 0xfcefa3f8, - 0x676f02d9, - 0x8d2a4c8a, - - /* round 3 */ -/*[32]*/0xfffa3942, - 0x8771f681, - 0x6d9d6122, - 0xfde5380c, - 0xa4beea44, - 0x4bdecfa9, - 0xf6bb4b60, - 0xbebfbc70, - 0x289b7ec6, - 0xeaa127fa, - 0xd4ef3085, - 0x4881d05, - 0xd9d4d039, - 0xe6db99e5, - 0x1fa27cf8, - 0xc4ac5665, - - /* round 4 */ -/*[48]*/0xf4292244, - 0x432aff97, - 0xab9423a7, - 0xfc93a039, - 0x655b59c3, - 0x8f0ccc92, - 0xffeff47d, - 0x85845dd1, - 0x6fa87e4f, - 0xfe2ce6e0, - 0xa3014314, - 0x4e0811a1, - 0xf7537e82, - 0xbd3af235, - 0x2ad7d2bb, - 0xeb86d391, -}; - -static void decode(u32int*, uchar*, ulong); -extern void _md5block(uchar *p, ulong len, u32int *s); - -void -_md5block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, sh; - u32int *t; - uchar *end; - u32int x[16]; - - for(end = p+len; p < end; p += 64){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - - decode(x, p, 64); - - t = md5tab; - sh = 0; - for(; sh != 16; t += 4){ - a += ((c ^ d) & b) ^ d; - a += x[sh] + t[0]; - a = (a << S11) | (a >> (32 - S11)); - a += b; - - d += ((b ^ c) & a) ^ c; - d += x[sh + 1] + t[1]; - d = (d << S12) | (d >> (32 - S12)); - d += a; - - c += ((a ^ b) & d) ^ b; - c += x[sh + 2] + t[2]; - c = (c << S13) | (c >> (32 - S13)); - c += d; - - b += ((d ^ a) & c) ^ a; - b += x[sh + 3] + t[3]; - b = (b << S14) | (b >> (32 - S14)); - b += c; - - sh += 4; - } - sh = 1; - for(; sh != 1+20*4; t += 4){ - a += ((b ^ c) & d) ^ c; - a += x[sh & 0xf] + t[0]; - a = (a << S21) | (a >> (32 - S21)); - a += b; - - d += ((a ^ b) & c) ^ b; - d += x[(sh + 5) & 0xf] + t[1]; - d = (d << S22) | (d >> (32 - S22)); - d += a; - - c += ((d ^ a) & b) ^ a; - c += x[(sh + 10) & 0xf] + t[2]; - c = (c << S23) | (c >> (32 - S23)); - c += d; - - b += ((c ^ d) & a) ^ d; - b += x[(sh + 15) & 0xf] + t[3]; - b = (b << S24) | (b >> (32 - S24)); - b += c; - - sh += 20; - } - sh = 5; - for(; sh != 5+12*4; t += 4){ - a += b ^ c ^ d; - a += x[sh & 0xf] + t[0]; - a = (a << S31) | (a >> (32 - S31)); - a += b; - - d += a ^ b ^ c; - d += x[(sh + 3) & 0xf] + t[1]; - d = (d << S32) | (d >> (32 - S32)); - d += a; - - c += d ^ a ^ b; - c += x[(sh + 6) & 0xf] + t[2]; - c = (c << S33) | (c >> (32 - S33)); - c += d; - - b += c ^ d ^ a; - b += x[(sh + 9) & 0xf] + t[3]; - b = (b << S34) | (b >> (32 - S34)); - b += c; - - sh += 12; - } - sh = 0; - for(; sh != 28*4; t += 4){ - a += c ^ (b | ~d); - a += x[sh & 0xf] + t[0]; - a = (a << S41) | (a >> (32 - S41)); - a += b; - - d += b ^ (a | ~c); - d += x[(sh + 7) & 0xf] + t[1]; - d = (d << S42) | (d >> (32 - S42)); - d += a; - - c += a ^ (d | ~b); - c += x[(sh + 14) & 0xf] + t[2]; - c = (c << S43) | (c >> (32 - S43)); - c += d; - - b += d ^ (c | ~a); - b += x[(sh + 21) & 0xf] + t[3]; - b = (b << S44) | (b >> (32 - S44)); - b += c; - - sh += 28; - } - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - } -} - -/* - * decodes input (uchar) into output (u32int). Assumes len is - * a multiple of 4. - */ -static void -decode(u32int *output, uchar *input, ulong len) -{ - uchar *e; - - for(e = input+len; input < e; input += 4) - *output++ = input[0] | (input[1] << 8) | - (input[2] << 16) | (input[3] << 24); -} diff --git a/sys/src/cmd/unix/drawterm/posix-mips/sha1block.c b/sys/src/cmd/unix/drawterm/posix-mips/sha1block.c deleted file mode 100644 index 1b49551c4..000000000 --- a/sys/src/cmd/unix/drawterm/posix-mips/sha1block.c +++ /dev/null @@ -1,189 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -void -_sha1block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, e, x; - uchar *end; - u32int *wp, *wend; - u32int w[80]; - - /* at this point, we have a multiple of 64 bytes */ - for(end = p+len; p < end;){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - e = s[4]; - - wend = w + 15; - for(wp = w; wp < wend; wp += 5){ - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11]; - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15]; - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19]; - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - p += 20; - } - - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - wp += 5; - p += 4; - - wend = w + 40; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x6ed9eba1 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x6ed9eba1 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x6ed9eba1 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x6ed9eba1 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x6ed9eba1 + (c^d^e); - c = (c<<30)|(c>>2); - } - - wend = w + 60; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x8f1bbcdc + ((b&c)|((b|c)&d)); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x8f1bbcdc + ((a&b)|((a|b)&c)); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x8f1bbcdc + ((e&a)|((e|a)&b)); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x8f1bbcdc + ((d&e)|((d|e)&a)); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x8f1bbcdc + ((c&d)|((c|d)&e)); - c = (c<<30)|(c>>2); - } - - wend = w + 80; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0xca62c1d6 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0xca62c1d6 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0xca62c1d6 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0xca62c1d6 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0xca62c1d6 + (c^d^e); - c = (c<<30)|(c>>2); - } - - /* save state */ - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - } -} diff --git a/sys/src/cmd/unix/drawterm/posix-mips/tas.s b/sys/src/cmd/unix/drawterm/posix-mips/tas.s deleted file mode 100644 index 3ef102bf6..000000000 --- a/sys/src/cmd/unix/drawterm/posix-mips/tas.s +++ /dev/null @@ -1,21 +0,0 @@ -#include <sys/regdef.h> -#include <sys/asm.h> - -.globl tas -.ent tas 2 - -tas: -.set noreorder -1: - ori t1, zero, 12345 /* t1 = 12345 */ - ll t0, (a0) /* t0 = *a0 */ - sc t1, (a0) /* *a0 = t1 if *a0 hasn't changed; t1=success */ - beq t1, zero, 1b /* repeat if *a0 did change */ - nop - - j $31 /* return */ - or v0, t0, zero /* set return value on way out */ - -.set reorder -.end tas - diff --git a/sys/src/cmd/unix/drawterm/posix-port/Makefile b/sys/src/cmd/unix/drawterm/posix-port/Makefile deleted file mode 100644 index 77b437c16..000000000 --- a/sys/src/cmd/unix/drawterm/posix-port/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=../libmachdep.a - -OFILES=\ - getcallerpc.$O\ - md5block.$O\ - sha1block.$O\ - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - -%.$O: %.s - $(AS) -o $*.$O $*.s - -%.s: %.spp - cpp $*.spp >$*.s - - diff --git a/sys/src/cmd/unix/drawterm/posix-port/getcallerpc.c b/sys/src/cmd/unix/drawterm/posix-port/getcallerpc.c deleted file mode 100644 index a9bb08c21..000000000 --- a/sys/src/cmd/unix/drawterm/posix-port/getcallerpc.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "u.h" -#include "libc.h" - -uintptr -getcallerpc(void *a) -{ - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/posix-port/md5block.c b/sys/src/cmd/unix/drawterm/posix-port/md5block.c deleted file mode 100644 index 30edce479..000000000 --- a/sys/src/cmd/unix/drawterm/posix-port/md5block.c +++ /dev/null @@ -1,268 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ - -/* - * Rotate ammounts used in the algorithm - */ -enum -{ - S11= 7, - S12= 12, - S13= 17, - S14= 22, - - S21= 5, - S22= 9, - S23= 14, - S24= 20, - - S31= 4, - S32= 11, - S33= 16, - S34= 23, - - S41= 6, - S42= 10, - S43= 15, - S44= 21, -}; - -static u32int md5tab[] = -{ - /* round 1 */ -/*[0]*/ 0xd76aa478, - 0xe8c7b756, - 0x242070db, - 0xc1bdceee, - 0xf57c0faf, - 0x4787c62a, - 0xa8304613, - 0xfd469501, - 0x698098d8, - 0x8b44f7af, - 0xffff5bb1, - 0x895cd7be, - 0x6b901122, - 0xfd987193, - 0xa679438e, - 0x49b40821, - - /* round 2 */ -/*[16]*/0xf61e2562, - 0xc040b340, - 0x265e5a51, - 0xe9b6c7aa, - 0xd62f105d, - 0x2441453, - 0xd8a1e681, - 0xe7d3fbc8, - 0x21e1cde6, - 0xc33707d6, - 0xf4d50d87, - 0x455a14ed, - 0xa9e3e905, - 0xfcefa3f8, - 0x676f02d9, - 0x8d2a4c8a, - - /* round 3 */ -/*[32]*/0xfffa3942, - 0x8771f681, - 0x6d9d6122, - 0xfde5380c, - 0xa4beea44, - 0x4bdecfa9, - 0xf6bb4b60, - 0xbebfbc70, - 0x289b7ec6, - 0xeaa127fa, - 0xd4ef3085, - 0x4881d05, - 0xd9d4d039, - 0xe6db99e5, - 0x1fa27cf8, - 0xc4ac5665, - - /* round 4 */ -/*[48]*/0xf4292244, - 0x432aff97, - 0xab9423a7, - 0xfc93a039, - 0x655b59c3, - 0x8f0ccc92, - 0xffeff47d, - 0x85845dd1, - 0x6fa87e4f, - 0xfe2ce6e0, - 0xa3014314, - 0x4e0811a1, - 0xf7537e82, - 0xbd3af235, - 0x2ad7d2bb, - 0xeb86d391, -}; - -static void decode(u32int*, uchar*, ulong); -extern void _md5block(uchar *p, ulong len, u32int *s); - -void -_md5block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, sh; - u32int *t; - uchar *end; - u32int x[16]; - - for(end = p+len; p < end; p += 64){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - - decode(x, p, 64); - - t = md5tab; - sh = 0; - for(; sh != 16; t += 4){ - a += ((c ^ d) & b) ^ d; - a += x[sh] + t[0]; - a = (a << S11) | (a >> (32 - S11)); - a += b; - - d += ((b ^ c) & a) ^ c; - d += x[sh + 1] + t[1]; - d = (d << S12) | (d >> (32 - S12)); - d += a; - - c += ((a ^ b) & d) ^ b; - c += x[sh + 2] + t[2]; - c = (c << S13) | (c >> (32 - S13)); - c += d; - - b += ((d ^ a) & c) ^ a; - b += x[sh + 3] + t[3]; - b = (b << S14) | (b >> (32 - S14)); - b += c; - - sh += 4; - } - sh = 1; - for(; sh != 1+20*4; t += 4){ - a += ((b ^ c) & d) ^ c; - a += x[sh & 0xf] + t[0]; - a = (a << S21) | (a >> (32 - S21)); - a += b; - - d += ((a ^ b) & c) ^ b; - d += x[(sh + 5) & 0xf] + t[1]; - d = (d << S22) | (d >> (32 - S22)); - d += a; - - c += ((d ^ a) & b) ^ a; - c += x[(sh + 10) & 0xf] + t[2]; - c = (c << S23) | (c >> (32 - S23)); - c += d; - - b += ((c ^ d) & a) ^ d; - b += x[(sh + 15) & 0xf] + t[3]; - b = (b << S24) | (b >> (32 - S24)); - b += c; - - sh += 20; - } - sh = 5; - for(; sh != 5+12*4; t += 4){ - a += b ^ c ^ d; - a += x[sh & 0xf] + t[0]; - a = (a << S31) | (a >> (32 - S31)); - a += b; - - d += a ^ b ^ c; - d += x[(sh + 3) & 0xf] + t[1]; - d = (d << S32) | (d >> (32 - S32)); - d += a; - - c += d ^ a ^ b; - c += x[(sh + 6) & 0xf] + t[2]; - c = (c << S33) | (c >> (32 - S33)); - c += d; - - b += c ^ d ^ a; - b += x[(sh + 9) & 0xf] + t[3]; - b = (b << S34) | (b >> (32 - S34)); - b += c; - - sh += 12; - } - sh = 0; - for(; sh != 28*4; t += 4){ - a += c ^ (b | ~d); - a += x[sh & 0xf] + t[0]; - a = (a << S41) | (a >> (32 - S41)); - a += b; - - d += b ^ (a | ~c); - d += x[(sh + 7) & 0xf] + t[1]; - d = (d << S42) | (d >> (32 - S42)); - d += a; - - c += a ^ (d | ~b); - c += x[(sh + 14) & 0xf] + t[2]; - c = (c << S43) | (c >> (32 - S43)); - c += d; - - b += d ^ (c | ~a); - b += x[(sh + 21) & 0xf] + t[3]; - b = (b << S44) | (b >> (32 - S44)); - b += c; - - sh += 28; - } - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - } -} - -/* - * decodes input (uchar) into output (u32int). Assumes len is - * a multiple of 4. - */ -static void -decode(u32int *output, uchar *input, ulong len) -{ - uchar *e; - - for(e = input+len; input < e; input += 4) - *output++ = input[0] | (input[1] << 8) | - (input[2] << 16) | (input[3] << 24); -} diff --git a/sys/src/cmd/unix/drawterm/posix-port/sha1block.c b/sys/src/cmd/unix/drawterm/posix-port/sha1block.c deleted file mode 100644 index 1b49551c4..000000000 --- a/sys/src/cmd/unix/drawterm/posix-port/sha1block.c +++ /dev/null @@ -1,189 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -void -_sha1block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, e, x; - uchar *end; - u32int *wp, *wend; - u32int w[80]; - - /* at this point, we have a multiple of 64 bytes */ - for(end = p+len; p < end;){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - e = s[4]; - - wend = w + 15; - for(wp = w; wp < wend; wp += 5){ - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11]; - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15]; - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19]; - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - p += 20; - } - - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - wp += 5; - p += 4; - - wend = w + 40; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x6ed9eba1 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x6ed9eba1 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x6ed9eba1 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x6ed9eba1 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x6ed9eba1 + (c^d^e); - c = (c<<30)|(c>>2); - } - - wend = w + 60; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x8f1bbcdc + ((b&c)|((b|c)&d)); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x8f1bbcdc + ((a&b)|((a|b)&c)); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x8f1bbcdc + ((e&a)|((e|a)&b)); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x8f1bbcdc + ((d&e)|((d|e)&a)); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x8f1bbcdc + ((c&d)|((c|d)&e)); - c = (c<<30)|(c>>2); - } - - wend = w + 80; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0xca62c1d6 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0xca62c1d6 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0xca62c1d6 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0xca62c1d6 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0xca62c1d6 + (c^d^e); - c = (c<<30)|(c>>2); - } - - /* save state */ - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - } -} diff --git a/sys/src/cmd/unix/drawterm/posix-power/Makefile b/sys/src/cmd/unix/drawterm/posix-power/Makefile deleted file mode 100644 index 30328f418..000000000 --- a/sys/src/cmd/unix/drawterm/posix-power/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=../libmachdep.a - -OFILES=\ - getcallerpc.$O\ - md5block.$O\ - sha1block.$O\ - tas.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - -%.$O: %.s - $(AS) -o $*.$O $*.s - -%.s: %.spp - cpp $*.spp >$*.s - - diff --git a/sys/src/cmd/unix/drawterm/posix-power/getcallerpc.c b/sys/src/cmd/unix/drawterm/posix-power/getcallerpc.c deleted file mode 100644 index 3614c593c..000000000 --- a/sys/src/cmd/unix/drawterm/posix-power/getcallerpc.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "u.h" -#include "libc.h" - -uintptr -getcallerpc(void *a) -{ - return ((uintptr*)a)[-1]; -} diff --git a/sys/src/cmd/unix/drawterm/posix-power/md5block.c b/sys/src/cmd/unix/drawterm/posix-power/md5block.c deleted file mode 100644 index 30edce479..000000000 --- a/sys/src/cmd/unix/drawterm/posix-power/md5block.c +++ /dev/null @@ -1,268 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ - -/* - * Rotate ammounts used in the algorithm - */ -enum -{ - S11= 7, - S12= 12, - S13= 17, - S14= 22, - - S21= 5, - S22= 9, - S23= 14, - S24= 20, - - S31= 4, - S32= 11, - S33= 16, - S34= 23, - - S41= 6, - S42= 10, - S43= 15, - S44= 21, -}; - -static u32int md5tab[] = -{ - /* round 1 */ -/*[0]*/ 0xd76aa478, - 0xe8c7b756, - 0x242070db, - 0xc1bdceee, - 0xf57c0faf, - 0x4787c62a, - 0xa8304613, - 0xfd469501, - 0x698098d8, - 0x8b44f7af, - 0xffff5bb1, - 0x895cd7be, - 0x6b901122, - 0xfd987193, - 0xa679438e, - 0x49b40821, - - /* round 2 */ -/*[16]*/0xf61e2562, - 0xc040b340, - 0x265e5a51, - 0xe9b6c7aa, - 0xd62f105d, - 0x2441453, - 0xd8a1e681, - 0xe7d3fbc8, - 0x21e1cde6, - 0xc33707d6, - 0xf4d50d87, - 0x455a14ed, - 0xa9e3e905, - 0xfcefa3f8, - 0x676f02d9, - 0x8d2a4c8a, - - /* round 3 */ -/*[32]*/0xfffa3942, - 0x8771f681, - 0x6d9d6122, - 0xfde5380c, - 0xa4beea44, - 0x4bdecfa9, - 0xf6bb4b60, - 0xbebfbc70, - 0x289b7ec6, - 0xeaa127fa, - 0xd4ef3085, - 0x4881d05, - 0xd9d4d039, - 0xe6db99e5, - 0x1fa27cf8, - 0xc4ac5665, - - /* round 4 */ -/*[48]*/0xf4292244, - 0x432aff97, - 0xab9423a7, - 0xfc93a039, - 0x655b59c3, - 0x8f0ccc92, - 0xffeff47d, - 0x85845dd1, - 0x6fa87e4f, - 0xfe2ce6e0, - 0xa3014314, - 0x4e0811a1, - 0xf7537e82, - 0xbd3af235, - 0x2ad7d2bb, - 0xeb86d391, -}; - -static void decode(u32int*, uchar*, ulong); -extern void _md5block(uchar *p, ulong len, u32int *s); - -void -_md5block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, sh; - u32int *t; - uchar *end; - u32int x[16]; - - for(end = p+len; p < end; p += 64){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - - decode(x, p, 64); - - t = md5tab; - sh = 0; - for(; sh != 16; t += 4){ - a += ((c ^ d) & b) ^ d; - a += x[sh] + t[0]; - a = (a << S11) | (a >> (32 - S11)); - a += b; - - d += ((b ^ c) & a) ^ c; - d += x[sh + 1] + t[1]; - d = (d << S12) | (d >> (32 - S12)); - d += a; - - c += ((a ^ b) & d) ^ b; - c += x[sh + 2] + t[2]; - c = (c << S13) | (c >> (32 - S13)); - c += d; - - b += ((d ^ a) & c) ^ a; - b += x[sh + 3] + t[3]; - b = (b << S14) | (b >> (32 - S14)); - b += c; - - sh += 4; - } - sh = 1; - for(; sh != 1+20*4; t += 4){ - a += ((b ^ c) & d) ^ c; - a += x[sh & 0xf] + t[0]; - a = (a << S21) | (a >> (32 - S21)); - a += b; - - d += ((a ^ b) & c) ^ b; - d += x[(sh + 5) & 0xf] + t[1]; - d = (d << S22) | (d >> (32 - S22)); - d += a; - - c += ((d ^ a) & b) ^ a; - c += x[(sh + 10) & 0xf] + t[2]; - c = (c << S23) | (c >> (32 - S23)); - c += d; - - b += ((c ^ d) & a) ^ d; - b += x[(sh + 15) & 0xf] + t[3]; - b = (b << S24) | (b >> (32 - S24)); - b += c; - - sh += 20; - } - sh = 5; - for(; sh != 5+12*4; t += 4){ - a += b ^ c ^ d; - a += x[sh & 0xf] + t[0]; - a = (a << S31) | (a >> (32 - S31)); - a += b; - - d += a ^ b ^ c; - d += x[(sh + 3) & 0xf] + t[1]; - d = (d << S32) | (d >> (32 - S32)); - d += a; - - c += d ^ a ^ b; - c += x[(sh + 6) & 0xf] + t[2]; - c = (c << S33) | (c >> (32 - S33)); - c += d; - - b += c ^ d ^ a; - b += x[(sh + 9) & 0xf] + t[3]; - b = (b << S34) | (b >> (32 - S34)); - b += c; - - sh += 12; - } - sh = 0; - for(; sh != 28*4; t += 4){ - a += c ^ (b | ~d); - a += x[sh & 0xf] + t[0]; - a = (a << S41) | (a >> (32 - S41)); - a += b; - - d += b ^ (a | ~c); - d += x[(sh + 7) & 0xf] + t[1]; - d = (d << S42) | (d >> (32 - S42)); - d += a; - - c += a ^ (d | ~b); - c += x[(sh + 14) & 0xf] + t[2]; - c = (c << S43) | (c >> (32 - S43)); - c += d; - - b += d ^ (c | ~a); - b += x[(sh + 21) & 0xf] + t[3]; - b = (b << S44) | (b >> (32 - S44)); - b += c; - - sh += 28; - } - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - } -} - -/* - * decodes input (uchar) into output (u32int). Assumes len is - * a multiple of 4. - */ -static void -decode(u32int *output, uchar *input, ulong len) -{ - uchar *e; - - for(e = input+len; input < e; input += 4) - *output++ = input[0] | (input[1] << 8) | - (input[2] << 16) | (input[3] << 24); -} diff --git a/sys/src/cmd/unix/drawterm/posix-power/sha1block.c b/sys/src/cmd/unix/drawterm/posix-power/sha1block.c deleted file mode 100644 index 1b49551c4..000000000 --- a/sys/src/cmd/unix/drawterm/posix-power/sha1block.c +++ /dev/null @@ -1,189 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -void -_sha1block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, e, x; - uchar *end; - u32int *wp, *wend; - u32int w[80]; - - /* at this point, we have a multiple of 64 bytes */ - for(end = p+len; p < end;){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - e = s[4]; - - wend = w + 15; - for(wp = w; wp < wend; wp += 5){ - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11]; - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15]; - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19]; - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - p += 20; - } - - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - wp += 5; - p += 4; - - wend = w + 40; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x6ed9eba1 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x6ed9eba1 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x6ed9eba1 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x6ed9eba1 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x6ed9eba1 + (c^d^e); - c = (c<<30)|(c>>2); - } - - wend = w + 60; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x8f1bbcdc + ((b&c)|((b|c)&d)); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x8f1bbcdc + ((a&b)|((a|b)&c)); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x8f1bbcdc + ((e&a)|((e|a)&b)); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x8f1bbcdc + ((d&e)|((d|e)&a)); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x8f1bbcdc + ((c&d)|((c|d)&e)); - c = (c<<30)|(c>>2); - } - - wend = w + 80; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0xca62c1d6 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0xca62c1d6 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0xca62c1d6 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0xca62c1d6 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0xca62c1d6 + (c^d^e); - c = (c<<30)|(c>>2); - } - - /* save state */ - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - } -} diff --git a/sys/src/cmd/unix/drawterm/posix-power/tas.c b/sys/src/cmd/unix/drawterm/posix-power/tas.c deleted file mode 100644 index 508aa6d81..000000000 --- a/sys/src/cmd/unix/drawterm/posix-power/tas.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "u.h" -#include "libc.h" - -/* - * first argument (l) is in r3 at entry. - * r3 contains return value upon return. - */ -int -tas(long *x) -{ - int v; - /* - * this __asm__ works with gcc 2.95.2 (mac os x 10.1). - * this assembly language destroys r0 (0), some other register (v), - * r4 (x) and r5 (temp). - */ - __asm__("\n sync\n" - " li r0,0\n" - " mr r4,%1 /* &l->val */\n" - " lis r5,0xdead /* assemble constant 0xdeaddead */\n" - " ori r5,r5,0xdead /* \" */\n" - "tas1:\n" - " dcbf r4,r0 /* cache flush; \"fix for 603x bug\" */\n" - " lwarx %0,r4,r0 /* v = l->val with reservation */\n" - " cmp cr0,0,%0,r0 /* v == 0 */\n" - " bne tas0\n" - " stwcx. r5,r4,r0 /* if (l->val same) l->val = 0xdeaddead */\n" - " bne tas1\n" - "tas0:\n" - " sync\n" - " isync\n" - : "=r" (v) - : "r" (x) - : "cc", "memory", "r0", "r4", "r5" - ); - switch(v) { - case 0: return 0; - case 0xdeaddead: return 1; - default: print("tas: corrupted 0x%lux\n", v); - } - return 0; -} diff --git a/sys/src/cmd/unix/drawterm/posix-sun4u/Makefile b/sys/src/cmd/unix/drawterm/posix-sun4u/Makefile deleted file mode 100644 index b19fc8141..000000000 --- a/sys/src/cmd/unix/drawterm/posix-sun4u/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=../libmachdep.a - -OFILES=\ - getcallerpc.$O\ - md5block.$O\ - sha1block.$O\ - tas.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - -%.$O: %.s - $(AS) -o $*.$O $*.s - -%.s: %.spp - cpp $*.spp >$*.s - - - diff --git a/sys/src/cmd/unix/drawterm/posix-sun4u/getcallerpc.c b/sys/src/cmd/unix/drawterm/posix-sun4u/getcallerpc.c deleted file mode 100644 index 4f4b6b76f..000000000 --- a/sys/src/cmd/unix/drawterm/posix-sun4u/getcallerpc.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "u.h" -#include "libc.h" - -ulong -getcallerpc(void *a) -{ - return ((ulong*)a)[-1]; -} - diff --git a/sys/src/cmd/unix/drawterm/posix-sun4u/md5block.c b/sys/src/cmd/unix/drawterm/posix-sun4u/md5block.c deleted file mode 100644 index 30edce479..000000000 --- a/sys/src/cmd/unix/drawterm/posix-sun4u/md5block.c +++ /dev/null @@ -1,268 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ - -/* - * Rotate ammounts used in the algorithm - */ -enum -{ - S11= 7, - S12= 12, - S13= 17, - S14= 22, - - S21= 5, - S22= 9, - S23= 14, - S24= 20, - - S31= 4, - S32= 11, - S33= 16, - S34= 23, - - S41= 6, - S42= 10, - S43= 15, - S44= 21, -}; - -static u32int md5tab[] = -{ - /* round 1 */ -/*[0]*/ 0xd76aa478, - 0xe8c7b756, - 0x242070db, - 0xc1bdceee, - 0xf57c0faf, - 0x4787c62a, - 0xa8304613, - 0xfd469501, - 0x698098d8, - 0x8b44f7af, - 0xffff5bb1, - 0x895cd7be, - 0x6b901122, - 0xfd987193, - 0xa679438e, - 0x49b40821, - - /* round 2 */ -/*[16]*/0xf61e2562, - 0xc040b340, - 0x265e5a51, - 0xe9b6c7aa, - 0xd62f105d, - 0x2441453, - 0xd8a1e681, - 0xe7d3fbc8, - 0x21e1cde6, - 0xc33707d6, - 0xf4d50d87, - 0x455a14ed, - 0xa9e3e905, - 0xfcefa3f8, - 0x676f02d9, - 0x8d2a4c8a, - - /* round 3 */ -/*[32]*/0xfffa3942, - 0x8771f681, - 0x6d9d6122, - 0xfde5380c, - 0xa4beea44, - 0x4bdecfa9, - 0xf6bb4b60, - 0xbebfbc70, - 0x289b7ec6, - 0xeaa127fa, - 0xd4ef3085, - 0x4881d05, - 0xd9d4d039, - 0xe6db99e5, - 0x1fa27cf8, - 0xc4ac5665, - - /* round 4 */ -/*[48]*/0xf4292244, - 0x432aff97, - 0xab9423a7, - 0xfc93a039, - 0x655b59c3, - 0x8f0ccc92, - 0xffeff47d, - 0x85845dd1, - 0x6fa87e4f, - 0xfe2ce6e0, - 0xa3014314, - 0x4e0811a1, - 0xf7537e82, - 0xbd3af235, - 0x2ad7d2bb, - 0xeb86d391, -}; - -static void decode(u32int*, uchar*, ulong); -extern void _md5block(uchar *p, ulong len, u32int *s); - -void -_md5block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, sh; - u32int *t; - uchar *end; - u32int x[16]; - - for(end = p+len; p < end; p += 64){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - - decode(x, p, 64); - - t = md5tab; - sh = 0; - for(; sh != 16; t += 4){ - a += ((c ^ d) & b) ^ d; - a += x[sh] + t[0]; - a = (a << S11) | (a >> (32 - S11)); - a += b; - - d += ((b ^ c) & a) ^ c; - d += x[sh + 1] + t[1]; - d = (d << S12) | (d >> (32 - S12)); - d += a; - - c += ((a ^ b) & d) ^ b; - c += x[sh + 2] + t[2]; - c = (c << S13) | (c >> (32 - S13)); - c += d; - - b += ((d ^ a) & c) ^ a; - b += x[sh + 3] + t[3]; - b = (b << S14) | (b >> (32 - S14)); - b += c; - - sh += 4; - } - sh = 1; - for(; sh != 1+20*4; t += 4){ - a += ((b ^ c) & d) ^ c; - a += x[sh & 0xf] + t[0]; - a = (a << S21) | (a >> (32 - S21)); - a += b; - - d += ((a ^ b) & c) ^ b; - d += x[(sh + 5) & 0xf] + t[1]; - d = (d << S22) | (d >> (32 - S22)); - d += a; - - c += ((d ^ a) & b) ^ a; - c += x[(sh + 10) & 0xf] + t[2]; - c = (c << S23) | (c >> (32 - S23)); - c += d; - - b += ((c ^ d) & a) ^ d; - b += x[(sh + 15) & 0xf] + t[3]; - b = (b << S24) | (b >> (32 - S24)); - b += c; - - sh += 20; - } - sh = 5; - for(; sh != 5+12*4; t += 4){ - a += b ^ c ^ d; - a += x[sh & 0xf] + t[0]; - a = (a << S31) | (a >> (32 - S31)); - a += b; - - d += a ^ b ^ c; - d += x[(sh + 3) & 0xf] + t[1]; - d = (d << S32) | (d >> (32 - S32)); - d += a; - - c += d ^ a ^ b; - c += x[(sh + 6) & 0xf] + t[2]; - c = (c << S33) | (c >> (32 - S33)); - c += d; - - b += c ^ d ^ a; - b += x[(sh + 9) & 0xf] + t[3]; - b = (b << S34) | (b >> (32 - S34)); - b += c; - - sh += 12; - } - sh = 0; - for(; sh != 28*4; t += 4){ - a += c ^ (b | ~d); - a += x[sh & 0xf] + t[0]; - a = (a << S41) | (a >> (32 - S41)); - a += b; - - d += b ^ (a | ~c); - d += x[(sh + 7) & 0xf] + t[1]; - d = (d << S42) | (d >> (32 - S42)); - d += a; - - c += a ^ (d | ~b); - c += x[(sh + 14) & 0xf] + t[2]; - c = (c << S43) | (c >> (32 - S43)); - c += d; - - b += d ^ (c | ~a); - b += x[(sh + 21) & 0xf] + t[3]; - b = (b << S44) | (b >> (32 - S44)); - b += c; - - sh += 28; - } - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - } -} - -/* - * decodes input (uchar) into output (u32int). Assumes len is - * a multiple of 4. - */ -static void -decode(u32int *output, uchar *input, ulong len) -{ - uchar *e; - - for(e = input+len; input < e; input += 4) - *output++ = input[0] | (input[1] << 8) | - (input[2] << 16) | (input[3] << 24); -} diff --git a/sys/src/cmd/unix/drawterm/posix-sun4u/sha1block.c b/sys/src/cmd/unix/drawterm/posix-sun4u/sha1block.c deleted file mode 100644 index 1b49551c4..000000000 --- a/sys/src/cmd/unix/drawterm/posix-sun4u/sha1block.c +++ /dev/null @@ -1,189 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <libsec.h> - -void -_sha1block(uchar *p, ulong len, u32int *s) -{ - u32int a, b, c, d, e, x; - uchar *end; - u32int *wp, *wend; - u32int w[80]; - - /* at this point, we have a multiple of 64 bytes */ - for(end = p+len; p < end;){ - a = s[0]; - b = s[1]; - c = s[2]; - d = s[3]; - e = s[4]; - - wend = w + 15; - for(wp = w; wp < wend; wp += 5){ - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11]; - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15]; - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19]; - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - p += 20; - } - - wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x5a827999 + (((c^d)&b)^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x5a827999 + (((b^c)&a)^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x5a827999 + (((a^b)&e)^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x5a827999 + (((e^a)&d)^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x5a827999 + (((d^e)&c)^e); - c = (c<<30)|(c>>2); - - wp += 5; - p += 4; - - wend = w + 40; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x6ed9eba1 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x6ed9eba1 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x6ed9eba1 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x6ed9eba1 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x6ed9eba1 + (c^d^e); - c = (c<<30)|(c>>2); - } - - wend = w + 60; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0x8f1bbcdc + ((b&c)|((b|c)&d)); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0x8f1bbcdc + ((a&b)|((a|b)&c)); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0x8f1bbcdc + ((e&a)|((e|a)&b)); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0x8f1bbcdc + ((d&e)|((d|e)&a)); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0x8f1bbcdc + ((c&d)|((c|d)&e)); - c = (c<<30)|(c>>2); - } - - wend = w + 80; - for(; wp < wend; wp += 5){ - x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; - wp[0] = (x<<1) | (x>>31); - e += ((a<<5) | (a>>27)) + wp[0]; - e += 0xca62c1d6 + (b^c^d); - b = (b<<30)|(b>>2); - - x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; - wp[1] = (x<<1) | (x>>31); - d += ((e<<5) | (e>>27)) + wp[1]; - d += 0xca62c1d6 + (a^b^c); - a = (a<<30)|(a>>2); - - x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; - wp[2] = (x<<1) | (x>>31); - c += ((d<<5) | (d>>27)) + wp[2]; - c += 0xca62c1d6 + (e^a^b); - e = (e<<30)|(e>>2); - - x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; - wp[3] = (x<<1) | (x>>31); - b += ((c<<5) | (c>>27)) + wp[3]; - b += 0xca62c1d6 + (d^e^a); - d = (d<<30)|(d>>2); - - x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; - wp[4] = (x<<1) | (x>>31); - a += ((b<<5) | (b>>27)) + wp[4]; - a += 0xca62c1d6 + (c^d^e); - c = (c<<30)|(c>>2); - } - - /* save state */ - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - } -} diff --git a/sys/src/cmd/unix/drawterm/posix-sun4u/tas.s b/sys/src/cmd/unix/drawterm/posix-sun4u/tas.s deleted file mode 100644 index eb276b8b7..000000000 --- a/sys/src/cmd/unix/drawterm/posix-sun4u/tas.s +++ /dev/null @@ -1,5 +0,0 @@ -.globl tas -tas: - retl - ldstub [%o0], %o0 - diff --git a/sys/src/cmd/unix/drawterm/readcons.c b/sys/src/cmd/unix/drawterm/readcons.c deleted file mode 100644 index 844cff812..000000000 --- a/sys/src/cmd/unix/drawterm/readcons.c +++ /dev/null @@ -1,110 +0,0 @@ -#include <u.h> -#include <libc.h> -#include "drawterm.h" - -void* -erealloc(void *v, ulong n) -{ - v = realloc(v, n); - if(v == nil) - sysfatal("out of memory"); - return v; -} - -char* -estrdup(char *s) -{ - s = strdup(s); - if(s == nil) - sysfatal("out of memory"); - return s; -} - -char* -estrappend(char *s, char *fmt, ...) -{ - char *t; - va_list arg; - - va_start(arg, fmt); - t = vsmprint(fmt, arg); - if(t == nil) - sysfatal("out of memory"); - va_end(arg); - s = erealloc(s, strlen(s)+strlen(t)+1); - strcat(s, t); - free(t); - return s; -} - -/* - * prompt for a string with a possible default response - */ -char* -readcons(char *prompt, char *def, int raw) -{ - int fdin, fdout, ctl, n; - char line[10]; - char *s; - - fdin = open("/dev/cons", OREAD); - if(fdin < 0) - fdin = 0; - fdout = open("/dev/cons", OWRITE); - if(fdout < 0) - fdout = 1; - if(def != nil) - fprint(fdout, "%s[%s]: ", prompt, def); - else - fprint(fdout, "%s: ", prompt); - if(raw){ - ctl = open("/dev/consctl", OWRITE); - if(ctl >= 0) - write(ctl, "rawon", 5); - } else - ctl = -1; - s = estrdup(""); - for(;;){ - n = read(fdin, line, 1); - if(n == 0){ - Error: - close(fdin); - close(fdout); - if(ctl >= 0) - close(ctl); - free(s); - return nil; - } - if(n < 0) - goto Error; - if(line[0] == 0x7f) - goto Error; - if(n == 0 || line[0] == '\n' || line[0] == '\r'){ - if(raw){ - write(ctl, "rawoff", 6); - write(fdout, "\n", 1); - } - close(ctl); - close(fdin); - close(fdout); - if(*s == 0 && def != nil) - s = estrappend(s, "%s", def); - return s; - } - if(line[0] == '\b'){ - if(strlen(s) > 0) - s[strlen(s)-1] = 0; - } else if(line[0] == 0x15) { /* ^U: line kill */ - if(def != nil) - fprint(fdout, "\n%s[%s]: ", prompt, def); - else - fprint(fdout, "\n%s: ", prompt); - - s[0] = 0; - } else { - s = estrappend(s, "%c", line[0]); - } - } - return nil; /* not reached */ -} - diff --git a/sys/src/cmd/unix/drawterm/resource.h b/sys/src/cmd/unix/drawterm/resource.h deleted file mode 100644 index f419438a5..000000000 --- a/sys/src/cmd/unix/drawterm/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}}
-// Microsoft Developer Studio generated include file.
-// Used by drawterm.rc
-//
-#define IDI_ICON1 101
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 102
-#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1000
-#define _APS_NEXT_SYMED_VALUE 101
-#endif
-#endif
diff --git a/sys/src/cmd/unix/drawterm/secstore.c b/sys/src/cmd/unix/drawterm/secstore.c deleted file mode 100644 index 0d031daf9..000000000 --- a/sys/src/cmd/unix/drawterm/secstore.c +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Various files from /sys/src/cmd/auth/secstore, just enough - * to download a file at boot time. - */ - -#include <u.h> -#include <libc.h> -#include <mp.h> -#include <libsec.h> -#include "drawterm.h" - -static void* -emalloc(ulong n) -{ - return mallocz(n, 1); -} - -enum{ CHK = 16}; -enum{ MAXFILESIZE = 10*1024*1024 }; - -enum{// PW status bits - Enabled = (1<<0), - STA = (1<<1), // extra SecurID step -}; - -static char testmess[] = "__secstore\tPAK\nC=%s\nm=0\n"; - -int -secdial(char *secstore) -{ - char *p, buf[80], *f[3]; - int fd, nf; - - p = secstore; /* take it from writehostowner, if set there */ - if(*p == 0) /* else use the authserver */ - p = "$auth"; - - /* translate $auth ourselves. - * authaddr is something like il!host!566 or tcp!host!567. - * extract host, accounting for a change of format to something - * like il!host or tcp!host or host. - */ - if(strcmp(p, "$auth")==0){ - if(authserver == nil) - return -1; - strecpy(buf, buf+sizeof buf, authserver); - nf = getfields(buf, f, nelem(f), 0, "!"); - switch(nf){ - default: - return -1; - case 1: - p = f[0]; - break; - case 2: - case 3: - p = f[1]; - break; - } - } - fd = dial(netmkaddr(p, "tcp", "5356"), 0, 0, 0); - if(fd >= 0) - return fd; - return -1; -} - -int -havesecstore(char *addr, char *owner) -{ - int m, n, fd; - uchar buf[500]; - - n = snprint((char*)buf, sizeof buf, testmess, owner); - hnputs(buf, 0x8000+n-2); - - fd = secdial(addr); - if(fd < 0) - return 0; - if(write(fd, buf, n) != n || readn(fd, buf, 2) != 2){ - close(fd); - return 0; - } - n = ((buf[0]&0x7f)<<8) + buf[1]; - if(n+1 > sizeof buf){ - werrstr("implausibly large count %d", n); - close(fd); - return 0; - } - m = readn(fd, buf, n); - close(fd); - if(m != n){ - if(m >= 0) - werrstr("short read from secstore"); - return 0; - } - buf[n] = 0; - if(strcmp((char*)buf, "!account expired") == 0){ - werrstr("account expired"); - return 0; - } - return strcmp((char*)buf, "!account exists") == 0; -} - -// delimited, authenticated, encrypted connection -enum{ Maxmsg=4096 }; // messages > Maxmsg bytes are truncated -typedef struct SConn SConn; - -extern SConn* newSConn(int); // arg is open file descriptor -struct SConn{ - void *chan; - int secretlen; - int (*secret)(SConn*, uchar*, int);// - int (*read)(SConn*, uchar*, int); // <0 if error; errmess in buffer - int (*write)(SConn*, uchar*, int); - void (*free)(SConn*); // also closes file descriptor -}; -// secret(s,b,dir) sets secret for digest, encrypt, using the secretlen -// bytes in b to form keys for the two directions; -// set dir=0 in client, dir=1 in server - -// error convention: write !message in-band -#define readstr secstore_readstr -static void writerr(SConn*, char*); -static int readstr(SConn*, char*); // call with buf of size Maxmsg+1 - // returns -1 upon error, with error message in buf - -typedef struct ConnState { - uchar secret[SHA1dlen]; - ulong seqno; - RC4state rc4; -} ConnState; - -typedef struct SS{ - int fd; // file descriptor for read/write of encrypted data - int alg; // if nonzero, "alg sha rc4_128" - ConnState in, out; -} SS; - -static int -SC_secret(SConn *conn, uchar *sigma, int direction) -{ - SS *ss = (SS*)(conn->chan); - int nsigma = conn->secretlen; - - if(direction != 0){ - hmac_sha1(sigma, nsigma, (uchar*)"one", 3, ss->out.secret, nil); - hmac_sha1(sigma, nsigma, (uchar*)"two", 3, ss->in.secret, nil); - }else{ - hmac_sha1(sigma, nsigma, (uchar*)"two", 3, ss->out.secret, nil); - hmac_sha1(sigma, nsigma, (uchar*)"one", 3, ss->in.secret, nil); - } - setupRC4state(&ss->in.rc4, ss->in.secret, 16); // restrict to 128 bits - setupRC4state(&ss->out.rc4, ss->out.secret, 16); - ss->alg = 1; - return 0; -} - -static void -hash(uchar secret[SHA1dlen], uchar *data, int len, int seqno, uchar d[SHA1dlen]) -{ - DigestState sha; - uchar seq[4]; - - seq[0] = seqno>>24; - seq[1] = seqno>>16; - seq[2] = seqno>>8; - seq[3] = seqno; - memset(&sha, 0, sizeof sha); - sha1(secret, SHA1dlen, nil, &sha); - sha1(data, len, nil, &sha); - sha1(seq, 4, d, &sha); -} - -static int -verify(uchar secret[SHA1dlen], uchar *data, int len, int seqno, uchar d[SHA1dlen]) -{ - DigestState sha; - uchar seq[4]; - uchar digest[SHA1dlen]; - - seq[0] = seqno>>24; - seq[1] = seqno>>16; - seq[2] = seqno>>8; - seq[3] = seqno; - memset(&sha, 0, sizeof sha); - sha1(secret, SHA1dlen, nil, &sha); - sha1(data, len, nil, &sha); - sha1(seq, 4, digest, &sha); - return memcmp(d, digest, SHA1dlen); -} - -static int -SC_read(SConn *conn, uchar *buf, int n) -{ - SS *ss = (SS*)(conn->chan); - uchar count[2], digest[SHA1dlen]; - int len, nr; - - if(read(ss->fd, count, 2) != 2 || (count[0]&0x80) == 0){ - werrstr("!SC_read invalid count"); - return -1; - } - len = (count[0]&0x7f)<<8 | count[1]; // SSL-style count; no pad - if(ss->alg){ - len -= SHA1dlen; - if(len <= 0 || readn(ss->fd, digest, SHA1dlen) != SHA1dlen){ - werrstr("!SC_read missing sha1"); - return -1; - } - if(len > n || readn(ss->fd, buf, len) != len){ - werrstr("!SC_read missing data"); - return -1; - } - rc4(&ss->in.rc4, digest, SHA1dlen); - rc4(&ss->in.rc4, buf, len); - if(verify(ss->in.secret, buf, len, ss->in.seqno, digest) != 0){ - werrstr("!SC_read integrity check failed"); - return -1; - } - }else{ - if(len <= 0 || len > n){ - werrstr("!SC_read implausible record length"); - return -1; - } - if( (nr = readn(ss->fd, buf, len)) != len){ - werrstr("!SC_read expected %d bytes, but got %d", len, nr); - return -1; - } - } - ss->in.seqno++; - return len; -} - -static int -SC_write(SConn *conn, uchar *buf, int n) -{ - SS *ss = (SS*)(conn->chan); - uchar count[2], digest[SHA1dlen]; - int len; - - if(n <= 0 || n > Maxmsg+1){ - werrstr("!SC_write invalid n %d", n); - return -1; - } - len = n; - if(ss->alg) - len += SHA1dlen; - count[0] = 0x80 | len>>8; - count[1] = len; - if(write(ss->fd, count, 2) != 2){ - werrstr("!SC_write invalid count"); - return -1; - } - if(ss->alg){ - hash(ss->out.secret, buf, n, ss->out.seqno, digest); - rc4(&ss->out.rc4, digest, SHA1dlen); - rc4(&ss->out.rc4, buf, n); - if(write(ss->fd, digest, SHA1dlen) != SHA1dlen || - write(ss->fd, buf, n) != n){ - werrstr("!SC_write error on send"); - return -1; - } - }else{ - if(write(ss->fd, buf, n) != n){ - werrstr("!SC_write error on send"); - return -1; - } - } - ss->out.seqno++; - return n; -} - -static void -SC_free(SConn *conn) -{ - SS *ss = (SS*)(conn->chan); - - close(ss->fd); - free(ss); - free(conn); -} - -SConn* -newSConn(int fd) -{ - SS *ss; - SConn *conn; - - if(fd < 0) - return nil; - ss = (SS*)emalloc(sizeof(*ss)); - conn = (SConn*)emalloc(sizeof(*conn)); - ss->fd = fd; - ss->alg = 0; - conn->chan = (void*)ss; - conn->secretlen = SHA1dlen; - conn->free = SC_free; - conn->secret = SC_secret; - conn->read = SC_read; - conn->write = SC_write; - return conn; -} - -static void -writerr(SConn *conn, char *s) -{ - char buf[Maxmsg]; - - snprint(buf, Maxmsg, "!%s", s); - conn->write(conn, (uchar*)buf, strlen(buf)); -} - -static int -readstr(SConn *conn, char *s) -{ - int n; - - n = conn->read(conn, (uchar*)s, Maxmsg); - if(n >= 0){ - s[n] = 0; - if(s[0] == '!'){ - memmove(s, s+1, n); - n = -1; - } - }else{ - strcpy(s, "read error"); - } - return n; -} - -static char* -getfile(SConn *conn, uchar *key, int nkey) -{ - char *buf; - int nbuf, n, nr, len; - char s[Maxmsg+1], *gf; - uchar skey[SHA1dlen], ib[Maxmsg+CHK], *ibr, *ibw; - AESstate aes; - DigestState *sha; - - gf = "factotum"; - memset(&aes, 0, sizeof aes); - - snprint(s, Maxmsg, "GET %s\n", gf); - conn->write(conn, (uchar*)s, strlen(s)); - - /* get file size */ - s[0] = '\0'; - if(readstr(conn, s) < 0){ - werrstr("secstore: %r"); - return nil; - } - if((len = atoi(s)) < 0){ - werrstr("secstore: remote file %s does not exist", gf); - return nil; - }else if(len > MAXFILESIZE){//assert - werrstr("secstore: implausible file size %d for %s", len, gf); - return nil; - } - - ibr = ibw = ib; - buf = nil; - nbuf = 0; - for(nr=0; nr < len;){ - if((n = conn->read(conn, ibw, Maxmsg)) <= 0){ - werrstr("secstore: empty file chunk n=%d nr=%d len=%d: %r", n, nr, len); - return nil; - } - nr += n; - ibw += n; - if(!aes.setup){ /* first time, read 16 byte IV */ - if(n < 16){ - werrstr("secstore: no IV in file"); - return nil; - } - sha = sha1((uchar*)"aescbc file", 11, nil, nil); - sha1(key, nkey, skey, sha); - setupAESstate(&aes, skey, AESbsize, ibr); - memset(skey, 0, sizeof skey); - ibr += AESbsize; - n -= AESbsize; - } - aesCBCdecrypt(ibw-n, n, &aes); - n = ibw-ibr-CHK; - if(n > 0){ - buf = realloc(buf, nbuf+n+1); - if(buf == nil) - sysfatal("out of memory"); - memmove(buf+nbuf, ibr, n); - nbuf += n; - ibr += n; - } - memmove(ib, ibr, ibw-ibr); - ibw = ib + (ibw-ibr); - ibr = ib; - } - n = ibw-ibr; - if((n != CHK) || (memcmp(ib, "XXXXXXXXXXXXXXXX", CHK) != 0)){ - werrstr("secstore: decrypted file failed to authenticate!"); - free(buf); - return nil; - } - if(nbuf == 0){ - werrstr("secstore got empty file"); - return nil; - } - buf[nbuf] = '\0'; - return buf; -} - -static char VERSION[] = "secstore"; - -typedef struct PAKparams{ - mpint *q, *p, *r, *g; -} PAKparams; - -static PAKparams *pak; - -// This group was generated by the seed EB7B6E35F7CD37B511D96C67D6688CC4DD440E1E. -static void -initPAKparams(void) -{ - if(pak) - return; - pak = (PAKparams*)emalloc(sizeof(*pak)); - pak->q = strtomp("E0F0EF284E10796C5A2A511E94748BA03C795C13", nil, 16, nil); - pak->p = strtomp("C41CFBE4D4846F67A3DF7DE9921A49D3B42DC33728427AB159CEC8CBBD" - "B12B5F0C244F1A734AEB9840804EA3C25036AD1B61AFF3ABBC247CD4B384224567A86" - "3A6F020E7EE9795554BCD08ABAD7321AF27E1E92E3DB1C6E7E94FAAE590AE9C48F96D9" - "3D178E809401ABE8A534A1EC44359733475A36A70C7B425125062B1142D", nil, 16, nil); - pak->r = strtomp("DF310F4E54A5FEC5D86D3E14863921E834113E060F90052AD332B3241CEF" - "2497EFA0303D6344F7C819691A0F9C4A773815AF8EAECFB7EC1D98F039F17A32A7E887" - "D97251A927D093F44A55577F4D70444AEBD06B9B45695EC23962B175F266895C67D21" - "C4656848614D888A4", nil, 16, nil); - pak->g = strtomp("2F1C308DC46B9A44B52DF7DACCE1208CCEF72F69C743ADD4D2327173444" - "ED6E65E074694246E07F9FD4AE26E0FDDD9F54F813C40CB9BCD4338EA6F242AB94CD41" - "0E676C290368A16B1A3594877437E516C53A6EEE5493A038A017E955E218E7819734E3E" - "2A6E0BAE08B14258F8C03CC1B30E0DDADFCF7CEDF0727684D3D255F1", nil, 16, nil); -} - -// H = (sha(ver,C,sha(passphrase)))^r mod p, -// a hash function expensive to attack by brute force. -static void -longhash(char *ver, char *C, uchar *passwd, mpint *H) -{ - uchar *Cp; - int i, n, nver, nC; - uchar buf[140], key[1]; - - nver = strlen(ver); - nC = strlen(C); - n = nver + nC + SHA1dlen; - Cp = (uchar*)emalloc(n); - memmove(Cp, ver, nver); - memmove(Cp+nver, C, nC); - memmove(Cp+nver+nC, passwd, SHA1dlen); - for(i = 0; i < 7; i++){ - key[0] = 'A'+i; - hmac_sha1(Cp, n, key, sizeof key, buf+i*SHA1dlen, nil); - } - memset(Cp, 0, n); - free(Cp); - betomp(buf, sizeof buf, H); - mpmod(H, pak->p, H); - mpexp(H, pak->r, pak->p, H); -} - -// Hi = H^-1 mod p -static char * -PAK_Hi(char *C, char *passphrase, mpint *H, mpint *Hi) -{ - uchar passhash[SHA1dlen]; - - sha1((uchar *)passphrase, strlen(passphrase), passhash, nil); - initPAKparams(); - longhash(VERSION, C, passhash, H); - mpinvert(H, pak->p, Hi); - return mptoa(Hi, 64, nil, 0); -} - -// another, faster, hash function for each party to -// confirm that the other has the right secrets. -static void -shorthash(char *mess, char *C, char *S, char *m, char *mu, char *sigma, char *Hi, uchar *digest) -{ - SHA1state *state; - - state = sha1((uchar*)mess, strlen(mess), 0, 0); - state = sha1((uchar*)C, strlen(C), 0, state); - state = sha1((uchar*)S, strlen(S), 0, state); - state = sha1((uchar*)m, strlen(m), 0, state); - state = sha1((uchar*)mu, strlen(mu), 0, state); - state = sha1((uchar*)sigma, strlen(sigma), 0, state); - state = sha1((uchar*)Hi, strlen(Hi), 0, state); - state = sha1((uchar*)mess, strlen(mess), 0, state); - state = sha1((uchar*)C, strlen(C), 0, state); - state = sha1((uchar*)S, strlen(S), 0, state); - state = sha1((uchar*)m, strlen(m), 0, state); - state = sha1((uchar*)mu, strlen(mu), 0, state); - state = sha1((uchar*)sigma, strlen(sigma), 0, state); - sha1((uchar*)Hi, strlen(Hi), digest, state); -} - -// On input, conn provides an open channel to the server; -// C is the name this client calls itself; -// pass is the user's passphrase -// On output, session secret has been set in conn -// (unless return code is negative, which means failure). -// If pS is not nil, it is set to the (alloc'd) name the server calls itself. -static int -PAKclient(SConn *conn, char *C, char *pass, char **pS) -{ - char *mess, *mess2, *eol, *S, *hexmu, *ks, *hexm, *hexsigma = nil, *hexHi; - char kc[2*SHA1dlen+1]; - uchar digest[SHA1dlen]; - int rc = -1, n; - mpint *x, *m = mpnew(0), *mu = mpnew(0), *sigma = mpnew(0); - mpint *H = mpnew(0), *Hi = mpnew(0); - - hexHi = PAK_Hi(C, pass, H, Hi); - - // random 1<=x<=q-1; send C, m=g**x H - x = mprand(164, genrandom, nil); - mpmod(x, pak->q, x); - if(mpcmp(x, mpzero) == 0) - mpassign(mpone, x); - mpexp(pak->g, x, pak->p, m); - mpmul(m, H, m); - mpmod(m, pak->p, m); - hexm = mptoa(m, 64, nil, 0); - mess = (char*)emalloc(2*Maxmsg+2); - mess2 = mess+Maxmsg+1; - snprint(mess, Maxmsg, "%s\tPAK\nC=%s\nm=%s\n", VERSION, C, hexm); - conn->write(conn, (uchar*)mess, strlen(mess)); - - // recv g**y, S, check hash1(g**xy) - if(readstr(conn, mess) < 0){ - fprint(2, "error: %s\n", mess); - writerr(conn, "couldn't read g**y"); - goto done; - } - eol = strchr(mess, '\n'); - if(strncmp("mu=", mess, 3) != 0 || !eol || strncmp("\nk=", eol, 3) != 0){ - writerr(conn, "verifier syntax error"); - goto done; - } - hexmu = mess+3; - *eol = 0; - ks = eol+3; - eol = strchr(ks, '\n'); - if(!eol || strncmp("\nS=", eol, 3) != 0){ - writerr(conn, "verifier syntax error for secstore 1.0"); - goto done; - } - *eol = 0; - S = eol+3; - eol = strchr(S, '\n'); - if(!eol){ - writerr(conn, "verifier syntax error for secstore 1.0"); - goto done; - } - *eol = 0; - if(pS) - *pS = strdup(S); - strtomp(hexmu, nil, 64, mu); - mpexp(mu, x, pak->p, sigma); - hexsigma = mptoa(sigma, 64, nil, 0); - shorthash("server", C, S, hexm, hexmu, hexsigma, hexHi, digest); - enc64(kc, sizeof kc, digest, SHA1dlen); - if(strcmp(ks, kc) != 0){ - writerr(conn, "verifier didn't match"); - goto done; - } - - // send hash2(g**xy) - shorthash("client", C, S, hexm, hexmu, hexsigma, hexHi, digest); - enc64(kc, sizeof kc, digest, SHA1dlen); - snprint(mess2, Maxmsg, "k'=%s\n", kc); - conn->write(conn, (uchar*)mess2, strlen(mess2)); - - // set session key - shorthash("session", C, S, hexm, hexmu, hexsigma, hexHi, digest); - memset(hexsigma, 0, strlen(hexsigma)); - n = conn->secret(conn, digest, 0); - memset(digest, 0, SHA1dlen); - if(n < 0){//assert - writerr(conn, "can't set secret"); - goto done; - } - - rc = 0; -done: - mpfree(x); - mpfree(sigma); - mpfree(mu); - mpfree(m); - mpfree(Hi); - mpfree(H); - free(hexsigma); - free(hexHi); - free(hexm); - free(mess); - return rc; -} - -char* -secstorefetch(char *addr, char *owner, char *password) -{ - int fd; - char *rv; - char s[Maxmsg+1], bye[10]; - SConn *conn; - char *pass, *sta; - - sta = nil; - conn = nil; - rv = nil; - if(password != nil && *password) - pass = strdup(password); - else - pass = readcons("secstore password", nil, 1); - if(pass==nil || strlen(pass)==0){ - werrstr("cancel"); - goto Out; - } - if((fd = secdial(addr)) < 0) - goto Out; - if((conn = newSConn(fd)) == nil) - goto Out; - if(PAKclient(conn, owner, pass, nil) < 0){ - werrstr("password mistyped?"); - goto Out; - } - if(readstr(conn, s) < 0) - goto Out; - if(strcmp(s, "STA") == 0){ - sta = readcons("STA PIN+SecureID", nil, 1); - if(sta==nil || strlen(sta)==0){ - werrstr("cancel"); - goto Out; - } - if(strlen(sta) >= sizeof s - 3){ - werrstr("STA response too long"); - goto Out; - } - strcpy(s+3, sta); - conn->write(conn, (uchar*)s, strlen(s)); - readstr(conn, s); - } - if(strcmp(s, "OK") !=0){ - werrstr("%s", s); - goto Out; - } - if((rv = getfile(conn, (uchar*)pass, strlen(pass))) == nil) - goto Out; - strcpy(bye, "BYE"); - conn->write(conn, (uchar*)bye, 3); - -Out: - if(conn) - conn->free(conn); - if(pass) - free(pass); - if(sta) - free(sta); - return rv; -} - diff --git a/sys/src/cmd/unix/drawterm/win32-386/Makefile b/sys/src/cmd/unix/drawterm/win32-386/Makefile deleted file mode 100644 index 30328f418..000000000 --- a/sys/src/cmd/unix/drawterm/win32-386/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -ROOT=.. -include ../Make.config -LIB=../libmachdep.a - -OFILES=\ - getcallerpc.$O\ - md5block.$O\ - sha1block.$O\ - tas.$O - -default: $(LIB) -$(LIB): $(OFILES) - $(AR) r $(LIB) $(OFILES) - $(RANLIB) $(LIB) - -%.$O: %.c - $(CC) $(CFLAGS) $*.c - -%.$O: %.s - $(AS) -o $*.$O $*.s - -%.s: %.spp - cpp $*.spp >$*.s - - diff --git a/sys/src/cmd/unix/drawterm/win32-386/getcallerpc.c b/sys/src/cmd/unix/drawterm/win32-386/getcallerpc.c deleted file mode 100644 index 3614c593c..000000000 --- a/sys/src/cmd/unix/drawterm/win32-386/getcallerpc.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "u.h" -#include "libc.h" - -uintptr -getcallerpc(void *a) -{ - return ((uintptr*)a)[-1]; -} diff --git a/sys/src/cmd/unix/drawterm/win32-386/md5block.spp b/sys/src/cmd/unix/drawterm/win32-386/md5block.spp deleted file mode 100644 index c7be66b6c..000000000 --- a/sys/src/cmd/unix/drawterm/win32-386/md5block.spp +++ /dev/null @@ -1,255 +0,0 @@ -/* - * rfc1321 requires that I include this. The code is new. The constants - * all come from the rfc (hence the copyright). We trade a table for the - * macros in rfc. The total size is a lot less. -- presotto - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software forany particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * These notices must be retained in any copies of any part of this - * documentation and/or software. - */ -#define S11 7 -#define S12 12 -#define S13 17 -#define S14 22 - -#define S21 5 -#define S22 9 -#define S23 14 -#define S24 20 - -#define S31 4 -#define S32 11 -#define S33 16 -#define S34 23 - -#define S41 6 -#define S42 10 -#define S43 15 -#define S44 21 - -#define PAYME(x) $ ## x - -/* - * SI is data - * a += FN(B,C,D); - * a += x[sh] + t[sh]; - * a = (a << S11) | (a >> (32 - S11)); - * a += b; - */ - -#define BODY1(off,V,FN,SH,A,B,C,D)\ - FN(B,C,D)\ - leal V(A, %edi, 1), A;\ - addl off(%ebp), A;\ - roll PAYME(SH), A;\ - addl B, A;\ - -#define BODY(off,V,FN,SH,A,B,C,D)\ - FN(B,C,D)\ - leal V(A, %edi, 1), A;\ - addl (off)(%ebp), A;\ - roll PAYME(SH), A;\ - addl B,A;\ - -/* - * fn1 = ((c ^ d) & b) ^ d - */ -#define FN1(B,C,D)\ - movl C, %edi;\ - xorl D, %edi;\ - andl B, %edi;\ - xorl D, %edi;\ - -/* - * fn2 = ((b ^ c) & d) ^ c; - */ -#define FN2(B,C,D)\ - movl B, %edi;\ - xorl C, %edi;\ - andl D, %edi;\ - xorl C, %edi;\ - -/* - * fn3 = b ^ c ^ d; - */ -#define FN3(B,C,D)\ - movl B, %edi;\ - xorl C, %edi;\ - xorl D, %edi;\ - -/* - * fn4 = c ^ (b | ~d); - */ -#define FN4(B,C,D)\ - movl D, %edi;\ - xorl $-1, %edi;\ - orl B, %edi;\ - xorl C, %edi;\ - -#define STACKSIZE 20 - -#define DATA (STACKSIZE+8) -#define LEN (STACKSIZE+12) -#define STATE (STACKSIZE+16) - -#define EDATA (STACKSIZE-4) -#define OLDEBX (STACKSIZE-8) -#define OLDESI (STACKSIZE-12) -#define OLDEDI (STACKSIZE-16) - - .text - - .p2align 2,0x90 - .globl ___md5block - ___md5block: - - .p2align 2,0x90 - .globl __md5block - __md5block: - - .p2align 2,0x90 - .globl _md5block - _md5block: - - .p2align 2,0x90 - .globl md5block - md5block: - - /* Prelude */ - pushl %ebp - subl $(STACKSIZE), %esp - movl %ebx, OLDEBX(%esp) - movl %esi, OLDESI(%esp) - movl %edi, OLDEDI(%esp) - - movl DATA(%esp), %eax - addl LEN(%esp), %eax - movl %eax, EDATA(%esp) - - movl DATA(%esp), %ebp - -0: - movl STATE(%esp), %esi - movl (%esi), %eax - movl 4(%esi), %ebx - movl 8(%esi), %ecx - movl 12(%esi), %edx - - BODY1( 0*4,0xd76aa478,FN1,S11,%eax,%ebx,%ecx,%edx) - BODY1( 1*4,0xe8c7b756,FN1,S12,%edx,%eax,%ebx,%ecx) - BODY1( 2*4,0x242070db,FN1,S13,%ecx,%edx,%eax,%ebx) - BODY1( 3*4,0xc1bdceee,FN1,S14,%ebx,%ecx,%edx,%eax) - - BODY1( 4*4,0xf57c0faf,FN1,S11,%eax,%ebx,%ecx,%edx) - BODY1( 5*4,0x4787c62a,FN1,S12,%edx,%eax,%ebx,%ecx) - BODY1( 6*4,0xa8304613,FN1,S13,%ecx,%edx,%eax,%ebx) - BODY1( 7*4,0xfd469501,FN1,S14,%ebx,%ecx,%edx,%eax) - - BODY1( 8*4,0x698098d8,FN1,S11,%eax,%ebx,%ecx,%edx) - BODY1( 9*4,0x8b44f7af,FN1,S12,%edx,%eax,%ebx,%ecx) - BODY1(10*4,0xffff5bb1,FN1,S13,%ecx,%edx,%eax,%ebx) - BODY1(11*4,0x895cd7be,FN1,S14,%ebx,%ecx,%edx,%eax) - - BODY1(12*4,0x6b901122,FN1,S11,%eax,%ebx,%ecx,%edx) - BODY1(13*4,0xfd987193,FN1,S12,%edx,%eax,%ebx,%ecx) - BODY1(14*4,0xa679438e,FN1,S13,%ecx,%edx,%eax,%ebx) - BODY1(15*4,0x49b40821,FN1,S14,%ebx,%ecx,%edx,%eax) - - - BODY( 1*4,0xf61e2562,FN2,S21,%eax,%ebx,%ecx,%edx) - BODY( 6*4,0xc040b340,FN2,S22,%edx,%eax,%ebx,%ecx) - BODY(11*4,0x265e5a51,FN2,S23,%ecx,%edx,%eax,%ebx) - BODY( 0*4,0xe9b6c7aa,FN2,S24,%ebx,%ecx,%edx,%eax) - - BODY( 5*4,0xd62f105d,FN2,S21,%eax,%ebx,%ecx,%edx) - BODY(10*4,0x02441453,FN2,S22,%edx,%eax,%ebx,%ecx) - BODY(15*4,0xd8a1e681,FN2,S23,%ecx,%edx,%eax,%ebx) - BODY( 4*4,0xe7d3fbc8,FN2,S24,%ebx,%ecx,%edx,%eax) - - BODY( 9*4,0x21e1cde6,FN2,S21,%eax,%ebx,%ecx,%edx) - BODY(14*4,0xc33707d6,FN2,S22,%edx,%eax,%ebx,%ecx) - BODY( 3*4,0xf4d50d87,FN2,S23,%ecx,%edx,%eax,%ebx) - BODY( 8*4,0x455a14ed,FN2,S24,%ebx,%ecx,%edx,%eax) - - BODY(13*4,0xa9e3e905,FN2,S21,%eax,%ebx,%ecx,%edx) - BODY( 2*4,0xfcefa3f8,FN2,S22,%edx,%eax,%ebx,%ecx) - BODY( 7*4,0x676f02d9,FN2,S23,%ecx,%edx,%eax,%ebx) - BODY(12*4,0x8d2a4c8a,FN2,S24,%ebx,%ecx,%edx,%eax) - - - BODY( 5*4,0xfffa3942,FN3,S31,%eax,%ebx,%ecx,%edx) - BODY( 8*4,0x8771f681,FN3,S32,%edx,%eax,%ebx,%ecx) - BODY(11*4,0x6d9d6122,FN3,S33,%ecx,%edx,%eax,%ebx) - BODY(14*4,0xfde5380c,FN3,S34,%ebx,%ecx,%edx,%eax) - - BODY( 1*4,0xa4beea44,FN3,S31,%eax,%ebx,%ecx,%edx) - BODY( 4*4,0x4bdecfa9,FN3,S32,%edx,%eax,%ebx,%ecx) - BODY( 7*4,0xf6bb4b60,FN3,S33,%ecx,%edx,%eax,%ebx) - BODY(10*4,0xbebfbc70,FN3,S34,%ebx,%ecx,%edx,%eax) - - BODY(13*4,0x289b7ec6,FN3,S31,%eax,%ebx,%ecx,%edx) - BODY( 0*4,0xeaa127fa,FN3,S32,%edx,%eax,%ebx,%ecx) - BODY( 3*4,0xd4ef3085,FN3,S33,%ecx,%edx,%eax,%ebx) - BODY( 6*4,0x04881d05,FN3,S34,%ebx,%ecx,%edx,%eax) - - BODY( 9*4,0xd9d4d039,FN3,S31,%eax,%ebx,%ecx,%edx) - BODY(12*4,0xe6db99e5,FN3,S32,%edx,%eax,%ebx,%ecx) - BODY(15*4,0x1fa27cf8,FN3,S33,%ecx,%edx,%eax,%ebx) - BODY( 2*4,0xc4ac5665,FN3,S34,%ebx,%ecx,%edx,%eax) - - - BODY( 0*4,0xf4292244,FN4,S41,%eax,%ebx,%ecx,%edx) - BODY( 7*4,0x432aff97,FN4,S42,%edx,%eax,%ebx,%ecx) - BODY(14*4,0xab9423a7,FN4,S43,%ecx,%edx,%eax,%ebx) - BODY( 5*4,0xfc93a039,FN4,S44,%ebx,%ecx,%edx,%eax) - - BODY(12*4,0x655b59c3,FN4,S41,%eax,%ebx,%ecx,%edx) - BODY( 3*4,0x8f0ccc92,FN4,S42,%edx,%eax,%ebx,%ecx) - BODY(10*4,0xffeff47d,FN4,S43,%ecx,%edx,%eax,%ebx) - BODY( 1*4,0x85845dd1,FN4,S44,%ebx,%ecx,%edx,%eax) - - BODY( 8*4,0x6fa87e4f,FN4,S41,%eax,%ebx,%ecx,%edx) - BODY(15*4,0xfe2ce6e0,FN4,S42,%edx,%eax,%ebx,%ecx) - BODY( 6*4,0xa3014314,FN4,S43,%ecx,%edx,%eax,%ebx) - BODY(13*4,0x4e0811a1,FN4,S44,%ebx,%ecx,%edx,%eax) - - BODY( 4*4,0xf7537e82,FN4,S41,%eax,%ebx,%ecx,%edx) - BODY(11*4,0xbd3af235,FN4,S42,%edx,%eax,%ebx,%ecx) - BODY( 2*4,0x2ad7d2bb,FN4,S43,%ecx,%edx,%eax,%ebx) - BODY( 9*4,0xeb86d391,FN4,S44,%ebx,%ecx,%edx,%eax) - - addl $(16*4), %ebp - movl STATE(%esp), %edi - addl %eax,0(%edi) - addl %ebx,4(%edi) - addl %ecx,8(%edi) - addl %edx,12(%edi) - - movl EDATA(%esp), %edi - cmpl %edi, %ebp - jb 0b - - /* Postlude */ - movl OLDEBX(%esp), %ebx - movl OLDESI(%esp), %esi - movl OLDEDI(%esp), %edi - addl $(STACKSIZE), %esp - popl %ebp - ret - diff --git a/sys/src/cmd/unix/drawterm/win32-386/sha1block.spp b/sys/src/cmd/unix/drawterm/win32-386/sha1block.spp deleted file mode 100644 index 26a4984ed..000000000 --- a/sys/src/cmd/unix/drawterm/win32-386/sha1block.spp +++ /dev/null @@ -1,231 +0,0 @@ -.text - -.p2align 2,0x90 -.globl ___sha1block -___sha1block: - jmp sha1block - -.p2align 2,0x90 -.globl __sha1block -__sha1block: - jmp sha1block - -.p2align 2,0x90 -.globl _sha1block -_sha1block: - jmp sha1block - -.p2align 2,0x90 -.globl sha1block -sha1block: - -/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; - * wp[off] = x; - * x += A <<< 5; - * E += 0xca62c1d6 + x; - * x = FN(B,C,D); - * E += x; - * B >>> 2 - */ -#define BSWAPDI BYTE $0x0f; BYTE $0xcf; - -#define BODY(off,FN,V,A,B,C,D,E)\ - movl (off-64)(%ebp), %edi;\ - xorl (off-56)(%ebp), %edi;\ - xorl (off-32)(%ebp), %edi;\ - xorl (off-12)(%ebp), %edi;\ - roll $1, %edi;\ - movl %edi, off(%ebp);\ - leal V(%edi, E, 1), E;\ - movl A, %edi;\ - roll $5, %edi;\ - addl %edi, E;\ - FN(B,C,D)\ - addl %edi, E;\ - rorl $2, B;\ - -#define BODY0(off,FN,V,A,B,C,D,E)\ - movl off(%ebx), %edi;\ - bswap %edi;\ - movl %edi, off(%ebp);\ - leal V(%edi,E,1), E;\ - movl A, %edi;\ - roll $5,%edi;\ - addl %edi,E;\ - FN(B,C,D)\ - addl %edi,E;\ - rorl $2,B;\ - -/* - * fn1 = (((C^D)&B)^D); - */ -#define FN1(B,C,D)\ - movl C, %edi;\ - xorl D, %edi;\ - andl B, %edi;\ - xorl D, %edi;\ - -/* - * fn24 = B ^ C ^ D - */ -#define FN24(B,C,D)\ - movl B, %edi;\ - xorl C, %edi;\ - xorl D, %edi;\ - -/* - * fn3 = ((B ^ C) & (D ^= B)) ^ B - * D ^= B to restore D - */ -#define FN3(B,C,D)\ - movl B, %edi;\ - xorl C, %edi;\ - xorl B, D;\ - andl D, %edi;\ - xorl B, %edi;\ - xorl B, D;\ - -/* - * stack offsets - * void sha1block(uchar *DATA, int LEN, ulong *STATE) - */ -#define STACKSIZE (48+80*4) -#define DATA (STACKSIZE+8) -#define LEN (STACKSIZE+12) -#define STATE (STACKSIZE+16) - -/* - * stack offsets for locals - * ulong w[80]; - * uchar *edata; - * ulong *w15, *w40, *w60, *w80; - * register local - * ulong *wp = %ebp - * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi - * ulong tmp = edi - */ -#define WARRAY (STACKSIZE-4-(80*4)) -#define TMP1 (STACKSIZE-8-(80*4)) -#define TMP2 (STACKSIZE-12-(80*4)) -#define W15 (STACKSIZE-16-(80*4)) -#define W40 (STACKSIZE-20-(80*4)) -#define W60 (STACKSIZE-24-(80*4)) -#define W80 (STACKSIZE-28-(80*4)) -#define EDATA (STACKSIZE-32-(80*4)) -#define OLDEBX (STACKSIZE-36-(80*4)) -#define OLDESI (STACKSIZE-40-(80*4)) -#define OLDEDI (STACKSIZE-44-(80*4)) - - /* Prelude */ - pushl %ebp - subl $(STACKSIZE), %esp - - mov %ebx, OLDEBX(%esp) - mov %esi, OLDESI(%esp) - mov %edi, OLDEDI(%esp) - - movl DATA(%esp), %eax - addl LEN(%esp), %eax - movl %eax, EDATA(%esp) - - leal (WARRAY+15*4)(%esp), %edi /* aw15 */ - movl %edi, W15(%esp) - leal (WARRAY+40*4)(%esp), %edx /* aw40 */ - movl %edx, W40(%esp) - leal (WARRAY+60*4)(%esp), %ecx /* aw60 */ - movl %ecx, W60(%esp) - leal (WARRAY+80*4)(%esp), %edi /* aw80 */ - movl %edi, W80(%esp) - -0: - leal WARRAY(%esp), %ebp /* warray */ - - movl STATE(%esp), %edi /* state */ - movl (%edi),%eax - movl 4(%edi),%ebx - movl %ebx, TMP1(%esp) /* tmp1 */ - movl 8(%edi), %ecx - movl 12(%edi), %edx - movl 16(%edi), %esi - - movl DATA(%esp), %ebx /* data */ - -1: - BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) - movl %esi,TMP2(%esp) - BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx) - movl TMP1(%esp),%esi - BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx) - BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi) - movl %esi,TMP1(%esp) - BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax) - movl TMP2(%esp),%esi - - addl $20, %ebx - addl $20, %ebp - cmpl W15(%esp), %ebp /* w15 */ - jb 1b - - BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi) - addl $4, %ebx - MOVL %ebx, DATA(%esp) /* data */ - MOVL TMP1(%esp),%ebx - - BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx) - BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx) - BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx) - BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax) - - addl $20, %ebp - -2: - BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi) - BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx) - BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx) - BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx) - BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax) - - addl $20,%ebp - cmpl W40(%esp), %ebp - jb 2b - -3: - BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi) - BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx) - BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx) - BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx) - BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax) - - addl $20, %ebp - cmpl W60(%esp), %ebp /* w60 */ - jb 3b - -4: - BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi) - BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx) - BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx) - BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx) - BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax) - - addl $20, %ebp - cmpl W80(%esp), %ebp /* w80 */ - jb 4b - - movl STATE(%esp), %edi /* state */ - addl %eax, 0(%edi) - addl %ebx, 4(%edi) - addl %ecx, 8(%edi) - addl %edx, 12(%edi) - addl %esi, 16(%edi) - - movl EDATA(%esp), %edi /* edata */ - cmpl %edi, DATA(%esp) /* data */ - jb 0b - - /* Postlude */ - mov OLDEBX(%esp), %ebx - mov OLDESI(%esp), %esi - mov OLDEDI(%esp), %edi - addl $(STACKSIZE), %esp - popl %ebp - ret diff --git a/sys/src/cmd/unix/drawterm/win32-386/tas.c b/sys/src/cmd/unix/drawterm/win32-386/tas.c deleted file mode 100644 index 8a907d8dc..000000000 --- a/sys/src/cmd/unix/drawterm/win32-386/tas.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "u.h" -#include "libc.h" - -int -tas(long *x) -{ - int v; - - __asm__( "movl $1, %%eax\n\t" - "xchgl %%eax,(%%ecx)" - : "=a" (v) - : "c" (x) - ); - switch(v) { - case 0: - case 1: - return v; - default: - print("canlock: corrupted 0x%lux\n", v); - return 1; - } -} - diff --git a/sys/src/cmd/unix/drawterm/win32-factotum.c b/sys/src/cmd/unix/drawterm/win32-factotum.c deleted file mode 100644 index 91f71b77c..000000000 --- a/sys/src/cmd/unix/drawterm/win32-factotum.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <u.h> -#include <libc.h> -#include <auth.h> -#include <fcall.h> -#include <authsrv.h> -#include <libsec.h> -#include "drawterm.h" - -#undef getenv - -char* -getuser(void) -{ - return getenv("USER"); -} - -int -dialfactotum(void) -{ - return -1; -} - |