History

a

Russ Cox committed 21 years ago

Commit 934846f1 parent 0189e66382 files · +62610 −-4Browse files

Showing the changes to include (19 of 382 files). Show all

Unified · Split

19 files
  1. include/a.out +0 −0
  2. include/auth.h +144 −0
  3. include/authsrv.h +166 −0
  4. include/cursor.h +6 −0
  5. include/draw.h +519 −0
  6. include/dtos.h +10 −0
  7. include/fcall.h +110 −0
  8. include/keyboard.h +42 −0
  9. include/lib.h +246 −0
  10. include/libc.h +3 −0
  11. include/libsec.h +340 −0
  12. include/memdraw.h +200 −0
  13. include/memlayer.h +51 −0
  14. include/mp.h +134 −0
  15. include/u.h +26 −0
  16. include/unix.h +14 −0
  17. include/user.h +65 −0
  18. include/x +0 −0
  19. include/x.c +6 −0
include/a.out+0−0

Binary file not shown.

include/auth.h+144−0
@@ -0,0 +1,144 @@
1#pragma src "/sys/src/libauth"
2#pragma lib "libauth.a"
3
4/*
5 * Interface for typical callers.
6 */
7
8typedef struct AuthInfo AuthInfo;
9typedef struct Chalstate Chalstate;
10typedef struct Chapreply Chapreply;
11typedef struct MSchapreply MSchapreply;
12typedef struct UserPasswd UserPasswd;
13typedef struct AuthRpc AuthRpc;
14
15enum
16{
17 MAXCHLEN= 256, /* max challenge length */
18 MAXNAMELEN= 256, /* maximum name length */
19 MD5LEN= 16,
20
21 ARok = 0, /* rpc return values */
22 ARdone,
23 ARerror,
24 ARneedkey,
25 ARbadkey,
26 ARwritenext,
27 ARtoosmall,
28 ARtoobig,
29 ARrpcfailure,
30 ARphase,
31
32 AuthRpcMax = 4096,
33};
34
35struct AuthRpc
36{
37 int afd;
38 char ibuf[AuthRpcMax];
39 char obuf[AuthRpcMax];
40 char *arg;
41 uint narg;
42};
43
44struct AuthInfo
45{
46 char *cuid; /* caller id */
47 char *suid; /* server id */
48 char *cap; /* capability (only valid on server side) */
49 int nsecret; /* length of secret */
50 uchar *secret; /* secret */
51};
52
53struct Chalstate
54{
55 char *user;
56 char chal[MAXCHLEN];
57 int nchal;
58 void *resp;
59 int nresp;
60
61/* for implementation only */
62 int afd; /* to factotum */
63 AuthRpc *rpc; /* to factotum */
64 char userbuf[MAXNAMELEN]; /* temp space if needed */
65 int userinchal; /* user was sent to obtain challenge */
66};
67
68struct Chapreply /* for protocol "chap" */
69{
70 uchar id;
71 char resp[MD5LEN];
72};
73
74struct MSchapreply /* for protocol "mschap" */
75{
76 char LMresp[24]; /* Lan Manager response */
77 char NTresp[24]; /* NT response */
78};
79
80struct UserPasswd
81{
82 char *user;
83 char *passwd;
84};
85
86extern int newns(char*, char*);
87extern int addns(char*, char*);
88
89extern int noworld(char*);
90extern int amount(int, char*, int, char*);
91
92/* these two may get generalized away -rsc */
93extern int login(char*, char*, char*);
94extern int httpauth(char*, char*);
95
96typedef struct Attr Attr;
97typedef struct String String;
98enum {
99 AttrNameval, /* name=val -- when matching, must have name=val */
100 AttrQuery, /* name? -- when matching, must be present */
101 AttrDefault, /* name:=val -- when matching, if present must match INTERNAL */
102};
103struct Attr
104{
105 int type;
106 Attr *next;
107 char *name;
108 char *val;
109};
110
111typedef int AuthGetkey(char*);
112
113int _attrfmt(Fmt*);
114Attr *_copyattr(Attr*);
115Attr *_delattr(Attr*, char*);
116Attr *_findattr(Attr*, char*);
117void _freeattr(Attr*);
118Attr *_mkattr(int, char*, char*, Attr*);
119Attr *_parseattr(char*);
120char *_strfindattr(Attr*, char*);
121#pragma varargck type "A" Attr*
122
123extern AuthInfo* fauth_proxy(int, AuthRpc *rpc, AuthGetkey *getkey, char *params);
124extern AuthInfo* auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...);
125extern int auth_getkey(char*);
126extern int (*amount_getkey)(char*);
127extern void auth_freeAI(AuthInfo *ai);
128extern int auth_chuid(AuthInfo *ai, char *ns);
129extern Chalstate *auth_challenge(char*, ...);
130extern AuthInfo* auth_response(Chalstate*);
131extern int auth_respond(void*, uint, char*, uint, void*, uint, AuthGetkey *getkey, char*, ...);
132extern void auth_freechal(Chalstate*);
133extern AuthInfo* auth_userpasswd(char *user, char *passwd);
134extern UserPasswd* auth_getuserpasswd(AuthGetkey *getkey, char*, ...);
135extern AuthInfo* auth_getinfo(AuthRpc *rpc);
136extern AuthRpc* auth_allocrpc(int afd);
137extern Attr* auth_attr(AuthRpc *rpc);
138extern void auth_freerpc(AuthRpc *rpc);
139extern uint auth_rpc(AuthRpc *rpc, char *verb, void *a, int n);
140extern int auth_wep(char*, char*, ...);
141#pragma varargck argpos auth_proxy 3
142#pragma varargck argpos auth_challenge 1
143#pragma varargck argpos auth_respond 3
144#pragma varargck argpos auth_getuserpasswd 2
include/authsrv.h+166−0
@@ -0,0 +1,166 @@
1#pragma src "/sys/src/libauthsrv"
2#pragma lib "libauthsrv.a"
3
4/*
5 * Interface for talking to authentication server.
6 */
7typedef struct Ticket Ticket;
8typedef struct Ticketreq Ticketreq;
9typedef struct Authenticator Authenticator;
10typedef struct Nvrsafe Nvrsafe;
11typedef struct Passwordreq Passwordreq;
12typedef struct OChapreply OChapreply;
13typedef struct OMSchapreply OMSchapreply;
14
15enum
16{
17 ANAMELEN= 28, /* maximum size of name in previous proto */
18 AERRLEN= 64, /* maximum size of errstr in previous proto */
19 DOMLEN= 48, /* length of an authentication domain name */
20 DESKEYLEN= 7, /* length of a des key for encrypt/decrypt */
21 CHALLEN= 8, /* length of a plan9 sk1 challenge */
22 NETCHLEN= 16, /* max network challenge length (used in AS protocol) */
23 CONFIGLEN= 14,
24 SECRETLEN= 32, /* max length of a secret */
25
26 KEYDBOFF= 8, /* length of random data at the start of key file */
27 OKEYDBLEN= ANAMELEN+DESKEYLEN+4+2, /* length of an entry in old key file */
28 KEYDBLEN= OKEYDBLEN+SECRETLEN, /* length of an entry in key file */
29 OMD5LEN= 16,
30};
31
32/* encryption numberings (anti-replay) */
33enum
34{
35 AuthTreq=1, /* ticket request */
36 AuthChal=2, /* challenge box request */
37 AuthPass=3, /* change password */
38 AuthOK=4, /* fixed length reply follows */
39 AuthErr=5, /* error follows */
40 AuthMod=6, /* modify user */
41 AuthApop=7, /* apop authentication for pop3 */
42 AuthOKvar=9, /* variable length reply follows */
43 AuthChap=10, /* chap authentication for ppp */
44 AuthMSchap=11, /* MS chap authentication for ppp */
45 AuthCram=12, /* CRAM verification for IMAP (RFC2195 & rfc2104) */
46 AuthHttp=13, /* http domain login */
47 AuthVNC=14, /* VNC server login (deprecated) */
48
49
50 AuthTs=64, /* ticket encrypted with server's key */
51 AuthTc, /* ticket encrypted with client's key */
52 AuthAs, /* server generated authenticator */
53 AuthAc, /* client generated authenticator */
54 AuthTp, /* ticket encrypted with client's key for password change */
55 AuthHr, /* http reply */
56};
57
58struct Ticketreq
59{
60 char type;
61 char authid[ANAMELEN]; /* server's encryption id */
62 char authdom[DOMLEN]; /* server's authentication domain */
63 char chal[CHALLEN]; /* challenge from server */
64 char hostid[ANAMELEN]; /* host's encryption id */
65 char uid[ANAMELEN]; /* uid of requesting user on host */
66};
67#define TICKREQLEN (3*ANAMELEN+CHALLEN+DOMLEN+1)
68
69struct Ticket
70{
71 char num; /* replay protection */
72 char chal[CHALLEN]; /* server challenge */
73 char cuid[ANAMELEN]; /* uid on client */
74 char suid[ANAMELEN]; /* uid on server */
75 char key[DESKEYLEN]; /* nonce DES key */
76};
77#define TICKETLEN (CHALLEN+2*ANAMELEN+DESKEYLEN+1)
78
79struct Authenticator
80{
81 char num; /* replay protection */
82 char chal[CHALLEN];
83 ulong id; /* authenticator id, ++'d with each auth */
84};
85#define AUTHENTLEN (CHALLEN+4+1)
86
87struct Passwordreq
88{
89 char num;
90 char old[ANAMELEN];
91 char new[ANAMELEN];
92 char changesecret;
93 char secret[SECRETLEN]; /* new secret */
94};
95#define PASSREQLEN (2*ANAMELEN+1+1+SECRETLEN)
96
97struct OChapreply
98{
99 uchar id;
100 char uid[ANAMELEN];
101 char resp[OMD5LEN];
102};
103
104struct OMSchapreply
105{
106 char uid[ANAMELEN];
107 char LMresp[24]; /* Lan Manager response */
108 char NTresp[24]; /* NT response */
109};
110
111/*
112 * convert to/from wire format
113 */
114extern int convT2M(Ticket*, char*, char*);
115extern void convM2T(char*, Ticket*, char*);
116extern void convM2Tnoenc(char*, Ticket*);
117extern int convA2M(Authenticator*, char*, char*);
118extern void convM2A(char*, Authenticator*, char*);
119extern int convTR2M(Ticketreq*, char*);
120extern void convM2TR(char*, Ticketreq*);
121extern int convPR2M(Passwordreq*, char*, char*);
122extern void convM2PR(char*, Passwordreq*, char*);
123
124/*
125 * convert ascii password to DES key
126 */
127extern int opasstokey(char*, char*);
128extern int passtokey(char*, char*);
129
130/*
131 * Nvram interface
132 */
133enum {
134 NVwrite = 1<<0, /* always prompt and rewrite nvram */
135 NVwriteonerr = 1<<1, /* prompt and rewrite nvram when corrupt */
136};
137
138struct Nvrsafe
139{
140 char machkey[DESKEYLEN];
141 uchar machsum;
142 char authkey[DESKEYLEN];
143 uchar authsum;
144 char config[CONFIGLEN];
145 uchar configsum;
146 char authid[ANAMELEN];
147 uchar authidsum;
148 char authdom[DOMLEN];
149 uchar authdomsum;
150};
151
152extern uchar nvcsum(void*, int);
153extern int readnvram(Nvrsafe*, int);
154
155/*
156 * call up auth server
157 */
158extern int authdial(char *netroot, char *authdom);
159
160/*
161 * exchange messages with auth server
162 */
163extern int _asgetticket(int, char*, char*);
164extern int _asrdresp(int, char*, int);
165extern int sslnegotiate(int, Ticket*, char**, char**);
166extern int srvsslnegotiate(int, Ticket*, char**, char**);
include/cursor.h+6−0
@@ -0,0 +1,6 @@
1struct Cursor
2{
3 Point offset;
4 uchar clr[2*16];
5 uchar set[2*16];
6};
include/draw.h+519−0
@@ -0,0 +1,519 @@
1#pragma src "/sys/src/libdraw"
2#pragma lib "libdraw.a"
3
4typedef struct Cachefont Cachefont;
5typedef struct Cacheinfo Cacheinfo;
6typedef struct Cachesubf Cachesubf;
7typedef struct Display Display;
8typedef struct Font Font;
9typedef struct Fontchar Fontchar;
10typedef struct Image Image;
11typedef struct Mouse Mouse;
12typedef struct Point Point;
13typedef struct Rectangle Rectangle;
14typedef struct RGB RGB;
15typedef struct Screen Screen;
16typedef struct Subfont Subfont;
17
18#pragma varargck type "R" Rectangle
19#pragma varargck type "P" Point
20extern int Rfmt(Fmt*);
21extern int Pfmt(Fmt*);
22
23enum
24{
25 DOpaque = 0xFFFFFFFF,
26 DTransparent = 0x00000000, /* only useful for allocimage, memfillcolor */
27 DBlack = 0x000000FF,
28 DWhite = 0xFFFFFFFF,
29 DRed = 0xFF0000FF,
30 DGreen = 0x00FF00FF,
31 DBlue = 0x0000FFFF,
32 DCyan = 0x00FFFFFF,
33 DMagenta = 0xFF00FFFF,
34 DYellow = 0xFFFF00FF,
35 DPaleyellow = 0xFFFFAAFF,
36 DDarkyellow = 0xEEEE9EFF,
37 DDarkgreen = 0x448844FF,
38 DPalegreen = 0xAAFFAAFF,
39 DMedgreen = 0x88CC88FF,
40 DDarkblue = 0x000055FF,
41 DPalebluegreen= 0xAAFFFFFF,
42 DPaleblue = 0x0000BBFF,
43 DBluegreen = 0x008888FF,
44 DGreygreen = 0x55AAAAFF,
45 DPalegreygreen = 0x9EEEEEFF,
46 DYellowgreen = 0x99994CFF,
47 DMedblue = 0x000099FF,
48 DGreyblue = 0x005DBBFF,
49 DPalegreyblue = 0x4993DDFF,
50 DPurpleblue = 0x8888CCFF,
51
52 DNotacolor = 0xFFFFFF00,
53 DNofill = DNotacolor,
54
55};
56
57enum
58{
59 Displaybufsize = 8000,
60 ICOSSCALE = 1024,
61 Borderwidth = 4,
62};
63
64enum
65{
66 /* refresh methods */
67 Refbackup = 0,
68 Refnone = 1,
69 Refmesg = 2
70};
71#define NOREFRESH ((void*)-1)
72
73enum
74{
75 /* line ends */
76 Endsquare = 0,
77 Enddisc = 1,
78 Endarrow = 2,
79 Endmask = 0x1F
80};
81
82#define ARROW(a, b, c) (Endarrow|((a)<<5)|((b)<<14)|((c)<<23))
83
84typedef enum
85{
86 /* Porter-Duff compositing operators */
87 Clear = 0,
88
89 SinD = 8,
90 DinS = 4,
91 SoutD = 2,
92 DoutS = 1,
93
94 S = SinD|SoutD,
95 SoverD = SinD|SoutD|DoutS,
96 SatopD = SinD|DoutS,
97 SxorD = SoutD|DoutS,
98
99 D = DinS|DoutS,
100 DoverS = DinS|DoutS|SoutD,
101 DatopS = DinS|SoutD,
102 DxorS = DoutS|SoutD, /* == SxorD */
103
104 Ncomp = 12,
105} Drawop;
106
107/*
108 * image channel descriptors
109 */
110enum {
111 CRed = 0,
112 CGreen,
113 CBlue,
114 CGrey,
115 CAlpha,
116 CMap,
117 CIgnore,
118 NChan,
119};
120
121#define __DC(type, nbits) ((((type)&15)<<4)|((nbits)&15))
122#define CHAN1(a,b) __DC(a,b)
123#define CHAN2(a,b,c,d) (CHAN1((a),(b))<<8|__DC((c),(d)))
124#define CHAN3(a,b,c,d,e,f) (CHAN2((a),(b),(c),(d))<<8|__DC((e),(f)))
125#define CHAN4(a,b,c,d,e,f,g,h) (CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h)))
126
127#define NBITS(c) ((c)&15)
128#define TYPE(c) (((c)>>4)&15)
129
130enum {
131 GREY1 = CHAN1(CGrey, 1),
132 GREY2 = CHAN1(CGrey, 2),
133 GREY4 = CHAN1(CGrey, 4),
134 GREY8 = CHAN1(CGrey, 8),
135 CMAP8 = CHAN1(CMap, 8),
136 RGB15 = CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5),
137 RGB16 = CHAN3(CRed, 5, CGreen, 6, CBlue, 5),
138 RGB24 = CHAN3(CRed, 8, CGreen, 8, CBlue, 8),
139 BGR24 = CHAN3(CBlue, 8, CGreen, 8, CRed, 8),
140 RGBA32 = CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8),
141 ARGB32 = CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8), /* stupid VGAs */
142 XRGB32 = CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8),
143 XBGR32 = CHAN4(CIgnore, 8, CBlue, 8, CGreen, 8, CRed, 8),
144};
145
146extern char* chantostr(char*, ulong);
147extern ulong strtochan(char*);
148extern int chantodepth(ulong);
149
150struct Point
151{
152 int x;
153 int y;
154};
155
156struct Rectangle
157{
158 Point min;
159 Point max;
160};
161
162typedef void (*Reffn)(Image*, Rectangle, void*);
163
164struct Screen
165{
166 Display *display; /* display holding data */
167 int id; /* id of system-held Screen */
168 Image *image; /* unused; for reference only */
169 Image *fill; /* color to paint behind windows */
170};
171
172struct Display
173{
174 QLock qlock;
175 int locking; /*program is using lockdisplay */
176 int dirno;
177 int fd;
178 int reffd;
179 int ctlfd;
180 int imageid;
181 int local;
182 void (*error)(Display*, char*);
183 char *devdir;
184 char *windir;
185 char oldlabel[64];
186 ulong dataqid;
187 Image *white;
188 Image *black;
189 Image *opaque;
190 Image *transparent;
191 Image *image;
192 uchar *buf;
193 int bufsize;
194 uchar *bufp;
195 Font *defaultfont;
196 Subfont *defaultsubfont;
197 Image *windows;
198 Image *screenimage;
199 int _isnewdisplay;
200};
201
202struct Image
203{
204 Display *display; /* display holding data */
205 int id; /* id of system-held Image */
206 Rectangle r; /* rectangle in data area, local coords */
207 Rectangle clipr; /* clipping region */
208 int depth; /* number of bits per pixel */
209 ulong chan;
210 int repl; /* flag: data replicates to tile clipr */
211 Screen *screen; /* 0 if not a window */
212 Image *next; /* next in list of windows */
213};
214
215struct RGB
216{
217 ulong red;
218 ulong green;
219 ulong blue;
220};
221
222/*
223 * Subfonts
224 *
225 * given char c, Subfont *f, Fontchar *i, and Point p, one says
226 * i = f->info+c;
227 * draw(b, Rect(p.x+i->left, p.y+i->top,
228 * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom),
229 * color, f->bits, Pt(i->x, i->top));
230 * p.x += i->width;
231 * to draw characters in the specified color (itself an Image) in Image b.
232 */
233
234struct Fontchar
235{
236 int x; /* left edge of bits */
237 uchar top; /* first non-zero scan-line */
238 uchar bottom; /* last non-zero scan-line + 1 */
239 char left; /* offset of baseline */
240 uchar width; /* width of baseline */
241};
242
243struct Subfont
244{
245 char *name;
246 short n; /* number of chars in font */
247 uchar height; /* height of image */
248 char ascent; /* top of image to baseline */
249 Fontchar *info; /* n+1 character descriptors */
250 Image *bits; /* of font */
251 int ref;
252};
253
254enum
255{
256 /* starting values */
257 LOG2NFCACHE = 6,
258 NFCACHE = (1<<LOG2NFCACHE), /* #chars cached */
259 NFLOOK = 5, /* #chars to scan in cache */
260 NFSUBF = 2, /* #subfonts to cache */
261 /* max value */
262 MAXFCACHE = 1024+NFLOOK, /* upper limit */
263 MAXSUBF = 50, /* generous upper limit */
264 /* deltas */
265 DSUBF = 4,
266 /* expiry ages */
267 SUBFAGE = 10000,
268 CACHEAGE = 10000
269};
270
271struct Cachefont
272{
273 Rune min; /* lowest rune value to be taken from subfont */
274 Rune max; /* highest rune value+1 to be taken from subfont */
275 int offset; /* position in subfont of character at min */
276 char *name; /* stored in font */
277 char *subfontname; /* to access subfont */
278};
279
280struct Cacheinfo
281{
282 ushort x; /* left edge of bits */
283 uchar width; /* width of baseline */
284 schar left; /* offset of baseline */
285 Rune value; /* value of character at this slot in cache */
286 ushort age;
287};
288
289struct Cachesubf
290{
291 ulong age; /* for replacement */
292 Cachefont *cf; /* font info that owns us */
293 Subfont *f; /* attached subfont */
294};
295
296struct Font
297{
298 char *name;
299 Display *display;
300 short height; /* max height of image, interline spacing */
301 short ascent; /* top of image to baseline */
302 short width; /* widest so far; used in caching only */
303 short nsub; /* number of subfonts */
304 ulong age; /* increasing counter; used for LRU */
305 int maxdepth; /* maximum depth of all loaded subfonts */
306 int ncache; /* size of cache */
307 int nsubf; /* size of subfont list */
308 Cacheinfo *cache;
309 Cachesubf *subf;
310 Cachefont **sub; /* as read from file */
311 Image *cacheimage;
312};
313
314#define Dx(r) ((r).max.x-(r).min.x)
315#define Dy(r) ((r).max.y-(r).min.y)
316
317/*
318 * Image management
319 */
320extern Image* _allocimage(Image*, Display*, Rectangle, ulong, int, ulong, int, int);
321extern Image* allocimage(Display*, Rectangle, ulong, int, ulong);
322extern uchar* bufimage(Display*, int);
323extern int bytesperline(Rectangle, int);
324extern void closedisplay(Display*);
325extern void drawerror(Display*, char*);
326extern int flushimage(Display*, int);
327extern int freeimage(Image*);
328extern int _freeimage1(Image*);
329extern int geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int);
330extern int initdraw(void(*)(Display*, char*), char*, char*);
331extern int newwindow(char*);
332extern Display* initdisplay(char*, char*, void(*)(Display*, char*));
333extern int loadimage(Image*, Rectangle, uchar*, int);
334extern int cloadimage(Image*, Rectangle, uchar*, int);
335extern int getwindow(Display*, int);
336extern int gengetwindow(Display*, char*, Image**, Screen**, int);
337extern Image* readimage(Display*, int, int);
338extern Image* creadimage(Display*, int, int);
339extern int unloadimage(Image*, Rectangle, uchar*, int);
340extern int wordsperline(Rectangle, int);
341extern int writeimage(int, Image*, int);
342extern Image* namedimage(Display*, char*);
343extern int nameimage(Image*, char*, int);
344extern Image* allocimagemix(Display*, ulong, ulong);
345
346/*
347 * Colors
348 */
349extern void readcolmap(Display*, RGB*);
350extern void writecolmap(Display*, RGB*);
351extern ulong setalpha(ulong, uchar);
352
353/*
354 * Windows
355 */
356extern Screen* allocscreen(Image*, Image*, int);
357extern Image* _allocwindow(Image*, Screen*, Rectangle, int, ulong);
358extern Image* allocwindow(Screen*, Rectangle, int, ulong);
359extern void bottomnwindows(Image**, int);
360extern void bottomwindow(Image*);
361extern int freescreen(Screen*);
362extern Screen* publicscreen(Display*, int, ulong);
363extern void topnwindows(Image**, int);
364extern void topwindow(Image*);
365extern int originwindow(Image*, Point, Point);
366
367/*
368 * Geometry
369 */
370extern Point Pt(int, int);
371extern Rectangle Rect(int, int, int, int);
372extern Rectangle Rpt(Point, Point);
373extern Point addpt(Point, Point);
374extern Point subpt(Point, Point);
375extern Point divpt(Point, int);
376extern Point mulpt(Point, int);
377extern int eqpt(Point, Point);
378extern int eqrect(Rectangle, Rectangle);
379extern Rectangle insetrect(Rectangle, int);
380extern Rectangle rectaddpt(Rectangle, Point);
381extern Rectangle rectsubpt(Rectangle, Point);
382extern Rectangle canonrect(Rectangle);
383extern int rectXrect(Rectangle, Rectangle);
384extern int rectinrect(Rectangle, Rectangle);
385extern void combinerect(Rectangle*, Rectangle);
386extern int rectclip(Rectangle*, Rectangle);
387extern int ptinrect(Point, Rectangle);
388extern void replclipr(Image*, int, Rectangle);
389extern int drawreplxy(int, int, int); /* used to be drawsetxy */
390extern Point drawrepl(Rectangle, Point);
391extern int rgb2cmap(int, int, int);
392extern int cmap2rgb(int);
393extern int cmap2rgba(int);
394extern void icossin(int, int*, int*);
395extern void icossin2(int, int, int*, int*);
396
397/*
398 * Graphics
399 */
400extern void draw(Image*, Rectangle, Image*, Image*, Point);
401extern void drawop(Image*, Rectangle, Image*, Image*, Point, Drawop);
402extern void gendraw(Image*, Rectangle, Image*, Point, Image*, Point);
403extern void gendrawop(Image*, Rectangle, Image*, Point, Image*, Point, Drawop);
404extern void line(Image*, Point, Point, int, int, int, Image*, Point);
405extern void lineop(Image*, Point, Point, int, int, int, Image*, Point, Drawop);
406extern void poly(Image*, Point*, int, int, int, int, Image*, Point);
407extern void polyop(Image*, Point*, int, int, int, int, Image*, Point, Drawop);
408extern void fillpoly(Image*, Point*, int, int, Image*, Point);
409extern void fillpolyop(Image*, Point*, int, int, Image*, Point, Drawop);
410extern Point string(Image*, Point, Image*, Point, Font*, char*);
411extern Point stringop(Image*, Point, Image*, Point, Font*, char*, Drawop);
412extern Point stringn(Image*, Point, Image*, Point, Font*, char*, int);
413extern Point stringnop(Image*, Point, Image*, Point, Font*, char*, int, Drawop);
414extern Point runestring(Image*, Point, Image*, Point, Font*, Rune*);
415extern Point runestringop(Image*, Point, Image*, Point, Font*, Rune*, Drawop);
416extern Point runestringn(Image*, Point, Image*, Point, Font*, Rune*, int);
417extern Point runestringnop(Image*, Point, Image*, Point, Font*, Rune*, int, Drawop);
418extern Point stringbg(Image*, Point, Image*, Point, Font*, char*, Image*, Point);
419extern Point stringbgop(Image*, Point, Image*, Point, Font*, char*, Image*, Point, Drawop);
420extern Point stringnbg(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point);
421extern Point stringnbgop(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point, Drawop);
422extern Point runestringbg(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point);
423extern Point runestringbgop(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point, Drawop);
424extern Point runestringnbg(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point);
425extern Point runestringnbgop(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point, Drawop);
426extern Point _string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rectangle, Image*, Point, Drawop);
427extern Point stringsubfont(Image*, Point, Image*, Subfont*, char*);
428extern int bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point);
429extern int bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop);
430extern int bezspline(Image*, Point*, int, int, int, int, Image*, Point);
431extern int bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop);
432extern int bezsplinepts(Point*, int, Point**);
433extern int fillbezier(Image*, Point, Point, Point, Point, int, Image*, Point);
434extern int fillbezierop(Image*, Point, Point, Point, Point, int, Image*, Point, Drawop);
435extern int fillbezspline(Image*, Point*, int, int, Image*, Point);
436extern int fillbezsplineop(Image*, Point*, int, int, Image*, Point, Drawop);
437extern void ellipse(Image*, Point, int, int, int, Image*, Point);
438extern void ellipseop(Image*, Point, int, int, int, Image*, Point, Drawop);
439extern void fillellipse(Image*, Point, int, int, Image*, Point);
440extern void fillellipseop(Image*, Point, int, int, Image*, Point, Drawop);
441extern void arc(Image*, Point, int, int, int, Image*, Point, int, int);
442extern void arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop);
443extern void fillarc(Image*, Point, int, int, Image*, Point, int, int);
444extern void fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop);
445extern void border(Image*, Rectangle, int, Image*, Point);
446extern void borderop(Image*, Rectangle, int, Image*, Point, Drawop);
447
448/*
449 * Font management
450 */
451extern Font* openfont(Display*, char*);
452extern Font* buildfont(Display*, char*, char*);
453extern void freefont(Font*);
454extern Font* mkfont(Subfont*, Rune);
455extern int cachechars(Font*, char**, Rune**, ushort*, int, int*, char**);
456extern void agefont(Font*);
457extern Subfont* allocsubfont(char*, int, int, int, Fontchar*, Image*);
458extern Subfont* lookupsubfont(Display*, char*);
459extern void installsubfont(char*, Subfont*);
460extern void uninstallsubfont(Subfont*);
461extern void freesubfont(Subfont*);
462extern Subfont* readsubfont(Display*, char*, int, int);
463extern Subfont* readsubfonti(Display*, char*, int, Image*, int);
464extern int writesubfont(int, Subfont*);
465extern void _unpackinfo(Fontchar*, uchar*, int);
466extern Point stringsize(Font*, char*);
467extern int stringwidth(Font*, char*);
468extern int stringnwidth(Font*, char*, int);
469extern Point runestringsize(Font*, Rune*);
470extern int runestringwidth(Font*, Rune*);
471extern int runestringnwidth(Font*, Rune*, int);
472extern Point strsubfontwidth(Subfont*, char*);
473extern int loadchar(Font*, Rune, Cacheinfo*, int, int, char**);
474extern char* subfontname(char*, char*, int);
475extern Subfont* _getsubfont(Display*, char*);
476extern Subfont* getdefont(Display*);
477extern void lockdisplay(Display*);
478extern void unlockdisplay(Display*);
479extern int drawlsetrefresh(ulong, int, void*, void*);
480
481/*
482 * Predefined
483 */
484extern uchar defontdata[];
485extern int sizeofdefont;
486extern Point ZP;
487extern Rectangle ZR;
488
489/*
490 * Set up by initdraw()
491 */
492extern Display *display;
493extern Font *font;
494/* extern Image *screen; */
495extern Screen *_screen;
496extern int _cursorfd;
497extern int _drawdebug; /* set to 1 to see errors from flushimage */
498extern void _setdrawop(Display*, Drawop);
499
500#define BGSHORT(p) (((p)[0]<<0) | ((p)[1]<<8))
501#define BGLONG(p) ((BGSHORT(p)<<0) | (BGSHORT(p+2)<<16))
502#define BPSHORT(p, v) ((p)[0]=(v), (p)[1]=((v)>>8))
503#define BPLONG(p, v) (BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16))
504
505/*
506 * Compressed image file parameters and helper routines
507 */
508#define NMATCH 3 /* shortest match possible */
509#define NRUN (NMATCH+31) /* longest match possible */
510#define NMEM 1024 /* window size */
511#define NDUMP 128 /* maximum length of dump */
512#define NCBLOCK 6000 /* size of compressed blocks */
513extern void _twiddlecompressed(uchar*, int);
514extern int _compblocksize(Rectangle, int);
515
516/* XXX backwards helps; should go */
517extern int log2[];
518extern ulong drawld2chan[];
519extern void drawsetdebug(int);
include/dtos.h+10−0
@@ -0,0 +1,10 @@
1#if defined(linux) || defined(IRIX) || defined(SOLARIS) || defined(OSF1) || defined(__FreeBSD__) || defined(__APPLE__)
2# include "unix.h"
3# ifdef __APPLE__
4# define panic dt_panic
5# endif
6#elif defined(WINDOWS)
7# include "winduhz.h"
8#else
9# error "Define an OS"
10#endif
include/fcall.h+110−0
@@ -0,0 +1,110 @@
1#define VERSION9P "9P2000"
2
3#define MAXWELEM 16
4
5typedef
6struct Fcall
7{
8 uchar type;
9 u32int fid;
10 ushort tag;
11 u32int msize; /* Tversion, Rversion */
12 char *version; /* Tversion, Rversion */
13 ushort oldtag; /* Tflush */
14 char *ename; /* Rerror */
15 Qid qid; /* Rattach, Ropen, Rcreate */
16 u32int iounit; /* Ropen, Rcreate */
17 Qid aqid; /* Rauth */
18 u32int afid; /* Tauth, Tattach */
19 char *uname; /* Tauth, Tattach */
20 char *aname; /* Tauth, Tattach */
21 u32int perm; /* Tcreate */
22 char *name; /* Tcreate */
23 uchar mode; /* Tcreate, Topen */
24 u32int newfid; /* Twalk */
25 ushort nwname; /* Twalk */
26 char *wname[MAXWELEM]; /* Twalk */
27 ushort nwqid; /* Rwalk */
28 Qid wqid[MAXWELEM]; /* Rwalk */
29 vlong offset; /* Tread, Twrite */
30 u32int count; /* Tread, Twrite, Rread */
31 char *data; /* Twrite, Rread */
32 ushort nstat; /* Twstat, Rstat */
33 uchar *stat; /* Twstat, Rstat */
34} Fcall;
35
36
37#define GBIT8(p) ((p)[0])
38#define GBIT16(p) ((p)[0]|((p)[1]<<8))
39#define GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
40#define GBIT64(p) ((vlong)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
41 ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
42
43#define PBIT8(p,v) (p)[0]=(v)
44#define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8
45#define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
46#define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
47 (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
48
49#define BIT8SZ 1
50#define BIT16SZ 2
51#define BIT32SZ 4
52#define BIT64SZ 8
53#define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ)
54
55/* STATFIXLEN includes leading 16-bit count */
56/* The count, however, excludes itself; total size is BIT16SZ+count */
57#define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */
58
59#define NOTAG (ushort)~0U /* Dummy tag */
60#define NOFID (u32int)~0U /* Dummy fid */
61#define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */
62
63enum
64{
65 Tversion = 100,
66 Rversion,
67 Tauth = 102,
68 Rauth,
69 Tattach = 104,
70 Rattach,
71 Terror = 106, /* illegal */
72 Rerror,
73 Tflush = 108,
74 Rflush,
75 Twalk = 110,
76 Rwalk,
77 Topen = 112,
78 Ropen,
79 Tcreate = 114,
80 Rcreate,
81 Tread = 116,
82 Rread,
83 Twrite = 118,
84 Rwrite,
85 Tclunk = 120,
86 Rclunk,
87 Tremove = 122,
88 Rremove,
89 Tstat = 124,
90 Rstat,
91 Twstat = 126,
92 Rwstat,
93 Tmax,
94};
95
96uint convM2S(uchar*, uint, Fcall*);
97uint convS2M(Fcall*, uchar*, uint);
98uint sizeS2M(Fcall*);
99
100int statcheck(uchar *abuf, uint nbuf);
101uint convM2D(uchar*, uint, Dir*, char*);
102uint convD2M(Dir*, uchar*, uint);
103uint sizeD2M(Dir*);
104
105int fcallfmt(Fmt*);
106int dirfmt(Fmt*);
107int dirmodefmt(Fmt*);
108
109int read9pmsg(int, void*, uint);
110
include/keyboard.h+42−0
@@ -0,0 +1,42 @@
1#pragma src "/sys/src/libdraw"
2#pragma lib "libdraw.a"
3
4typedef struct Keyboardctl Keyboardctl;
5typedef struct Channel Channel;
6
7struct Keyboardctl
8{
9 Channel *c; /* chan(Rune)[20] */
10
11 char *file;
12 int consfd; /* to cons file */
13 int ctlfd; /* to ctl file */
14 int pid; /* of slave proc */
15};
16
17
18extern Keyboardctl* initkeyboard(char*);
19extern int ctlkeyboard(Keyboardctl*, char*);
20extern void closekeyboard(Keyboardctl*);
21
22enum {
23 KF= 0xF000, /* Rune: beginning of private Unicode space */
24 Spec= 0xF800,
25 /* KF|1, KF|2, ..., KF|0xC is F1, F2, ..., F12 */
26 Khome= KF|0x0D,
27 Kup= KF|0x0E,
28 Kpgup= KF|0x0F,
29 Kprint= KF|0x10,
30 Kleft= KF|0x11,
31 Kright= KF|0x12,
32 Kdown= Spec|0x00,
33 Kview= Spec|0x00,
34 Kpgdown= KF|0x13,
35 Kins= KF|0x14,
36 Kend= KF|0x18,
37
38 Kalt= KF|0x15,
39 Kshift= KF|0x16,
40 Kctl= KF|0x17,
41};
42
include/lib.h+246−0
@@ -0,0 +1,246 @@
1/* avoid name conflicts */
2#define accept pm_accept
3#define listen pm_listen
4#define sleep ksleep
5#define wakeup kwakeup
6#define strtod libstrtod
7#define pow10 libpow10
8
9/* conflicts on some os's */
10#define encrypt libencrypt
11#define decrypt libdecrypt
12#define oserror liboserror
13#define clone libclone
14#define atexit libatexit
15#define log2 liblog2
16#define log liblog
17#define reboot libreboot
18#define srand dtsrand
19#define rand dtrand
20#define nrand dtnrand
21#define lrand dtlrand
22#define lnrand dtlnrand
23#undef timeradd
24#define timeradd xtimeradd
25
26
27#define nil ((void*)0)
28
29typedef unsigned char p9_uchar;
30typedef unsigned int p9_uint;
31typedef unsigned int p9_ulong;
32typedef int p9_long;
33typedef signed char p9_schar;
34typedef unsigned short p9_ushort;
35typedef unsigned short Rune;
36typedef unsigned int p9_u32int;
37typedef p9_u32int mpdigit;
38
39/* make sure we don't conflict with predefined types */
40#define schar p9_schar
41#define uchar p9_uchar
42#define ushort p9_ushort
43#define uint p9_uint
44#define u32int p9_u32int
45
46/* #define long int rather than p9_long so that "unsigned long" is valid */
47#define long int
48#define ulong p9_ulong
49#define vlong p9_vlong
50#define uvlong p9_uvlong
51
52#define nelem(x) (sizeof(x)/sizeof((x)[0]))
53#define USED(x) if(x);else
54#define SET(x)
55
56enum
57{
58 UTFmax = 3, /* maximum bytes per rune */
59 Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */
60 Runeself = 0x80, /* rune and UTF sequences are the same (<) */
61 Runeerror = 0x80 /* decoding error in UTF */
62};
63
64/*
65 * new rune routines
66 */
67extern int runetochar(char*, Rune*);
68extern int chartorune(Rune*, char*);
69extern int runelen(long);
70extern int fullrune(char*, int);
71
72extern int wstrtoutf(char*, Rune*, int);
73extern int wstrutflen(Rune*);
74
75/*
76 * rune routines from converted str routines
77 */
78extern long utflen(char*);
79extern char* utfrune(char*, long);
80extern char* utfrrune(char*, long);
81
82/*
83 * Syscall data structures
84 */
85#define MORDER 0x0003 /* mask for bits defining order of mounting */
86#define MREPL 0x0000 /* mount replaces object */
87#define MBEFORE 0x0001 /* mount goes before others in union directory */
88#define MAFTER 0x0002 /* mount goes after others in union directory */
89#define MCREATE 0x0004 /* permit creation in mounted directory */
90#define MCACHE 0x0010 /* cache some data */
91#define MMASK 0x0017 /* all bits on */
92
93#define OREAD 0 /* open for read */
94#define OWRITE 1 /* write */
95#define ORDWR 2 /* read and write */
96#define OEXEC 3 /* execute, == read but check execute permission */
97#define OTRUNC 16 /* or'ed in (except for exec), truncate file first */
98#define OCEXEC 32 /* or'ed in, close on exec */
99#define ORCLOSE 64 /* or'ed in, remove on close */
100#define OEXCL 0x1000 /* or'ed in, exclusive create */
101
102#define NCONT 0 /* continue after note */
103#define NDFLT 1 /* terminate after note */
104#define NSAVE 2 /* clear note but hold state */
105#define NRSTR 3 /* restore saved state */
106
107#define ERRMAX 128 /* max length of error string */
108#define KNAMELEN 28 /* max length of name held in kernel */
109
110/* bits in Qid.type */
111#define QTDIR 0x80 /* type bit for directories */
112#define QTAPPEND 0x40 /* type bit for append only files */
113#define QTEXCL 0x20 /* type bit for exclusive use files */
114#define QTMOUNT 0x10 /* type bit for mounted channel */
115#define QTAUTH 0x08 /* type bit for authentication file */
116#define QTFILE 0x00 /* plain file */
117
118/* bits in Dir.mode */
119#define DMDIR 0x80000000 /* mode bit for directories */
120#define DMAPPEND 0x40000000 /* mode bit for append only files */
121#define DMEXCL 0x20000000 /* mode bit for exclusive use files */
122#define DMMOUNT 0x10000000 /* mode bit for mounted channel */
123#define DMAUTH 0x08000000 /* mode bit for authentication files */
124#define DMREAD 0x4 /* mode bit for read permission */
125#define DMWRITE 0x2 /* mode bit for write permission */
126#define DMEXEC 0x1 /* mode bit for execute permission */
127
128typedef struct Lock
129{
130 long key;
131} Lock;
132
133typedef struct QLock
134{
135 Lock lk;
136 struct Proc *hold;
137 struct Proc *first;
138 struct Proc *last;
139} QLock;
140
141typedef
142struct Qid
143{
144 uvlong path;
145 ulong vers;
146 uchar type;
147} Qid;
148
149typedef
150struct Dir {
151 /* system-modified data */
152 ushort type; /* server type */
153 uint dev; /* server subtype */
154 /* file data */
155 Qid qid; /* unique id from server */
156 ulong mode; /* permissions */
157 ulong atime; /* last read time */
158 ulong mtime; /* last write time */
159 vlong length; /* file length */
160 char *name; /* last element of path */
161 char *uid; /* owner name */
162 char *gid; /* group name */
163 char *muid; /* last modifier name */
164} Dir;
165
166typedef
167struct Waitmsg
168{
169 int pid; /* of loved one */
170 ulong time[3]; /* of loved one & descendants */
171 char *msg;
172} Waitmsg;
173
174/*
175 * print routines
176 */
177typedef struct Fmt Fmt;
178struct Fmt{
179 uchar runes; /* output buffer is runes or chars? */
180 void *start; /* of buffer */
181 void *to; /* current place in the buffer */
182 void *stop; /* end of the buffer; overwritten if flush fails */
183 int (*flush)(Fmt *); /* called when to == stop */
184 void *farg; /* to make flush a closure */
185 int nfmt; /* num chars formatted so far */
186 va_list args; /* args passed to dofmt */
187 int r; /* % format Rune */
188 int width;
189 int prec;
190 ulong flags;
191};
192
193enum{
194 FmtWidth = 1,
195 FmtLeft = FmtWidth << 1,
196 FmtPrec = FmtLeft << 1,
197 FmtSharp = FmtPrec << 1,
198 FmtSpace = FmtSharp << 1,
199 FmtSign = FmtSpace << 1,
200 FmtZero = FmtSign << 1,
201 FmtUnsigned = FmtZero << 1,
202 FmtShort = FmtUnsigned << 1,
203 FmtLong = FmtShort << 1,
204 FmtVLong = FmtLong << 1,
205 FmtComma = FmtVLong << 1,
206 FmtByte = FmtComma << 1,
207
208 FmtFlag = FmtByte << 1
209};
210
211extern int print(char*, ...);
212extern char* seprint(char*, char*, char*, ...);
213extern char* vseprint(char*, char*, char*, va_list);
214extern int snprint(char*, int, char*, ...);
215extern int vsnprint(char*, int, char*, va_list);
216extern char* smprint(char*, ...);
217extern char* vsmprint(char*, va_list);
218extern int sprint(char*, char*, ...);
219extern int fprint(int, char*, ...);
220extern int vfprint(int, char*, va_list);
221
222extern int (*doquote)(int);
223extern int runesprint(Rune*, char*, ...);
224extern int runesnprint(Rune*, int, char*, ...);
225extern int runevsnprint(Rune*, int, char*, va_list);
226extern Rune* runeseprint(Rune*, Rune*, char*, ...);
227extern Rune* runevseprint(Rune*, Rune*, char*, va_list);
228extern Rune* runesmprint(char*, ...);
229extern Rune* runevsmprint(char*, va_list);
230
231extern int fmtfdinit(Fmt*, int, char*, int);
232extern int fmtfdflush(Fmt*);
233extern int fmtstrinit(Fmt*);
234extern int fmtinstall(int, int (*)(Fmt*));
235extern char* fmtstrflush(Fmt*);
236extern int runefmtstrinit(Fmt*);
237extern Rune* runefmtstrflush(Fmt*);
238
239extern void* mallocz(ulong, int);
240
241extern void srand(long);
242extern int rand(void);
243extern int nrand(int);
244extern long lrand(void);
245extern long lnrand(long);
246extern double frand(void);
include/libc.h+3−0
@@ -0,0 +1,3 @@
1#include "lib.h"
2#include "user.h"
3
include/libsec.h+340−0
@@ -0,0 +1,340 @@
1
2#ifndef _MPINT
3typedef struct mpint mpint;
4#endif
5
6/////////////////////////////////////////////////////////
7// AES definitions
8/////////////////////////////////////////////////////////
9
10enum
11{
12 AESbsize= 16,
13 AESmaxkey= 32,
14 AESmaxrounds= 14
15};
16
17typedef struct AESstate AESstate;
18struct AESstate
19{
20 ulong setup;
21 int rounds;
22 int keybytes;
23 uchar key[AESmaxkey]; /* unexpanded key */
24 u32int ekey[4*(AESmaxrounds + 1)]; /* encryption key */
25 u32int dkey[4*(AESmaxrounds + 1)]; /* decryption key */
26 uchar ivec[AESbsize]; /* initialization vector */
27};
28
29void setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec);
30void aesCBCencrypt(uchar *p, int len, AESstate *s);
31void aesCBCdecrypt(uchar *p, int len, AESstate *s);
32
33/////////////////////////////////////////////////////////
34// Blowfish Definitions
35/////////////////////////////////////////////////////////
36
37enum
38{
39 BFbsize = 8,
40 BFrounds = 16
41};
42
43// 16-round Blowfish
44typedef struct BFstate BFstate;
45struct BFstate
46{
47 ulong setup;
48
49 uchar key[56];
50 uchar ivec[8];
51
52 u32int pbox[BFrounds+2];
53 u32int sbox[1024];
54};
55
56void setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec);
57void bfCBCencrypt(uchar*, int, BFstate*);
58void bfCBCdecrypt(uchar*, int, BFstate*);
59void bfECBencrypt(uchar*, int, BFstate*);
60void bfECBdecrypt(uchar*, int, BFstate*);
61
62/////////////////////////////////////////////////////////
63// DES definitions
64/////////////////////////////////////////////////////////
65
66enum
67{
68 DESbsize= 8
69};
70
71// single des
72typedef struct DESstate DESstate;
73struct DESstate
74{
75 ulong setup;
76 uchar key[8]; /* unexpanded key */
77 ulong expanded[32]; /* expanded key */
78 uchar ivec[8]; /* initialization vector */
79};
80
81void setupDESstate(DESstate *s, uchar key[8], uchar *ivec);
82void des_key_setup(uchar[8], ulong[32]);
83void block_cipher(ulong*, uchar*, int);
84void desCBCencrypt(uchar*, int, DESstate*);
85void desCBCdecrypt(uchar*, int, DESstate*);
86void desECBencrypt(uchar*, int, DESstate*);
87void desECBdecrypt(uchar*, int, DESstate*);
88
89// for backward compatibility with 7 byte DES key format
90void des56to64(uchar *k56, uchar *k64);
91void des64to56(uchar *k64, uchar *k56);
92void key_setup(uchar[7], ulong[32]);
93
94// triple des encrypt/decrypt orderings
95enum {
96 DES3E= 0,
97 DES3D= 1,
98 DES3EEE= 0,
99 DES3EDE= 2,
100 DES3DED= 5,
101 DES3DDD= 7
102};
103
104typedef struct DES3state DES3state;
105struct DES3state
106{
107 ulong setup;
108 uchar key[3][8]; /* unexpanded key */
109 ulong expanded[3][32]; /* expanded key */
110 uchar ivec[8]; /* initialization vector */
111};
112
113void setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec);
114void triple_block_cipher(ulong keys[3][32], uchar*, int);
115void des3CBCencrypt(uchar*, int, DES3state*);
116void des3CBCdecrypt(uchar*, int, DES3state*);
117void des3ECBencrypt(uchar*, int, DES3state*);
118void des3ECBdecrypt(uchar*, int, DES3state*);
119
120/////////////////////////////////////////////////////////
121// digests
122/////////////////////////////////////////////////////////
123
124enum
125{
126 SHA1dlen= 20, /* SHA digest length */
127 MD4dlen= 16, /* MD4 digest length */
128 MD5dlen= 16 /* MD5 digest length */
129};
130
131typedef struct DigestState DigestState;
132struct DigestState
133{
134 ulong len;
135 u32int state[5];
136 uchar buf[128];
137 int blen;
138 char malloced;
139 char seeded;
140};
141typedef struct DigestState SHAstate; /* obsolete name */
142typedef struct DigestState SHA1state;
143typedef struct DigestState MD5state;
144typedef struct DigestState MD4state;
145
146DigestState* md4(uchar*, ulong, uchar*, DigestState*);
147DigestState* md5(uchar*, ulong, uchar*, DigestState*);
148DigestState* sha1(uchar*, ulong, uchar*, DigestState*);
149DigestState* hmac_md5(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
150DigestState* hmac_sha1(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
151char* sha1pickle(SHA1state*);
152SHA1state* sha1unpickle(char*);
153
154/////////////////////////////////////////////////////////
155// random number generation
156/////////////////////////////////////////////////////////
157void genrandom(uchar *buf, int nbytes);
158void prng(uchar *buf, int nbytes);
159ulong fastrand(void);
160ulong nfastrand(ulong);
161
162/////////////////////////////////////////////////////////
163// primes
164/////////////////////////////////////////////////////////
165void genprime(mpint *p, int n, int accuracy); // generate an n bit probable prime
166void gensafeprime(mpint *p, mpint *alpha, int n, int accuracy); // prime and generator
167void genstrongprime(mpint *p, int n, int accuracy); // generate an n bit strong prime
168void DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]);
169int probably_prime(mpint *n, int nrep); // miller-rabin test
170int smallprimetest(mpint *p); // returns -1 if not prime, 0 otherwise
171
172/////////////////////////////////////////////////////////
173// rc4
174/////////////////////////////////////////////////////////
175typedef struct RC4state RC4state;
176struct RC4state
177{
178 uchar state[256];
179 uchar x;
180 uchar y;
181};
182
183void setupRC4state(RC4state*, uchar*, int);
184void rc4(RC4state*, uchar*, int);
185void rc4skip(RC4state*, int);
186void rc4back(RC4state*, int);
187
188/////////////////////////////////////////////////////////
189// rsa
190/////////////////////////////////////////////////////////
191typedef struct RSApub RSApub;
192typedef struct RSApriv RSApriv;
193
194// public/encryption key
195struct RSApub
196{
197 mpint *n; // modulus
198 mpint *ek; // exp (encryption key)
199};
200
201// private/decryption key
202struct RSApriv
203{
204 RSApub pub;
205
206 mpint *dk; // exp (decryption key)
207
208 // precomputed values to help with chinese remainder theorem calc
209 mpint *p;
210 mpint *q;
211 mpint *kp; // dk mod p-1
212 mpint *kq; // dk mod q-1
213 mpint *c2; // (inv p) mod q
214};
215
216RSApriv* rsagen(int nlen, int elen, int rounds);
217RSApriv* rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q);
218mpint* rsaencrypt(RSApub *k, mpint *in, mpint *out);
219mpint* rsadecrypt(RSApriv *k, mpint *in, mpint *out);
220RSApub* rsapuballoc(void);
221void rsapubfree(RSApub*);
222RSApriv* rsaprivalloc(void);
223void rsaprivfree(RSApriv*);
224RSApub* rsaprivtopub(RSApriv*);
225RSApub* X509toRSApub(uchar*, int, char*, int);
226RSApriv* asn1toRSApriv(uchar*, int);
227void asn1dump(uchar *der, int len);
228uchar* decodepem(char *s, char *type, int *len);
229uchar* X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen);
230uchar* X509req(RSApriv *priv, char *subj, int *certlen);
231char* X509verify(uchar *cert, int ncert, RSApub *pk);
232void X509dump(uchar *cert, int ncert);
233/////////////////////////////////////////////////////////
234// elgamal
235/////////////////////////////////////////////////////////
236typedef struct EGpub EGpub;
237typedef struct EGpriv EGpriv;
238typedef struct EGsig EGsig;
239
240// public/encryption key
241struct EGpub
242{
243 mpint *p; // modulus
244 mpint *alpha; // generator
245 mpint *key; // (encryption key) alpha**secret mod p
246};
247
248// private/decryption key
249struct EGpriv
250{
251 EGpub pub;
252 mpint *secret; // (decryption key)
253};
254
255// signature
256struct EGsig
257{
258 mpint *r, *s;
259};
260
261EGpriv* eggen(int nlen, int rounds);
262mpint* egencrypt(EGpub *k, mpint *in, mpint *out);
263mpint* egdecrypt(EGpriv *k, mpint *in, mpint *out);
264EGsig* egsign(EGpriv *k, mpint *m);
265int egverify(EGpub *k, EGsig *sig, mpint *m);
266EGpub* egpuballoc(void);
267void egpubfree(EGpub*);
268EGpriv* egprivalloc(void);
269void egprivfree(EGpriv*);
270EGsig* egsigalloc(void);
271void egsigfree(EGsig*);
272EGpub* egprivtopub(EGpriv*);
273
274/////////////////////////////////////////////////////////
275// dsa
276/////////////////////////////////////////////////////////
277typedef struct DSApub DSApub;
278typedef struct DSApriv DSApriv;
279typedef struct DSAsig DSAsig;
280
281// public/encryption key
282struct DSApub
283{
284 mpint *p; // modulus
285 mpint *q; // group order, q divides p-1
286 mpint *alpha; // group generator
287 mpint *key; // (encryption key) alpha**secret mod p
288};
289
290// private/decryption key
291struct DSApriv
292{
293 DSApub pub;
294 mpint *secret; // (decryption key)
295};
296
297// signature
298struct DSAsig
299{
300 mpint *r, *s;
301};
302
303DSApriv* dsagen(DSApub *opub);
304DSAsig* dsasign(DSApriv *k, mpint *m);
305int dsaverify(DSApub *k, DSAsig *sig, mpint *m);
306DSApub* dsapuballoc(void);
307void dsapubfree(DSApub*);
308DSApriv* dsaprivalloc(void);
309void dsaprivfree(DSApriv*);
310DSAsig* dsasigalloc(void);
311void dsasigfree(DSAsig*);
312DSApub* dsaprivtopub(DSApriv*);
313
314/////////////////////////////////////////////////////////
315// TLS
316/////////////////////////////////////////////////////////
317typedef struct Thumbprint{
318 struct Thumbprint *next;
319 uchar sha1[SHA1dlen];
320} Thumbprint;
321
322typedef struct TLSconn{
323 char dir[40]; // connection directory
324 uchar *cert; // certificate (local on input, remote on output)
325 uchar *sessionID;
326 int certlen, sessionIDlen;
327 int (*trace)(char*fmt, ...);
328} TLSconn;
329
330// tlshand.c
331extern int tlsClient(int fd, TLSconn *c);
332extern int tlsServer(int fd, TLSconn *c);
333
334// thumb.c
335extern Thumbprint* initThumbprints(char *ok, char *crl);
336extern void freeThumbprints(Thumbprint *ok);
337extern int okThumbprint(uchar *sha1, Thumbprint *ok);
338
339// readcert.c
340extern uchar *readcert(char *filename, int *pcertlen);
include/memdraw.h+200−0
@@ -0,0 +1,200 @@
1#pragma src "/sys/src/libmemdraw"
2#pragma lib "libmemdraw.a"
3
4typedef struct Memimage Memimage;
5typedef struct Memdata Memdata;
6typedef struct Memsubfont Memsubfont;
7typedef struct Memlayer Memlayer;
8typedef struct Memcmap Memcmap;
9typedef struct Memdrawparam Memdrawparam;
10
11/*
12 * Memdata is allocated from main pool, but .data from the image pool.
13 * Memdata is allocated separately to permit patching its pointer after
14 * compaction when windows share the image data.
15 * The first word of data is a back pointer to the Memdata, to find
16 * The word to patch.
17 */
18
19struct Memdata
20{
21 ulong *base; /* allocated data pointer */
22 uchar *bdata; /* pointer to first byte of actual data; word-aligned */
23 int ref; /* number of Memimages using this data */
24 void* imref;
25 int allocd; /* is this malloc'd? */
26};
27
28enum {
29 Frepl = 1<<0, /* is replicated */
30 Fsimple = 1<<1, /* is 1x1 */
31 Fgrey = 1<<2, /* is grey */
32 Falpha = 1<<3, /* has explicit alpha */
33 Fcmap = 1<<4, /* has cmap channel */
34 Fbytes = 1<<5, /* has only 8-bit channels */
35};
36
37struct Memimage
38{
39 Rectangle r; /* rectangle in data area, local coords */
40 Rectangle clipr; /* clipping region */
41 int depth; /* number of bits of storage per pixel */
42 int nchan; /* number of channels */
43 ulong chan; /* channel descriptions */
44 Memcmap *cmap;
45
46 Memdata *data; /* pointer to data; shared by windows in this image */
47 int zero; /* data->bdata+zero==&byte containing (0,0) */
48 ulong width; /* width in words of a single scan line */
49 Memlayer *layer; /* nil if not a layer*/
50 ulong flags;
51
52 int shift[NChan];
53 int mask[NChan];
54 int nbits[NChan];
55
56 void *X;
57};
58
59struct Memcmap
60{
61 uchar cmap2rgb[3*256];
62 uchar rgb2cmap[16*16*16];
63};
64
65/*
66 * Subfonts
67 *
68 * given char c, Subfont *f, Fontchar *i, and Point p, one says
69 * i = f->info+c;
70 * draw(b, Rect(p.x+i->left, p.y+i->top,
71 * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom),
72 * color, f->bits, Pt(i->x, i->top));
73 * p.x += i->width;
74 * to draw characters in the specified color (itself a Memimage) in Memimage b.
75 */
76
77struct Memsubfont
78{
79 char *name;
80 short n; /* number of chars in font */
81 uchar height; /* height of bitmap */
82 char ascent; /* top of bitmap to baseline */
83 Fontchar *info; /* n+1 character descriptors */
84 Memimage *bits; /* of font */
85};
86
87/*
88 * Encapsulated parameters and information for sub-draw routines.
89 */
90enum {
91 Simplesrc=1<<0,
92 Simplemask=1<<1,
93 Replsrc=1<<2,
94 Replmask=1<<3,
95 Fullmask=1<<4,
96};
97struct Memdrawparam
98{
99 Memimage *dst;
100 Rectangle r;
101 Memimage *src;
102 Rectangle sr;
103 Memimage *mask;
104 Rectangle mr;
105 int op;
106
107 ulong state;
108 ulong mval; /* if Simplemask, the mask pixel in mask format */
109 ulong mrgba; /* mval in rgba */
110 ulong sval; /* if Simplesrc, the source pixel in src format */
111 ulong srgba; /* sval in rgba */
112 ulong sdval; /* sval in dst format */
113};
114
115/*
116 * Memimage management
117 */
118
119extern Memimage* allocmemimage(Rectangle, ulong);
120extern Memimage* _allocmemimage(Rectangle, ulong);
121extern Memimage* allocmemimaged(Rectangle, ulong, Memdata*, void*);
122extern Memimage* readmemimage(int);
123extern Memimage* creadmemimage(int);
124extern int writememimage(int, Memimage*);
125extern void freememimage(Memimage*);
126extern int _loadmemimage(Memimage*, Rectangle, uchar*, int);
127extern int _cloadmemimage(Memimage*, Rectangle, uchar*, int);
128extern int _unloadmemimage(Memimage*, Rectangle, uchar*, int);
129extern int loadmemimage(Memimage*, Rectangle, uchar*, int);
130extern int cloadmemimage(Memimage*, Rectangle, uchar*, int);
131extern int unloadmemimage(Memimage*, Rectangle, uchar*, int);
132extern ulong* wordaddr(Memimage*, Point);
133extern uchar* byteaddr(Memimage*, Point);
134extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*);
135extern void memfillcolor(Memimage*, ulong);
136extern int memsetchan(Memimage*, ulong);
137
138/*
139 * Graphics
140 */
141extern void memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int);
142extern void memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int);
143extern void mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int);
144extern void memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int);
145extern void _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int);
146extern Memdrawparam* _memimagedrawsetup(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int);
147extern void _memimagedraw(Memdrawparam*);
148extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int);
149extern int hwdraw(Memdrawparam*);
150extern void memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int);
151extern void _memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int);
152extern Point memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*);
153extern void memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int);
154extern void memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int);
155extern Rectangle memlinebbox(Point, Point, int, int, int);
156extern int memlineendsize(int);
157extern void _memmkcmap(void);
158extern void memimageinit(void);
159
160/*
161 * Subfont management
162 */
163extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*);
164extern Memsubfont* openmemsubfont(char*);
165extern void freememsubfont(Memsubfont*);
166extern Point memsubfontwidth(Memsubfont*, char*);
167extern Memsubfont* getmemdefont(void);
168
169/*
170 * Predefined
171 */
172extern Memimage* memwhite;
173extern Memimage* memblack;
174extern Memimage* memopaque;
175extern Memimage* memtransparent;
176extern Memcmap *memdefcmap;
177
178/*
179 * Kernel interface
180 */
181void memimagemove(void*, void*);
182
183/*
184 * Kernel cruft
185 */
186extern void rdb(void);
187extern int iprint(char*, ...);
188#pragma varargck argpos iprint 1
189extern int drawdebug;
190
191/*
192 * doprint interface: numbconv bit strings
193 */
194#pragma varargck type "llb" vlong
195#pragma varargck type "llb" uvlong
196#pragma varargck type "lb" long
197#pragma varargck type "lb" ulong
198#pragma varargck type "b" int
199#pragma varargck type "b" uint
200
include/memlayer.h+51−0
@@ -0,0 +1,51 @@
1#pragma src "/sys/src/libmemlayer"
2#pragma lib "libmemlayer.a"
3
4typedef struct Memscreen Memscreen;
5typedef void (*Refreshfn)(Memimage*, Rectangle, void*);
6
7struct Memscreen
8{
9 Memimage *frontmost; /* frontmost layer on screen */
10 Memimage *rearmost; /* rearmost layer on screen */
11 Memimage *image; /* upon which all layers are drawn */
12 Memimage *fill; /* if non-zero, picture to use when repainting */
13};
14
15struct Memlayer
16{
17 Rectangle screenr; /* true position of layer on screen */
18 Point delta; /* add delta to go from image coords to screen */
19 Memscreen *screen; /* screen this layer belongs to */
20 Memimage *front; /* window in front of this one */
21 Memimage *rear; /* window behind this one*/
22 int clear; /* layer is fully visible */
23 Memimage *save; /* save area for obscured parts */
24 Refreshfn refreshfn; /* function to call to refresh obscured parts if save==nil */
25 void *refreshptr; /* argument to refreshfn */
26};
27
28/*
29 * These functions accept local coordinates
30 */
31int memload(Memimage*, Rectangle, uchar*, int, int);
32int memunload(Memimage*, Rectangle, uchar*, int);
33
34/*
35 * All these functions accept screen coordinates, not local ones.
36 */
37void _memlayerop(void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), Memimage*, Rectangle, Rectangle, void*);
38Memimage* memlalloc(Memscreen*, Rectangle, Refreshfn, void*, ulong);
39void memldelete(Memimage*);
40void memlfree(Memimage*);
41void memltofront(Memimage*);
42void memltofrontn(Memimage**, int);
43void _memltofrontfill(Memimage*, int);
44void memltorear(Memimage*);
45void memltorearn(Memimage**, int);
46int memlsetrefresh(Memimage*, Refreshfn, void*);
47void memlhide(Memimage*, Rectangle);
48void memlexpose(Memimage*, Rectangle);
49void _memlsetclear(Memscreen*);
50int memlorigin(Memimage*, Point, Point);
51void memlnorefresh(Memimage*, Rectangle, void*);
include/mp.h+134−0
@@ -0,0 +1,134 @@
1#define _MPINT 1
2
3// the code assumes mpdigit to be at least an int
4// mpdigit must be an atomic type. mpdigit is defined
5// in the architecture specific u.h
6
7typedef struct mpint mpint;
8
9struct mpint
10{
11 int sign; // +1 or -1
12 int size; // allocated digits
13 int top; // significant digits
14 mpdigit *p;
15 char flags;
16};
17
18enum
19{
20 MPstatic= 0x01,
21 Dbytes= sizeof(mpdigit), // bytes per digit
22 Dbits= Dbytes*8 // bits per digit
23};
24
25// allocation
26void mpsetminbits(int n); // newly created mpint's get at least n bits
27mpint* mpnew(int n); // create a new mpint with at least n bits
28void mpfree(mpint *b);
29void mpbits(mpint *b, int n); // ensure that b has at least n bits
30void mpnorm(mpint *b); // dump leading zeros
31mpint* mpcopy(mpint *b);
32void mpassign(mpint *old, mpint *new);
33
34// random bits
35mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b);
36
37// conversion
38mpint* strtomp(char*, char**, int, mpint*); // ascii
39int mpfmt(Fmt*);
40char* mptoa(mpint*, int, char*, int);
41mpint* letomp(uchar*, uint, mpint*); // byte array, little-endian
42int mptole(mpint*, uchar*, uint, uchar**);
43mpint* betomp(uchar*, uint, mpint*); // byte array, little-endian
44int mptobe(mpint*, uchar*, uint, uchar**);
45uint mptoui(mpint*); // unsigned int
46mpint* uitomp(uint, mpint*);
47int mptoi(mpint*); // int
48mpint* itomp(int, mpint*);
49uvlong mptouv(mpint*); // unsigned vlong
50mpint* uvtomp(uvlong, mpint*);
51vlong mptov(mpint*); // vlong
52mpint* vtomp(vlong, mpint*);
53
54// divide 2 digits by one
55void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient);
56
57// in the following, the result mpint may be
58// the same as one of the inputs.
59void mpadd(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2
60void mpsub(mpint *b1, mpint *b2, mpint *diff); // diff = b1-b2
61void mpleft(mpint *b, int shift, mpint *res); // res = b<<shift
62void mpright(mpint *b, int shift, mpint *res); // res = b>>shift
63void mpmul(mpint *b1, mpint *b2, mpint *prod); // prod = b1*b2
64void mpexp(mpint *b, mpint *e, mpint *m, mpint *res); // res = b**e mod m
65void mpmod(mpint *b, mpint *m, mpint *remainder); // remainder = b mod m
66
67// quotient = dividend/divisor, remainder = dividend % divisor
68void mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder);
69
70// return neg, 0, pos as b1-b2 is neg, 0, pos
71int mpcmp(mpint *b1, mpint *b2);
72
73// extended gcd return d, x, and y, s.t. d = gcd(a,b) and ax+by = d
74void mpextendedgcd(mpint *a, mpint *b, mpint *d, mpint *x, mpint *y);
75
76// res = b**-1 mod m
77void mpinvert(mpint *b, mpint *m, mpint *res);
78
79// bit counting
80int mpsignif(mpint*); // number of sigificant bits in mantissa
81int mplowbits0(mpint*); // k, where n = 2**k * q for odd q
82
83// well known constants
84extern mpint *mpzero, *mpone, *mptwo;
85
86// sum[0:alen] = a[0:alen-1] + b[0:blen-1]
87// prereq: alen >= blen, sum has room for alen+1 digits
88void mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum);
89
90// diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
91// prereq: alen >= blen, diff has room for alen digits
92void mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff);
93
94// p[0:n] += m * b[0:n-1]
95// prereq: p has room for n+1 digits
96void mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p);
97
98// p[0:n] -= m * b[0:n-1]
99// prereq: p has room for n+1 digits
100int mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p);
101
102// p[0:alen*blen-1] = a[0:alen-1] * b[0:blen-1]
103// prereq: alen >= blen, p has room for m*n digits
104void mpvecmul(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p);
105
106// sign of a - b or zero if the same
107int mpveccmp(mpdigit *a, int alen, mpdigit *b, int blen);
108
109// divide the 2 digit dividend by the one digit divisor and stick in quotient
110// we assume that the result is one digit - overflow is all 1's
111void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient);
112
113// playing with magnitudes
114int mpmagcmp(mpint *b1, mpint *b2);
115void mpmagadd(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2
116void mpmagsub(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2
117
118// chinese remainder theorem
119typedef struct CRTpre CRTpre; // precomputed values for converting
120 // twixt residues and mpint
121typedef struct CRTres CRTres; // residue form of an mpint
122
123struct CRTres
124{
125 int n; // number of residues
126 mpint *r[1]; // residues
127};
128
129CRTpre* crtpre(int, mpint**); // precompute conversion values
130CRTres* crtin(CRTpre*, mpint*); // convert mpint to residues
131void crtout(CRTpre*, CRTres*, mpint*); // convert residues to mpint
132void crtprefree(CRTpre*);
133void crtresfree(CRTres*);
134
include/u.h+26−0
@@ -0,0 +1,26 @@
1#include "dtos.h"
2
3/* avoid name conflicts */
4#undef accept
5#undef listen
6
7/* sys calls */
8#undef bind
9#undef chdir
10#undef close
11#undef create
12#undef dup
13#undef export
14#undef fstat
15#undef fwstat
16#undef mount
17#undef open
18#undef start
19#undef read
20#undef remove
21#undef seek
22#undef stat
23#undef write
24#undef wstat
25#undef unmount
26#undef pipe
include/unix.h+14−0
@@ -0,0 +1,14 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <math.h>
5#include <fcntl.h>
6#include <setjmp.h>
7#include <time.h>
8#include <assert.h>
9#include <unistd.h>
10#include <stdarg.h>
11
12
13typedef long long p9_vlong;
14typedef unsigned long long p9_uvlong;
include/user.h+65−0
@@ -0,0 +1,65 @@
1/* sys calls */
2#define bind sysbind
3#define chdir syschdir
4#define close sysclose
5#define create syscreate
6#define dup sysdup
7#define export sysexport
8#define fstat sysfstat
9#define fwstat sysfwstat
10#define mount sysmount
11#define open sysopen
12#define read sysread
13#define remove sysremove
14#define seek sysseek
15#define stat sysstat
16#define write syswrite
17#define wstat syswstat
18#define unmount sysunmount
19#define pipe syspipe
20#define rendezvous sysrendezvous
21#define getpid sysgetpid
22#define time systime
23#define nsec sysnsec
24#define pread syspread
25#define pwrite syspwrite
26
27extern int bind(char*, char*, int);
28extern int chdir(char*);
29extern int close(int);
30extern int create(char*, int, ulong);
31extern int dup(int, int);
32extern int export(int);
33extern int fstat(int, uchar*, int);
34extern int fwstat(int, uchar*, int);
35extern int mount(int, int, char*, int, char*);
36extern int unmount(char*, char*);
37extern int open(char*, int);
38extern int pipe(int*);
39extern long read(int, void*, long);
40extern long readn(int, void*, long);
41extern int remove(char*);
42extern vlong seek(int, vlong, int);
43extern int stat(char*, uchar*, int);
44extern long write(int, void*, long);
45extern int wstat(char*, uchar*, int);
46
47extern Dir *dirstat(char*);
48extern Dir *dirfstat(int);
49extern int dirwstat(char*, Dir*);
50extern int dirfwstat(int, Dir*);
51extern long dirread(int, Dir*, long);
52
53/*
54 * network dialing and authentication
55 */
56#define NETPATHLEN 40
57extern int accept(int, char*);
58extern int announce(char*, char*);
59extern int dial(char*, char*, char*, int*);
60extern int hangup(int);
61extern int listen(char*, char*);
62extern char *netmkaddr(char*, char*, char*);
63extern int reject(int, char*, char*);
64
65extern char* argv0;
include/x+0−0

Empty file added.

include/x.c+6−0
@@ -0,0 +1,6 @@
1#include <stdio.h>
2
3void
4main(void)
5{
6}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t