Showing the changes to include (19 of 382 files). Show all
Unified · Split
Binary file not shown.
| @@ -0,0 +1,144 @@ | ||
| 1 | +#pragma src "/sys/src/libauth" | |
| 2 | +#pragma lib "libauth.a" | |
| 3 | + | |
| 4 | +/* | |
| 5 | + * Interface for typical callers. | |
| 6 | + */ | |
| 7 | + | |
| 8 | +typedef struct AuthInfo AuthInfo; | |
| 9 | +typedef struct Chalstate Chalstate; | |
| 10 | +typedef struct Chapreply Chapreply; | |
| 11 | +typedef struct MSchapreply MSchapreply; | |
| 12 | +typedef struct UserPasswd UserPasswd; | |
| 13 | +typedef struct AuthRpc AuthRpc; | |
| 14 | + | |
| 15 | +enum | |
| 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 | + | |
| 35 | +struct AuthRpc | |
| 36 | +{ | |
| 37 | + int afd; | |
| 38 | + char ibuf[AuthRpcMax]; | |
| 39 | + char obuf[AuthRpcMax]; | |
| 40 | + char *arg; | |
| 41 | + uint narg; | |
| 42 | +}; | |
| 43 | + | |
| 44 | +struct 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 | + | |
| 53 | +struct 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 | + | |
| 68 | +struct Chapreply /* for protocol "chap" */ | |
| 69 | +{ | |
| 70 | + uchar id; | |
| 71 | + char resp[MD5LEN]; | |
| 72 | +}; | |
| 73 | + | |
| 74 | +struct MSchapreply /* for protocol "mschap" */ | |
| 75 | +{ | |
| 76 | + char LMresp[24]; /* Lan Manager response */ | |
| 77 | + char NTresp[24]; /* NT response */ | |
| 78 | +}; | |
| 79 | + | |
| 80 | +struct UserPasswd | |
| 81 | +{ | |
| 82 | + char *user; | |
| 83 | + char *passwd; | |
| 84 | +}; | |
| 85 | + | |
| 86 | +extern int newns(char*, char*); | |
| 87 | +extern int addns(char*, char*); | |
| 88 | + | |
| 89 | +extern int noworld(char*); | |
| 90 | +extern int amount(int, char*, int, char*); | |
| 91 | + | |
| 92 | +/* these two may get generalized away -rsc */ | |
| 93 | +extern int login(char*, char*, char*); | |
| 94 | +extern int httpauth(char*, char*); | |
| 95 | + | |
| 96 | +typedef struct Attr Attr; | |
| 97 | +typedef struct String String; | |
| 98 | +enum { | |
| 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 | +}; | |
| 103 | +struct Attr | |
| 104 | +{ | |
| 105 | + int type; | |
| 106 | + Attr *next; | |
| 107 | + char *name; | |
| 108 | + char *val; | |
| 109 | +}; | |
| 110 | + | |
| 111 | +typedef int AuthGetkey(char*); | |
| 112 | + | |
| 113 | +int _attrfmt(Fmt*); | |
| 114 | +Attr *_copyattr(Attr*); | |
| 115 | +Attr *_delattr(Attr*, char*); | |
| 116 | +Attr *_findattr(Attr*, char*); | |
| 117 | +void _freeattr(Attr*); | |
| 118 | +Attr *_mkattr(int, char*, char*, Attr*); | |
| 119 | +Attr *_parseattr(char*); | |
| 120 | +char *_strfindattr(Attr*, char*); | |
| 121 | +#pragma varargck type "A" Attr* | |
| 122 | + | |
| 123 | +extern AuthInfo* fauth_proxy(int, AuthRpc *rpc, AuthGetkey *getkey, char *params); | |
| 124 | +extern AuthInfo* auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...); | |
| 125 | +extern int auth_getkey(char*); | |
| 126 | +extern int (*amount_getkey)(char*); | |
| 127 | +extern void auth_freeAI(AuthInfo *ai); | |
| 128 | +extern int auth_chuid(AuthInfo *ai, char *ns); | |
| 129 | +extern Chalstate *auth_challenge(char*, ...); | |
| 130 | +extern AuthInfo* auth_response(Chalstate*); | |
| 131 | +extern int auth_respond(void*, uint, char*, uint, void*, uint, AuthGetkey *getkey, char*, ...); | |
| 132 | +extern void auth_freechal(Chalstate*); | |
| 133 | +extern AuthInfo* auth_userpasswd(char *user, char *passwd); | |
| 134 | +extern UserPasswd* auth_getuserpasswd(AuthGetkey *getkey, char*, ...); | |
| 135 | +extern AuthInfo* auth_getinfo(AuthRpc *rpc); | |
| 136 | +extern AuthRpc* auth_allocrpc(int afd); | |
| 137 | +extern Attr* auth_attr(AuthRpc *rpc); | |
| 138 | +extern void auth_freerpc(AuthRpc *rpc); | |
| 139 | +extern uint auth_rpc(AuthRpc *rpc, char *verb, void *a, int n); | |
| 140 | +extern 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 | |
| @@ -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 | + */ | |
| 7 | +typedef struct Ticket Ticket; | |
| 8 | +typedef struct Ticketreq Ticketreq; | |
| 9 | +typedef struct Authenticator Authenticator; | |
| 10 | +typedef struct Nvrsafe Nvrsafe; | |
| 11 | +typedef struct Passwordreq Passwordreq; | |
| 12 | +typedef struct OChapreply OChapreply; | |
| 13 | +typedef struct OMSchapreply OMSchapreply; | |
| 14 | + | |
| 15 | +enum | |
| 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) */ | |
| 33 | +enum | |
| 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 | + | |
| 58 | +struct 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 | + | |
| 69 | +struct 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 | + | |
| 79 | +struct 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 | + | |
| 87 | +struct 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 | + | |
| 97 | +struct OChapreply | |
| 98 | +{ | |
| 99 | + uchar id; | |
| 100 | + char uid[ANAMELEN]; | |
| 101 | + char resp[OMD5LEN]; | |
| 102 | +}; | |
| 103 | + | |
| 104 | +struct 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 | + */ | |
| 114 | +extern int convT2M(Ticket*, char*, char*); | |
| 115 | +extern void convM2T(char*, Ticket*, char*); | |
| 116 | +extern void convM2Tnoenc(char*, Ticket*); | |
| 117 | +extern int convA2M(Authenticator*, char*, char*); | |
| 118 | +extern void convM2A(char*, Authenticator*, char*); | |
| 119 | +extern int convTR2M(Ticketreq*, char*); | |
| 120 | +extern void convM2TR(char*, Ticketreq*); | |
| 121 | +extern int convPR2M(Passwordreq*, char*, char*); | |
| 122 | +extern void convM2PR(char*, Passwordreq*, char*); | |
| 123 | + | |
| 124 | +/* | |
| 125 | + * convert ascii password to DES key | |
| 126 | + */ | |
| 127 | +extern int opasstokey(char*, char*); | |
| 128 | +extern int passtokey(char*, char*); | |
| 129 | + | |
| 130 | +/* | |
| 131 | + * Nvram interface | |
| 132 | + */ | |
| 133 | +enum { | |
| 134 | + NVwrite = 1<<0, /* always prompt and rewrite nvram */ | |
| 135 | + NVwriteonerr = 1<<1, /* prompt and rewrite nvram when corrupt */ | |
| 136 | +}; | |
| 137 | + | |
| 138 | +struct 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 | + | |
| 152 | +extern uchar nvcsum(void*, int); | |
| 153 | +extern int readnvram(Nvrsafe*, int); | |
| 154 | + | |
| 155 | +/* | |
| 156 | + * call up auth server | |
| 157 | + */ | |
| 158 | +extern int authdial(char *netroot, char *authdom); | |
| 159 | + | |
| 160 | +/* | |
| 161 | + * exchange messages with auth server | |
| 162 | + */ | |
| 163 | +extern int _asgetticket(int, char*, char*); | |
| 164 | +extern int _asrdresp(int, char*, int); | |
| 165 | +extern int sslnegotiate(int, Ticket*, char**, char**); | |
| 166 | +extern int srvsslnegotiate(int, Ticket*, char**, char**); | |
| @@ -0,0 +1,6 @@ | ||
| 1 | +struct Cursor | |
| 2 | +{ | |
| 3 | + Point offset; | |
| 4 | + uchar clr[2*16]; | |
| 5 | + uchar set[2*16]; | |
| 6 | +}; | |
| @@ -0,0 +1,519 @@ | ||
| 1 | +#pragma src "/sys/src/libdraw" | |
| 2 | +#pragma lib "libdraw.a" | |
| 3 | + | |
| 4 | +typedef struct Cachefont Cachefont; | |
| 5 | +typedef struct Cacheinfo Cacheinfo; | |
| 6 | +typedef struct Cachesubf Cachesubf; | |
| 7 | +typedef struct Display Display; | |
| 8 | +typedef struct Font Font; | |
| 9 | +typedef struct Fontchar Fontchar; | |
| 10 | +typedef struct Image Image; | |
| 11 | +typedef struct Mouse Mouse; | |
| 12 | +typedef struct Point Point; | |
| 13 | +typedef struct Rectangle Rectangle; | |
| 14 | +typedef struct RGB RGB; | |
| 15 | +typedef struct Screen Screen; | |
| 16 | +typedef struct Subfont Subfont; | |
| 17 | + | |
| 18 | +#pragma varargck type "R" Rectangle | |
| 19 | +#pragma varargck type "P" Point | |
| 20 | +extern int Rfmt(Fmt*); | |
| 21 | +extern int Pfmt(Fmt*); | |
| 22 | + | |
| 23 | +enum | |
| 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 | + | |
| 57 | +enum | |
| 58 | +{ | |
| 59 | + Displaybufsize = 8000, | |
| 60 | + ICOSSCALE = 1024, | |
| 61 | + Borderwidth = 4, | |
| 62 | +}; | |
| 63 | + | |
| 64 | +enum | |
| 65 | +{ | |
| 66 | + /* refresh methods */ | |
| 67 | + Refbackup = 0, | |
| 68 | + Refnone = 1, | |
| 69 | + Refmesg = 2 | |
| 70 | +}; | |
| 71 | +#define NOREFRESH ((void*)-1) | |
| 72 | + | |
| 73 | +enum | |
| 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 | + | |
| 84 | +typedef 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 | + */ | |
| 110 | +enum { | |
| 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 | + | |
| 130 | +enum { | |
| 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 | + | |
| 146 | +extern char* chantostr(char*, ulong); | |
| 147 | +extern ulong strtochan(char*); | |
| 148 | +extern int chantodepth(ulong); | |
| 149 | + | |
| 150 | +struct Point | |
| 151 | +{ | |
| 152 | + int x; | |
| 153 | + int y; | |
| 154 | +}; | |
| 155 | + | |
| 156 | +struct Rectangle | |
| 157 | +{ | |
| 158 | + Point min; | |
| 159 | + Point max; | |
| 160 | +}; | |
| 161 | + | |
| 162 | +typedef void (*Reffn)(Image*, Rectangle, void*); | |
| 163 | + | |
| 164 | +struct 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 | + | |
| 172 | +struct 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 | + | |
| 202 | +struct 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 | + | |
| 215 | +struct 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 | + | |
| 234 | +struct 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 | + | |
| 243 | +struct 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 | + | |
| 254 | +enum | |
| 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 | + | |
| 271 | +struct 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 | + | |
| 280 | +struct 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 | + | |
| 289 | +struct Cachesubf | |
| 290 | +{ | |
| 291 | + ulong age; /* for replacement */ | |
| 292 | + Cachefont *cf; /* font info that owns us */ | |
| 293 | + Subfont *f; /* attached subfont */ | |
| 294 | +}; | |
| 295 | + | |
| 296 | +struct 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 | + */ | |
| 320 | +extern Image* _allocimage(Image*, Display*, Rectangle, ulong, int, ulong, int, int); | |
| 321 | +extern Image* allocimage(Display*, Rectangle, ulong, int, ulong); | |
| 322 | +extern uchar* bufimage(Display*, int); | |
| 323 | +extern int bytesperline(Rectangle, int); | |
| 324 | +extern void closedisplay(Display*); | |
| 325 | +extern void drawerror(Display*, char*); | |
| 326 | +extern int flushimage(Display*, int); | |
| 327 | +extern int freeimage(Image*); | |
| 328 | +extern int _freeimage1(Image*); | |
| 329 | +extern int geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int); | |
| 330 | +extern int initdraw(void(*)(Display*, char*), char*, char*); | |
| 331 | +extern int newwindow(char*); | |
| 332 | +extern Display* initdisplay(char*, char*, void(*)(Display*, char*)); | |
| 333 | +extern int loadimage(Image*, Rectangle, uchar*, int); | |
| 334 | +extern int cloadimage(Image*, Rectangle, uchar*, int); | |
| 335 | +extern int getwindow(Display*, int); | |
| 336 | +extern int gengetwindow(Display*, char*, Image**, Screen**, int); | |
| 337 | +extern Image* readimage(Display*, int, int); | |
| 338 | +extern Image* creadimage(Display*, int, int); | |
| 339 | +extern int unloadimage(Image*, Rectangle, uchar*, int); | |
| 340 | +extern int wordsperline(Rectangle, int); | |
| 341 | +extern int writeimage(int, Image*, int); | |
| 342 | +extern Image* namedimage(Display*, char*); | |
| 343 | +extern int nameimage(Image*, char*, int); | |
| 344 | +extern Image* allocimagemix(Display*, ulong, ulong); | |
| 345 | + | |
| 346 | +/* | |
| 347 | + * Colors | |
| 348 | + */ | |
| 349 | +extern void readcolmap(Display*, RGB*); | |
| 350 | +extern void writecolmap(Display*, RGB*); | |
| 351 | +extern ulong setalpha(ulong, uchar); | |
| 352 | + | |
| 353 | +/* | |
| 354 | + * Windows | |
| 355 | + */ | |
| 356 | +extern Screen* allocscreen(Image*, Image*, int); | |
| 357 | +extern Image* _allocwindow(Image*, Screen*, Rectangle, int, ulong); | |
| 358 | +extern Image* allocwindow(Screen*, Rectangle, int, ulong); | |
| 359 | +extern void bottomnwindows(Image**, int); | |
| 360 | +extern void bottomwindow(Image*); | |
| 361 | +extern int freescreen(Screen*); | |
| 362 | +extern Screen* publicscreen(Display*, int, ulong); | |
| 363 | +extern void topnwindows(Image**, int); | |
| 364 | +extern void topwindow(Image*); | |
| 365 | +extern int originwindow(Image*, Point, Point); | |
| 366 | + | |
| 367 | +/* | |
| 368 | + * Geometry | |
| 369 | + */ | |
| 370 | +extern Point Pt(int, int); | |
| 371 | +extern Rectangle Rect(int, int, int, int); | |
| 372 | +extern Rectangle Rpt(Point, Point); | |
| 373 | +extern Point addpt(Point, Point); | |
| 374 | +extern Point subpt(Point, Point); | |
| 375 | +extern Point divpt(Point, int); | |
| 376 | +extern Point mulpt(Point, int); | |
| 377 | +extern int eqpt(Point, Point); | |
| 378 | +extern int eqrect(Rectangle, Rectangle); | |
| 379 | +extern Rectangle insetrect(Rectangle, int); | |
| 380 | +extern Rectangle rectaddpt(Rectangle, Point); | |
| 381 | +extern Rectangle rectsubpt(Rectangle, Point); | |
| 382 | +extern Rectangle canonrect(Rectangle); | |
| 383 | +extern int rectXrect(Rectangle, Rectangle); | |
| 384 | +extern int rectinrect(Rectangle, Rectangle); | |
| 385 | +extern void combinerect(Rectangle*, Rectangle); | |
| 386 | +extern int rectclip(Rectangle*, Rectangle); | |
| 387 | +extern int ptinrect(Point, Rectangle); | |
| 388 | +extern void replclipr(Image*, int, Rectangle); | |
| 389 | +extern int drawreplxy(int, int, int); /* used to be drawsetxy */ | |
| 390 | +extern Point drawrepl(Rectangle, Point); | |
| 391 | +extern int rgb2cmap(int, int, int); | |
| 392 | +extern int cmap2rgb(int); | |
| 393 | +extern int cmap2rgba(int); | |
| 394 | +extern void icossin(int, int*, int*); | |
| 395 | +extern void icossin2(int, int, int*, int*); | |
| 396 | + | |
| 397 | +/* | |
| 398 | + * Graphics | |
| 399 | + */ | |
| 400 | +extern void draw(Image*, Rectangle, Image*, Image*, Point); | |
| 401 | +extern void drawop(Image*, Rectangle, Image*, Image*, Point, Drawop); | |
| 402 | +extern void gendraw(Image*, Rectangle, Image*, Point, Image*, Point); | |
| 403 | +extern void gendrawop(Image*, Rectangle, Image*, Point, Image*, Point, Drawop); | |
| 404 | +extern void line(Image*, Point, Point, int, int, int, Image*, Point); | |
| 405 | +extern void lineop(Image*, Point, Point, int, int, int, Image*, Point, Drawop); | |
| 406 | +extern void poly(Image*, Point*, int, int, int, int, Image*, Point); | |
| 407 | +extern void polyop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); | |
| 408 | +extern void fillpoly(Image*, Point*, int, int, Image*, Point); | |
| 409 | +extern void fillpolyop(Image*, Point*, int, int, Image*, Point, Drawop); | |
| 410 | +extern Point string(Image*, Point, Image*, Point, Font*, char*); | |
| 411 | +extern Point stringop(Image*, Point, Image*, Point, Font*, char*, Drawop); | |
| 412 | +extern Point stringn(Image*, Point, Image*, Point, Font*, char*, int); | |
| 413 | +extern Point stringnop(Image*, Point, Image*, Point, Font*, char*, int, Drawop); | |
| 414 | +extern Point runestring(Image*, Point, Image*, Point, Font*, Rune*); | |
| 415 | +extern Point runestringop(Image*, Point, Image*, Point, Font*, Rune*, Drawop); | |
| 416 | +extern Point runestringn(Image*, Point, Image*, Point, Font*, Rune*, int); | |
| 417 | +extern Point runestringnop(Image*, Point, Image*, Point, Font*, Rune*, int, Drawop); | |
| 418 | +extern Point stringbg(Image*, Point, Image*, Point, Font*, char*, Image*, Point); | |
| 419 | +extern Point stringbgop(Image*, Point, Image*, Point, Font*, char*, Image*, Point, Drawop); | |
| 420 | +extern Point stringnbg(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point); | |
| 421 | +extern Point stringnbgop(Image*, Point, Image*, Point, Font*, char*, int, Image*, Point, Drawop); | |
| 422 | +extern Point runestringbg(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point); | |
| 423 | +extern Point runestringbgop(Image*, Point, Image*, Point, Font*, Rune*, Image*, Point, Drawop); | |
| 424 | +extern Point runestringnbg(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point); | |
| 425 | +extern Point runestringnbgop(Image*, Point, Image*, Point, Font*, Rune*, int, Image*, Point, Drawop); | |
| 426 | +extern Point _string(Image*, Point, Image*, Point, Font*, char*, Rune*, int, Rectangle, Image*, Point, Drawop); | |
| 427 | +extern Point stringsubfont(Image*, Point, Image*, Subfont*, char*); | |
| 428 | +extern int bezier(Image*, Point, Point, Point, Point, int, int, int, Image*, Point); | |
| 429 | +extern int bezierop(Image*, Point, Point, Point, Point, int, int, int, Image*, Point, Drawop); | |
| 430 | +extern int bezspline(Image*, Point*, int, int, int, int, Image*, Point); | |
| 431 | +extern int bezsplineop(Image*, Point*, int, int, int, int, Image*, Point, Drawop); | |
| 432 | +extern int bezsplinepts(Point*, int, Point**); | |
| 433 | +extern int fillbezier(Image*, Point, Point, Point, Point, int, Image*, Point); | |
| 434 | +extern int fillbezierop(Image*, Point, Point, Point, Point, int, Image*, Point, Drawop); | |
| 435 | +extern int fillbezspline(Image*, Point*, int, int, Image*, Point); | |
| 436 | +extern int fillbezsplineop(Image*, Point*, int, int, Image*, Point, Drawop); | |
| 437 | +extern void ellipse(Image*, Point, int, int, int, Image*, Point); | |
| 438 | +extern void ellipseop(Image*, Point, int, int, int, Image*, Point, Drawop); | |
| 439 | +extern void fillellipse(Image*, Point, int, int, Image*, Point); | |
| 440 | +extern void fillellipseop(Image*, Point, int, int, Image*, Point, Drawop); | |
| 441 | +extern void arc(Image*, Point, int, int, int, Image*, Point, int, int); | |
| 442 | +extern void arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop); | |
| 443 | +extern void fillarc(Image*, Point, int, int, Image*, Point, int, int); | |
| 444 | +extern void fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop); | |
| 445 | +extern void border(Image*, Rectangle, int, Image*, Point); | |
| 446 | +extern void borderop(Image*, Rectangle, int, Image*, Point, Drawop); | |
| 447 | + | |
| 448 | +/* | |
| 449 | + * Font management | |
| 450 | + */ | |
| 451 | +extern Font* openfont(Display*, char*); | |
| 452 | +extern Font* buildfont(Display*, char*, char*); | |
| 453 | +extern void freefont(Font*); | |
| 454 | +extern Font* mkfont(Subfont*, Rune); | |
| 455 | +extern int cachechars(Font*, char**, Rune**, ushort*, int, int*, char**); | |
| 456 | +extern void agefont(Font*); | |
| 457 | +extern Subfont* allocsubfont(char*, int, int, int, Fontchar*, Image*); | |
| 458 | +extern Subfont* lookupsubfont(Display*, char*); | |
| 459 | +extern void installsubfont(char*, Subfont*); | |
| 460 | +extern void uninstallsubfont(Subfont*); | |
| 461 | +extern void freesubfont(Subfont*); | |
| 462 | +extern Subfont* readsubfont(Display*, char*, int, int); | |
| 463 | +extern Subfont* readsubfonti(Display*, char*, int, Image*, int); | |
| 464 | +extern int writesubfont(int, Subfont*); | |
| 465 | +extern void _unpackinfo(Fontchar*, uchar*, int); | |
| 466 | +extern Point stringsize(Font*, char*); | |
| 467 | +extern int stringwidth(Font*, char*); | |
| 468 | +extern int stringnwidth(Font*, char*, int); | |
| 469 | +extern Point runestringsize(Font*, Rune*); | |
| 470 | +extern int runestringwidth(Font*, Rune*); | |
| 471 | +extern int runestringnwidth(Font*, Rune*, int); | |
| 472 | +extern Point strsubfontwidth(Subfont*, char*); | |
| 473 | +extern int loadchar(Font*, Rune, Cacheinfo*, int, int, char**); | |
| 474 | +extern char* subfontname(char*, char*, int); | |
| 475 | +extern Subfont* _getsubfont(Display*, char*); | |
| 476 | +extern Subfont* getdefont(Display*); | |
| 477 | +extern void lockdisplay(Display*); | |
| 478 | +extern void unlockdisplay(Display*); | |
| 479 | +extern int drawlsetrefresh(ulong, int, void*, void*); | |
| 480 | + | |
| 481 | +/* | |
| 482 | + * Predefined | |
| 483 | + */ | |
| 484 | +extern uchar defontdata[]; | |
| 485 | +extern int sizeofdefont; | |
| 486 | +extern Point ZP; | |
| 487 | +extern Rectangle ZR; | |
| 488 | + | |
| 489 | +/* | |
| 490 | + * Set up by initdraw() | |
| 491 | + */ | |
| 492 | +extern Display *display; | |
| 493 | +extern Font *font; | |
| 494 | +/* extern Image *screen; */ | |
| 495 | +extern Screen *_screen; | |
| 496 | +extern int _cursorfd; | |
| 497 | +extern int _drawdebug; /* set to 1 to see errors from flushimage */ | |
| 498 | +extern 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 */ | |
| 513 | +extern void _twiddlecompressed(uchar*, int); | |
| 514 | +extern int _compblocksize(Rectangle, int); | |
| 515 | + | |
| 516 | +/* XXX backwards helps; should go */ | |
| 517 | +extern int log2[]; | |
| 518 | +extern ulong drawld2chan[]; | |
| 519 | +extern void drawsetdebug(int); | |
| @@ -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 | |
| @@ -0,0 +1,110 @@ | ||
| 1 | +#define VERSION9P "9P2000" | |
| 2 | + | |
| 3 | +#define MAXWELEM 16 | |
| 4 | + | |
| 5 | +typedef | |
| 6 | +struct 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 | + | |
| 63 | +enum | |
| 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 | + | |
| 96 | +uint convM2S(uchar*, uint, Fcall*); | |
| 97 | +uint convS2M(Fcall*, uchar*, uint); | |
| 98 | +uint sizeS2M(Fcall*); | |
| 99 | + | |
| 100 | +int statcheck(uchar *abuf, uint nbuf); | |
| 101 | +uint convM2D(uchar*, uint, Dir*, char*); | |
| 102 | +uint convD2M(Dir*, uchar*, uint); | |
| 103 | +uint sizeD2M(Dir*); | |
| 104 | + | |
| 105 | +int fcallfmt(Fmt*); | |
| 106 | +int dirfmt(Fmt*); | |
| 107 | +int dirmodefmt(Fmt*); | |
| 108 | + | |
| 109 | +int read9pmsg(int, void*, uint); | |
| 110 | + | |
| @@ -0,0 +1,42 @@ | ||
| 1 | +#pragma src "/sys/src/libdraw" | |
| 2 | +#pragma lib "libdraw.a" | |
| 3 | + | |
| 4 | +typedef struct Keyboardctl Keyboardctl; | |
| 5 | +typedef struct Channel Channel; | |
| 6 | + | |
| 7 | +struct 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 | + | |
| 18 | +extern Keyboardctl* initkeyboard(char*); | |
| 19 | +extern int ctlkeyboard(Keyboardctl*, char*); | |
| 20 | +extern void closekeyboard(Keyboardctl*); | |
| 21 | + | |
| 22 | +enum { | |
| 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 | + | |
| @@ -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 | + | |
| 29 | +typedef unsigned char p9_uchar; | |
| 30 | +typedef unsigned int p9_uint; | |
| 31 | +typedef unsigned int p9_ulong; | |
| 32 | +typedef int p9_long; | |
| 33 | +typedef signed char p9_schar; | |
| 34 | +typedef unsigned short p9_ushort; | |
| 35 | +typedef unsigned short Rune; | |
| 36 | +typedef unsigned int p9_u32int; | |
| 37 | +typedef 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 | + | |
| 56 | +enum | |
| 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 | + */ | |
| 67 | +extern int runetochar(char*, Rune*); | |
| 68 | +extern int chartorune(Rune*, char*); | |
| 69 | +extern int runelen(long); | |
| 70 | +extern int fullrune(char*, int); | |
| 71 | + | |
| 72 | +extern int wstrtoutf(char*, Rune*, int); | |
| 73 | +extern int wstrutflen(Rune*); | |
| 74 | + | |
| 75 | +/* | |
| 76 | + * rune routines from converted str routines | |
| 77 | + */ | |
| 78 | +extern long utflen(char*); | |
| 79 | +extern char* utfrune(char*, long); | |
| 80 | +extern 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 | + | |
| 128 | +typedef struct Lock | |
| 129 | +{ | |
| 130 | + long key; | |
| 131 | +} Lock; | |
| 132 | + | |
| 133 | +typedef struct QLock | |
| 134 | +{ | |
| 135 | + Lock lk; | |
| 136 | + struct Proc *hold; | |
| 137 | + struct Proc *first; | |
| 138 | + struct Proc *last; | |
| 139 | +} QLock; | |
| 140 | + | |
| 141 | +typedef | |
| 142 | +struct Qid | |
| 143 | +{ | |
| 144 | + uvlong path; | |
| 145 | + ulong vers; | |
| 146 | + uchar type; | |
| 147 | +} Qid; | |
| 148 | + | |
| 149 | +typedef | |
| 150 | +struct 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 | + | |
| 166 | +typedef | |
| 167 | +struct 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 | + */ | |
| 177 | +typedef struct Fmt Fmt; | |
| 178 | +struct 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 | + | |
| 193 | +enum{ | |
| 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 | + | |
| 211 | +extern int print(char*, ...); | |
| 212 | +extern char* seprint(char*, char*, char*, ...); | |
| 213 | +extern char* vseprint(char*, char*, char*, va_list); | |
| 214 | +extern int snprint(char*, int, char*, ...); | |
| 215 | +extern int vsnprint(char*, int, char*, va_list); | |
| 216 | +extern char* smprint(char*, ...); | |
| 217 | +extern char* vsmprint(char*, va_list); | |
| 218 | +extern int sprint(char*, char*, ...); | |
| 219 | +extern int fprint(int, char*, ...); | |
| 220 | +extern int vfprint(int, char*, va_list); | |
| 221 | + | |
| 222 | +extern int (*doquote)(int); | |
| 223 | +extern int runesprint(Rune*, char*, ...); | |
| 224 | +extern int runesnprint(Rune*, int, char*, ...); | |
| 225 | +extern int runevsnprint(Rune*, int, char*, va_list); | |
| 226 | +extern Rune* runeseprint(Rune*, Rune*, char*, ...); | |
| 227 | +extern Rune* runevseprint(Rune*, Rune*, char*, va_list); | |
| 228 | +extern Rune* runesmprint(char*, ...); | |
| 229 | +extern Rune* runevsmprint(char*, va_list); | |
| 230 | + | |
| 231 | +extern int fmtfdinit(Fmt*, int, char*, int); | |
| 232 | +extern int fmtfdflush(Fmt*); | |
| 233 | +extern int fmtstrinit(Fmt*); | |
| 234 | +extern int fmtinstall(int, int (*)(Fmt*)); | |
| 235 | +extern char* fmtstrflush(Fmt*); | |
| 236 | +extern int runefmtstrinit(Fmt*); | |
| 237 | +extern Rune* runefmtstrflush(Fmt*); | |
| 238 | + | |
| 239 | +extern void* mallocz(ulong, int); | |
| 240 | + | |
| 241 | +extern void srand(long); | |
| 242 | +extern int rand(void); | |
| 243 | +extern int nrand(int); | |
| 244 | +extern long lrand(void); | |
| 245 | +extern long lnrand(long); | |
| 246 | +extern double frand(void); | |
| @@ -0,0 +1,3 @@ | ||
| 1 | +#include "lib.h" | |
| 2 | +#include "user.h" | |
| 3 | + | |
| @@ -0,0 +1,340 @@ | ||
| 1 | + | |
| 2 | +#ifndef _MPINT | |
| 3 | +typedef struct mpint mpint; | |
| 4 | +#endif | |
| 5 | + | |
| 6 | +///////////////////////////////////////////////////////// | |
| 7 | +// AES definitions | |
| 8 | +///////////////////////////////////////////////////////// | |
| 9 | + | |
| 10 | +enum | |
| 11 | +{ | |
| 12 | + AESbsize= 16, | |
| 13 | + AESmaxkey= 32, | |
| 14 | + AESmaxrounds= 14 | |
| 15 | +}; | |
| 16 | + | |
| 17 | +typedef struct AESstate AESstate; | |
| 18 | +struct 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 | + | |
| 29 | +void setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec); | |
| 30 | +void aesCBCencrypt(uchar *p, int len, AESstate *s); | |
| 31 | +void aesCBCdecrypt(uchar *p, int len, AESstate *s); | |
| 32 | + | |
| 33 | +///////////////////////////////////////////////////////// | |
| 34 | +// Blowfish Definitions | |
| 35 | +///////////////////////////////////////////////////////// | |
| 36 | + | |
| 37 | +enum | |
| 38 | +{ | |
| 39 | + BFbsize = 8, | |
| 40 | + BFrounds = 16 | |
| 41 | +}; | |
| 42 | + | |
| 43 | +// 16-round Blowfish | |
| 44 | +typedef struct BFstate BFstate; | |
| 45 | +struct 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 | + | |
| 56 | +void setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec); | |
| 57 | +void bfCBCencrypt(uchar*, int, BFstate*); | |
| 58 | +void bfCBCdecrypt(uchar*, int, BFstate*); | |
| 59 | +void bfECBencrypt(uchar*, int, BFstate*); | |
| 60 | +void bfECBdecrypt(uchar*, int, BFstate*); | |
| 61 | + | |
| 62 | +///////////////////////////////////////////////////////// | |
| 63 | +// DES definitions | |
| 64 | +///////////////////////////////////////////////////////// | |
| 65 | + | |
| 66 | +enum | |
| 67 | +{ | |
| 68 | + DESbsize= 8 | |
| 69 | +}; | |
| 70 | + | |
| 71 | +// single des | |
| 72 | +typedef struct DESstate DESstate; | |
| 73 | +struct 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 | + | |
| 81 | +void setupDESstate(DESstate *s, uchar key[8], uchar *ivec); | |
| 82 | +void des_key_setup(uchar[8], ulong[32]); | |
| 83 | +void block_cipher(ulong*, uchar*, int); | |
| 84 | +void desCBCencrypt(uchar*, int, DESstate*); | |
| 85 | +void desCBCdecrypt(uchar*, int, DESstate*); | |
| 86 | +void desECBencrypt(uchar*, int, DESstate*); | |
| 87 | +void desECBdecrypt(uchar*, int, DESstate*); | |
| 88 | + | |
| 89 | +// for backward compatibility with 7 byte DES key format | |
| 90 | +void des56to64(uchar *k56, uchar *k64); | |
| 91 | +void des64to56(uchar *k64, uchar *k56); | |
| 92 | +void key_setup(uchar[7], ulong[32]); | |
| 93 | + | |
| 94 | +// triple des encrypt/decrypt orderings | |
| 95 | +enum { | |
| 96 | + DES3E= 0, | |
| 97 | + DES3D= 1, | |
| 98 | + DES3EEE= 0, | |
| 99 | + DES3EDE= 2, | |
| 100 | + DES3DED= 5, | |
| 101 | + DES3DDD= 7 | |
| 102 | +}; | |
| 103 | + | |
| 104 | +typedef struct DES3state DES3state; | |
| 105 | +struct 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 | + | |
| 113 | +void setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec); | |
| 114 | +void triple_block_cipher(ulong keys[3][32], uchar*, int); | |
| 115 | +void des3CBCencrypt(uchar*, int, DES3state*); | |
| 116 | +void des3CBCdecrypt(uchar*, int, DES3state*); | |
| 117 | +void des3ECBencrypt(uchar*, int, DES3state*); | |
| 118 | +void des3ECBdecrypt(uchar*, int, DES3state*); | |
| 119 | + | |
| 120 | +///////////////////////////////////////////////////////// | |
| 121 | +// digests | |
| 122 | +///////////////////////////////////////////////////////// | |
| 123 | + | |
| 124 | +enum | |
| 125 | +{ | |
| 126 | + SHA1dlen= 20, /* SHA digest length */ | |
| 127 | + MD4dlen= 16, /* MD4 digest length */ | |
| 128 | + MD5dlen= 16 /* MD5 digest length */ | |
| 129 | +}; | |
| 130 | + | |
| 131 | +typedef struct DigestState DigestState; | |
| 132 | +struct DigestState | |
| 133 | +{ | |
| 134 | + ulong len; | |
| 135 | + u32int state[5]; | |
| 136 | + uchar buf[128]; | |
| 137 | + int blen; | |
| 138 | + char malloced; | |
| 139 | + char seeded; | |
| 140 | +}; | |
| 141 | +typedef struct DigestState SHAstate; /* obsolete name */ | |
| 142 | +typedef struct DigestState SHA1state; | |
| 143 | +typedef struct DigestState MD5state; | |
| 144 | +typedef struct DigestState MD4state; | |
| 145 | + | |
| 146 | +DigestState* md4(uchar*, ulong, uchar*, DigestState*); | |
| 147 | +DigestState* md5(uchar*, ulong, uchar*, DigestState*); | |
| 148 | +DigestState* sha1(uchar*, ulong, uchar*, DigestState*); | |
| 149 | +DigestState* hmac_md5(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); | |
| 150 | +DigestState* hmac_sha1(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); | |
| 151 | +char* sha1pickle(SHA1state*); | |
| 152 | +SHA1state* sha1unpickle(char*); | |
| 153 | + | |
| 154 | +///////////////////////////////////////////////////////// | |
| 155 | +// random number generation | |
| 156 | +///////////////////////////////////////////////////////// | |
| 157 | +void genrandom(uchar *buf, int nbytes); | |
| 158 | +void prng(uchar *buf, int nbytes); | |
| 159 | +ulong fastrand(void); | |
| 160 | +ulong nfastrand(ulong); | |
| 161 | + | |
| 162 | +///////////////////////////////////////////////////////// | |
| 163 | +// primes | |
| 164 | +///////////////////////////////////////////////////////// | |
| 165 | +void genprime(mpint *p, int n, int accuracy); // generate an n bit probable prime | |
| 166 | +void gensafeprime(mpint *p, mpint *alpha, int n, int accuracy); // prime and generator | |
| 167 | +void genstrongprime(mpint *p, int n, int accuracy); // generate an n bit strong prime | |
| 168 | +void DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]); | |
| 169 | +int probably_prime(mpint *n, int nrep); // miller-rabin test | |
| 170 | +int smallprimetest(mpint *p); // returns -1 if not prime, 0 otherwise | |
| 171 | + | |
| 172 | +///////////////////////////////////////////////////////// | |
| 173 | +// rc4 | |
| 174 | +///////////////////////////////////////////////////////// | |
| 175 | +typedef struct RC4state RC4state; | |
| 176 | +struct RC4state | |
| 177 | +{ | |
| 178 | + uchar state[256]; | |
| 179 | + uchar x; | |
| 180 | + uchar y; | |
| 181 | +}; | |
| 182 | + | |
| 183 | +void setupRC4state(RC4state*, uchar*, int); | |
| 184 | +void rc4(RC4state*, uchar*, int); | |
| 185 | +void rc4skip(RC4state*, int); | |
| 186 | +void rc4back(RC4state*, int); | |
| 187 | + | |
| 188 | +///////////////////////////////////////////////////////// | |
| 189 | +// rsa | |
| 190 | +///////////////////////////////////////////////////////// | |
| 191 | +typedef struct RSApub RSApub; | |
| 192 | +typedef struct RSApriv RSApriv; | |
| 193 | + | |
| 194 | +// public/encryption key | |
| 195 | +struct RSApub | |
| 196 | +{ | |
| 197 | + mpint *n; // modulus | |
| 198 | + mpint *ek; // exp (encryption key) | |
| 199 | +}; | |
| 200 | + | |
| 201 | +// private/decryption key | |
| 202 | +struct 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 | + | |
| 216 | +RSApriv* rsagen(int nlen, int elen, int rounds); | |
| 217 | +RSApriv* rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q); | |
| 218 | +mpint* rsaencrypt(RSApub *k, mpint *in, mpint *out); | |
| 219 | +mpint* rsadecrypt(RSApriv *k, mpint *in, mpint *out); | |
| 220 | +RSApub* rsapuballoc(void); | |
| 221 | +void rsapubfree(RSApub*); | |
| 222 | +RSApriv* rsaprivalloc(void); | |
| 223 | +void rsaprivfree(RSApriv*); | |
| 224 | +RSApub* rsaprivtopub(RSApriv*); | |
| 225 | +RSApub* X509toRSApub(uchar*, int, char*, int); | |
| 226 | +RSApriv* asn1toRSApriv(uchar*, int); | |
| 227 | +void asn1dump(uchar *der, int len); | |
| 228 | +uchar* decodepem(char *s, char *type, int *len); | |
| 229 | +uchar* X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen); | |
| 230 | +uchar* X509req(RSApriv *priv, char *subj, int *certlen); | |
| 231 | +char* X509verify(uchar *cert, int ncert, RSApub *pk); | |
| 232 | +void X509dump(uchar *cert, int ncert); | |
| 233 | +///////////////////////////////////////////////////////// | |
| 234 | +// elgamal | |
| 235 | +///////////////////////////////////////////////////////// | |
| 236 | +typedef struct EGpub EGpub; | |
| 237 | +typedef struct EGpriv EGpriv; | |
| 238 | +typedef struct EGsig EGsig; | |
| 239 | + | |
| 240 | +// public/encryption key | |
| 241 | +struct 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 | |
| 249 | +struct EGpriv | |
| 250 | +{ | |
| 251 | + EGpub pub; | |
| 252 | + mpint *secret; // (decryption key) | |
| 253 | +}; | |
| 254 | + | |
| 255 | +// signature | |
| 256 | +struct EGsig | |
| 257 | +{ | |
| 258 | + mpint *r, *s; | |
| 259 | +}; | |
| 260 | + | |
| 261 | +EGpriv* eggen(int nlen, int rounds); | |
| 262 | +mpint* egencrypt(EGpub *k, mpint *in, mpint *out); | |
| 263 | +mpint* egdecrypt(EGpriv *k, mpint *in, mpint *out); | |
| 264 | +EGsig* egsign(EGpriv *k, mpint *m); | |
| 265 | +int egverify(EGpub *k, EGsig *sig, mpint *m); | |
| 266 | +EGpub* egpuballoc(void); | |
| 267 | +void egpubfree(EGpub*); | |
| 268 | +EGpriv* egprivalloc(void); | |
| 269 | +void egprivfree(EGpriv*); | |
| 270 | +EGsig* egsigalloc(void); | |
| 271 | +void egsigfree(EGsig*); | |
| 272 | +EGpub* egprivtopub(EGpriv*); | |
| 273 | + | |
| 274 | +///////////////////////////////////////////////////////// | |
| 275 | +// dsa | |
| 276 | +///////////////////////////////////////////////////////// | |
| 277 | +typedef struct DSApub DSApub; | |
| 278 | +typedef struct DSApriv DSApriv; | |
| 279 | +typedef struct DSAsig DSAsig; | |
| 280 | + | |
| 281 | +// public/encryption key | |
| 282 | +struct 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 | |
| 291 | +struct DSApriv | |
| 292 | +{ | |
| 293 | + DSApub pub; | |
| 294 | + mpint *secret; // (decryption key) | |
| 295 | +}; | |
| 296 | + | |
| 297 | +// signature | |
| 298 | +struct DSAsig | |
| 299 | +{ | |
| 300 | + mpint *r, *s; | |
| 301 | +}; | |
| 302 | + | |
| 303 | +DSApriv* dsagen(DSApub *opub); | |
| 304 | +DSAsig* dsasign(DSApriv *k, mpint *m); | |
| 305 | +int dsaverify(DSApub *k, DSAsig *sig, mpint *m); | |
| 306 | +DSApub* dsapuballoc(void); | |
| 307 | +void dsapubfree(DSApub*); | |
| 308 | +DSApriv* dsaprivalloc(void); | |
| 309 | +void dsaprivfree(DSApriv*); | |
| 310 | +DSAsig* dsasigalloc(void); | |
| 311 | +void dsasigfree(DSAsig*); | |
| 312 | +DSApub* dsaprivtopub(DSApriv*); | |
| 313 | + | |
| 314 | +///////////////////////////////////////////////////////// | |
| 315 | +// TLS | |
| 316 | +///////////////////////////////////////////////////////// | |
| 317 | +typedef struct Thumbprint{ | |
| 318 | + struct Thumbprint *next; | |
| 319 | + uchar sha1[SHA1dlen]; | |
| 320 | +} Thumbprint; | |
| 321 | + | |
| 322 | +typedef 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 | |
| 331 | +extern int tlsClient(int fd, TLSconn *c); | |
| 332 | +extern int tlsServer(int fd, TLSconn *c); | |
| 333 | + | |
| 334 | +// thumb.c | |
| 335 | +extern Thumbprint* initThumbprints(char *ok, char *crl); | |
| 336 | +extern void freeThumbprints(Thumbprint *ok); | |
| 337 | +extern int okThumbprint(uchar *sha1, Thumbprint *ok); | |
| 338 | + | |
| 339 | +// readcert.c | |
| 340 | +extern uchar *readcert(char *filename, int *pcertlen); | |
| @@ -0,0 +1,200 @@ | ||
| 1 | +#pragma src "/sys/src/libmemdraw" | |
| 2 | +#pragma lib "libmemdraw.a" | |
| 3 | + | |
| 4 | +typedef struct Memimage Memimage; | |
| 5 | +typedef struct Memdata Memdata; | |
| 6 | +typedef struct Memsubfont Memsubfont; | |
| 7 | +typedef struct Memlayer Memlayer; | |
| 8 | +typedef struct Memcmap Memcmap; | |
| 9 | +typedef 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 | + | |
| 19 | +struct 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 | + | |
| 28 | +enum { | |
| 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 | + | |
| 37 | +struct 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 | + | |
| 59 | +struct 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 | + | |
| 77 | +struct 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 | + */ | |
| 90 | +enum { | |
| 91 | + Simplesrc=1<<0, | |
| 92 | + Simplemask=1<<1, | |
| 93 | + Replsrc=1<<2, | |
| 94 | + Replmask=1<<3, | |
| 95 | + Fullmask=1<<4, | |
| 96 | +}; | |
| 97 | +struct 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 | + | |
| 119 | +extern Memimage* allocmemimage(Rectangle, ulong); | |
| 120 | +extern Memimage* _allocmemimage(Rectangle, ulong); | |
| 121 | +extern Memimage* allocmemimaged(Rectangle, ulong, Memdata*, void*); | |
| 122 | +extern Memimage* readmemimage(int); | |
| 123 | +extern Memimage* creadmemimage(int); | |
| 124 | +extern int writememimage(int, Memimage*); | |
| 125 | +extern void freememimage(Memimage*); | |
| 126 | +extern int _loadmemimage(Memimage*, Rectangle, uchar*, int); | |
| 127 | +extern int _cloadmemimage(Memimage*, Rectangle, uchar*, int); | |
| 128 | +extern int _unloadmemimage(Memimage*, Rectangle, uchar*, int); | |
| 129 | +extern int loadmemimage(Memimage*, Rectangle, uchar*, int); | |
| 130 | +extern int cloadmemimage(Memimage*, Rectangle, uchar*, int); | |
| 131 | +extern int unloadmemimage(Memimage*, Rectangle, uchar*, int); | |
| 132 | +extern ulong* wordaddr(Memimage*, Point); | |
| 133 | +extern uchar* byteaddr(Memimage*, Point); | |
| 134 | +extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*); | |
| 135 | +extern void memfillcolor(Memimage*, ulong); | |
| 136 | +extern int memsetchan(Memimage*, ulong); | |
| 137 | + | |
| 138 | +/* | |
| 139 | + * Graphics | |
| 140 | + */ | |
| 141 | +extern void memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); | |
| 142 | +extern void memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); | |
| 143 | +extern void mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int); | |
| 144 | +extern void memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int); | |
| 145 | +extern void _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int); | |
| 146 | +extern Memdrawparam* _memimagedrawsetup(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); | |
| 147 | +extern void _memimagedraw(Memdrawparam*); | |
| 148 | +extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); | |
| 149 | +extern int hwdraw(Memdrawparam*); | |
| 150 | +extern void memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); | |
| 151 | +extern void _memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int); | |
| 152 | +extern Point memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*); | |
| 153 | +extern void memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int); | |
| 154 | +extern void memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int); | |
| 155 | +extern Rectangle memlinebbox(Point, Point, int, int, int); | |
| 156 | +extern int memlineendsize(int); | |
| 157 | +extern void _memmkcmap(void); | |
| 158 | +extern void memimageinit(void); | |
| 159 | + | |
| 160 | +/* | |
| 161 | + * Subfont management | |
| 162 | + */ | |
| 163 | +extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*); | |
| 164 | +extern Memsubfont* openmemsubfont(char*); | |
| 165 | +extern void freememsubfont(Memsubfont*); | |
| 166 | +extern Point memsubfontwidth(Memsubfont*, char*); | |
| 167 | +extern Memsubfont* getmemdefont(void); | |
| 168 | + | |
| 169 | +/* | |
| 170 | + * Predefined | |
| 171 | + */ | |
| 172 | +extern Memimage* memwhite; | |
| 173 | +extern Memimage* memblack; | |
| 174 | +extern Memimage* memopaque; | |
| 175 | +extern Memimage* memtransparent; | |
| 176 | +extern Memcmap *memdefcmap; | |
| 177 | + | |
| 178 | +/* | |
| 179 | + * Kernel interface | |
| 180 | + */ | |
| 181 | +void memimagemove(void*, void*); | |
| 182 | + | |
| 183 | +/* | |
| 184 | + * Kernel cruft | |
| 185 | + */ | |
| 186 | +extern void rdb(void); | |
| 187 | +extern int iprint(char*, ...); | |
| 188 | +#pragma varargck argpos iprint 1 | |
| 189 | +extern 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 | + | |
| @@ -0,0 +1,51 @@ | ||
| 1 | +#pragma src "/sys/src/libmemlayer" | |
| 2 | +#pragma lib "libmemlayer.a" | |
| 3 | + | |
| 4 | +typedef struct Memscreen Memscreen; | |
| 5 | +typedef void (*Refreshfn)(Memimage*, Rectangle, void*); | |
| 6 | + | |
| 7 | +struct 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 | + | |
| 15 | +struct 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 | + */ | |
| 31 | +int memload(Memimage*, Rectangle, uchar*, int, int); | |
| 32 | +int memunload(Memimage*, Rectangle, uchar*, int); | |
| 33 | + | |
| 34 | +/* | |
| 35 | + * All these functions accept screen coordinates, not local ones. | |
| 36 | + */ | |
| 37 | +void _memlayerop(void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), Memimage*, Rectangle, Rectangle, void*); | |
| 38 | +Memimage* memlalloc(Memscreen*, Rectangle, Refreshfn, void*, ulong); | |
| 39 | +void memldelete(Memimage*); | |
| 40 | +void memlfree(Memimage*); | |
| 41 | +void memltofront(Memimage*); | |
| 42 | +void memltofrontn(Memimage**, int); | |
| 43 | +void _memltofrontfill(Memimage*, int); | |
| 44 | +void memltorear(Memimage*); | |
| 45 | +void memltorearn(Memimage**, int); | |
| 46 | +int memlsetrefresh(Memimage*, Refreshfn, void*); | |
| 47 | +void memlhide(Memimage*, Rectangle); | |
| 48 | +void memlexpose(Memimage*, Rectangle); | |
| 49 | +void _memlsetclear(Memscreen*); | |
| 50 | +int memlorigin(Memimage*, Point, Point); | |
| 51 | +void memlnorefresh(Memimage*, Rectangle, void*); | |
| @@ -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 | + | |
| 7 | +typedef struct mpint mpint; | |
| 8 | + | |
| 9 | +struct 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 | + | |
| 18 | +enum | |
| 19 | +{ | |
| 20 | + MPstatic= 0x01, | |
| 21 | + Dbytes= sizeof(mpdigit), // bytes per digit | |
| 22 | + Dbits= Dbytes*8 // bits per digit | |
| 23 | +}; | |
| 24 | + | |
| 25 | +// allocation | |
| 26 | +void mpsetminbits(int n); // newly created mpint's get at least n bits | |
| 27 | +mpint* mpnew(int n); // create a new mpint with at least n bits | |
| 28 | +void mpfree(mpint *b); | |
| 29 | +void mpbits(mpint *b, int n); // ensure that b has at least n bits | |
| 30 | +void mpnorm(mpint *b); // dump leading zeros | |
| 31 | +mpint* mpcopy(mpint *b); | |
| 32 | +void mpassign(mpint *old, mpint *new); | |
| 33 | + | |
| 34 | +// random bits | |
| 35 | +mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b); | |
| 36 | + | |
| 37 | +// conversion | |
| 38 | +mpint* strtomp(char*, char**, int, mpint*); // ascii | |
| 39 | +int mpfmt(Fmt*); | |
| 40 | +char* mptoa(mpint*, int, char*, int); | |
| 41 | +mpint* letomp(uchar*, uint, mpint*); // byte array, little-endian | |
| 42 | +int mptole(mpint*, uchar*, uint, uchar**); | |
| 43 | +mpint* betomp(uchar*, uint, mpint*); // byte array, little-endian | |
| 44 | +int mptobe(mpint*, uchar*, uint, uchar**); | |
| 45 | +uint mptoui(mpint*); // unsigned int | |
| 46 | +mpint* uitomp(uint, mpint*); | |
| 47 | +int mptoi(mpint*); // int | |
| 48 | +mpint* itomp(int, mpint*); | |
| 49 | +uvlong mptouv(mpint*); // unsigned vlong | |
| 50 | +mpint* uvtomp(uvlong, mpint*); | |
| 51 | +vlong mptov(mpint*); // vlong | |
| 52 | +mpint* vtomp(vlong, mpint*); | |
| 53 | + | |
| 54 | +// divide 2 digits by one | |
| 55 | +void 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. | |
| 59 | +void mpadd(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2 | |
| 60 | +void mpsub(mpint *b1, mpint *b2, mpint *diff); // diff = b1-b2 | |
| 61 | +void mpleft(mpint *b, int shift, mpint *res); // res = b<<shift | |
| 62 | +void mpright(mpint *b, int shift, mpint *res); // res = b>>shift | |
| 63 | +void mpmul(mpint *b1, mpint *b2, mpint *prod); // prod = b1*b2 | |
| 64 | +void mpexp(mpint *b, mpint *e, mpint *m, mpint *res); // res = b**e mod m | |
| 65 | +void mpmod(mpint *b, mpint *m, mpint *remainder); // remainder = b mod m | |
| 66 | + | |
| 67 | +// quotient = dividend/divisor, remainder = dividend % divisor | |
| 68 | +void mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder); | |
| 69 | + | |
| 70 | +// return neg, 0, pos as b1-b2 is neg, 0, pos | |
| 71 | +int mpcmp(mpint *b1, mpint *b2); | |
| 72 | + | |
| 73 | +// extended gcd return d, x, and y, s.t. d = gcd(a,b) and ax+by = d | |
| 74 | +void mpextendedgcd(mpint *a, mpint *b, mpint *d, mpint *x, mpint *y); | |
| 75 | + | |
| 76 | +// res = b**-1 mod m | |
| 77 | +void mpinvert(mpint *b, mpint *m, mpint *res); | |
| 78 | + | |
| 79 | +// bit counting | |
| 80 | +int mpsignif(mpint*); // number of sigificant bits in mantissa | |
| 81 | +int mplowbits0(mpint*); // k, where n = 2**k * q for odd q | |
| 82 | + | |
| 83 | +// well known constants | |
| 84 | +extern 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 | |
| 88 | +void 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 | |
| 92 | +void 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 | |
| 96 | +void 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 | |
| 100 | +int 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 | |
| 104 | +void mpvecmul(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p); | |
| 105 | + | |
| 106 | +// sign of a - b or zero if the same | |
| 107 | +int 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 | |
| 111 | +void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient); | |
| 112 | + | |
| 113 | +// playing with magnitudes | |
| 114 | +int mpmagcmp(mpint *b1, mpint *b2); | |
| 115 | +void mpmagadd(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2 | |
| 116 | +void mpmagsub(mpint *b1, mpint *b2, mpint *sum); // sum = b1+b2 | |
| 117 | + | |
| 118 | +// chinese remainder theorem | |
| 119 | +typedef struct CRTpre CRTpre; // precomputed values for converting | |
| 120 | + // twixt residues and mpint | |
| 121 | +typedef struct CRTres CRTres; // residue form of an mpint | |
| 122 | + | |
| 123 | +struct CRTres | |
| 124 | +{ | |
| 125 | + int n; // number of residues | |
| 126 | + mpint *r[1]; // residues | |
| 127 | +}; | |
| 128 | + | |
| 129 | +CRTpre* crtpre(int, mpint**); // precompute conversion values | |
| 130 | +CRTres* crtin(CRTpre*, mpint*); // convert mpint to residues | |
| 131 | +void crtout(CRTpre*, CRTres*, mpint*); // convert residues to mpint | |
| 132 | +void crtprefree(CRTpre*); | |
| 133 | +void crtresfree(CRTres*); | |
| 134 | + | |
| @@ -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 | |
| @@ -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 | + | |
| 13 | +typedef long long p9_vlong; | |
| 14 | +typedef unsigned long long p9_uvlong; | |
| @@ -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 | + | |
| 27 | +extern int bind(char*, char*, int); | |
| 28 | +extern int chdir(char*); | |
| 29 | +extern int close(int); | |
| 30 | +extern int create(char*, int, ulong); | |
| 31 | +extern int dup(int, int); | |
| 32 | +extern int export(int); | |
| 33 | +extern int fstat(int, uchar*, int); | |
| 34 | +extern int fwstat(int, uchar*, int); | |
| 35 | +extern int mount(int, int, char*, int, char*); | |
| 36 | +extern int unmount(char*, char*); | |
| 37 | +extern int open(char*, int); | |
| 38 | +extern int pipe(int*); | |
| 39 | +extern long read(int, void*, long); | |
| 40 | +extern long readn(int, void*, long); | |
| 41 | +extern int remove(char*); | |
| 42 | +extern vlong seek(int, vlong, int); | |
| 43 | +extern int stat(char*, uchar*, int); | |
| 44 | +extern long write(int, void*, long); | |
| 45 | +extern int wstat(char*, uchar*, int); | |
| 46 | + | |
| 47 | +extern Dir *dirstat(char*); | |
| 48 | +extern Dir *dirfstat(int); | |
| 49 | +extern int dirwstat(char*, Dir*); | |
| 50 | +extern int dirfwstat(int, Dir*); | |
| 51 | +extern long dirread(int, Dir*, long); | |
| 52 | + | |
| 53 | +/* | |
| 54 | + * network dialing and authentication | |
| 55 | + */ | |
| 56 | +#define NETPATHLEN 40 | |
| 57 | +extern int accept(int, char*); | |
| 58 | +extern int announce(char*, char*); | |
| 59 | +extern int dial(char*, char*, char*, int*); | |
| 60 | +extern int hangup(int); | |
| 61 | +extern int listen(char*, char*); | |
| 62 | +extern char *netmkaddr(char*, char*, char*); | |
| 63 | +extern int reject(int, char*, char*); | |
| 64 | + | |
| 65 | +extern char* argv0; | |
Empty file added.
| @@ -0,0 +1,6 @@ | ||
| 1 | +#include <stdio.h> | |
| 2 | + | |
| 3 | +void | |
| 4 | +main(void) | |
| 5 | +{ | |
| 6 | +} | |