History

fixes

Russ Cox committed 21 years ago

Commit ee5fc881 parent d6701f916 files · +209 −79Browse files

Unified · Split

16 files
  1. Make.unix +1 −1
  2. Make.win32 +3 −3
  3. cpu.c +1 −2
  4. gui-win32/Makefile +1 −2
  5. include/dtos.h +1 −0
  6. include/lib.h +0 −12
  7. kern/devcons.c +0 −25
  8. kern/devip-win32.c +15 −12
  9. kern/devip.c +1 −0
  10. kern/devroot.c +2 −0
  11. kern/devssl.c +1 −1
  12. kern/win32.c +174 −11
  13. libc/Makefile +0 −4
  14. libc/nan64.c +5 −5
  15. libmemdraw/draw.c +1 −1
  16. main.c +3 −0
Make.unix+1−1
@@ -5,7 +5,7 @@ AR=ar · 4 unmodified lines
55 AS=as
66 RANLIB=ranlib
77 CC=gcc
8−CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -D_THREAD_SAFE $(PTHREAD)
8+CFLAGS=-Wall -Wno-missing-braces -ggdb -I$(ROOT) -I$(ROOT)/include -I$(ROOT)/kern -c -D_THREAD_SAFE $(PTHREAD) -O2
99 O=o
1010 OS=posix
1111 GUI=x11
Make.win32+3−3
@@ -3,20 +3,20 @@ · 2 unmodified lines
33 # on another platform. Otherwise the binaries are just
44 # named gcc, etc.
55
6−MING=mingw32-
6+MING=i586-mingw32msvc-
77 #MING=
88 AR=$(MING)ar
99 CC=$(MING)gcc
1010 AS=$(MING)as
1111 RANLIB=$(MING)ranlib
12−CFLAGS=-Wall -Wno-missing-braces -I$(ROOT)/include -I$(ROOT) -I$(ROOT)/kern -c -D_X86_ -DIS_32 -DWINDOWS
12+CFLAGS=-Wall -Wno-missing-braces -I$(ROOT)/include -I$(ROOT) -I$(ROOT)/kern -c -D_X86_ -DIS_32 -DWINDOWS -O2
1313 O=o
1414 FS=fs-win32
1515 IP=win32
1616 OS=win32
1717 GUI=win32
1818 LDFLAGS=-mwindows
19−LDADD=-lkernel32 -ladvapi32 -lgdi32 -lmpr -lwsock32
19+LDADD=-lkernel32 -ladvapi32 -lgdi32 -lmpr -lwsock32 -lmsvcrt -lmingw32
2020 TARG=drawterm.exe
2121
2222 # Windows via MSVC
cpu.c+1−2
@@ -380,9 +380,8 @@ p9auth(int fd) · 379 unmodified lines
380380 return fd;
381381
382382 /* exchange random numbers */
383− srand(truerand());
384383 for(i = 0; i < 4; i++)
385− key[i] = rand();
384+ key[i] = fastrand();
386385 if(write(fd, key, 4) != 4)
387386 return -1;
388387 if(readn(fd, key+12, 4) != 4)
gui-win32/Makefile+1−2
@@ -7,8 +7,7 @@ OFILES=\ · 6 unmodified lines
77 cload.$O\
88 draw.$O\
99 load.$O\
10− screen.$O\
11− wstrtoutf.$O
10+ screen.$O
1211
1312 default: $(LIB)
1413 $(LIB): $(OFILES)
include/dtos.h+1−0
@@ -5,6 +5,7 @@ · 4 unmodified lines
55 # endif
66 #elif defined(WINDOWS)
77 # include "9windows.h"
8+# define main mymain
89 #else
910 # error "Define an OS"
1011 #endif
include/lib.h+0−12
@@ -15,11 +15,6 @@ · 14 unmodified lines
1515 #define log2 liblog2
1616 #define log liblog
1717 #define reboot libreboot
18−#define srand dtsrand
19−#define rand dtrand
20−#define nrand dtnrand
21−#define lrand dtlrand
22−#define lnrand dtlnrand
2318 #undef timeradd
2419 #define timeradd xtimeradd
2520
@@ -240,13 +235,6 @@ extern int fmtprint(Fmt*, char*, ...); · 214 unmodified lines
240235 extern int fmtvprint(Fmt*, char*, va_list);
241236 extern void* mallocz(ulong, int);
242237
243−extern void srand(long);
244−extern int rand(void);
245−extern int nrand(int);
246−extern long lrand(void);
247−extern long lnrand(long);
248−extern double frand(void);
249−
250238 extern ulong getcallerpc(void*);
251239 extern char* cleanname(char*);
252240 extern void sysfatal(char*, ...);
kern/devcons.c+0−25
@@ -60,7 +60,6 @@ static struct · 59 unmodified lines
6060 char *sysname;
6161 vlong fasthz;
6262
63−static void seedrand(void);
6463 static int readtime(ulong, char*, int);
6564 static int readbintime(char*, int);
6665 static int writetime(char*, int);
@@ -986,30 +985,6 @@ Dev consdevtab = { · 919 unmodified lines
986985 devwstat,
987986 };
988987
989−static ulong randn;
990−
991−static void
992−seedrand(void)
993−{
994− randomread((void*)&randn, sizeof(randn));
995−}
996−
997−int
998−xnrand(int n)
999−{
1000− if(randn == 0)
1001− seedrand();
1002− randn = randn*1103515245 + 12345 + fastticks(0);
1003− return (randn>>16) % n;
1004−}
1005−
1006−int
1007−rand(void)
1008−{
1009− xnrand(1);
1010− return randn;
1011−}
1012−
1013988 static uvlong uvorder = (uvlong) 0x0001020304050607ULL;
1014989
1015990 static uchar*
kern/devip-win32.c+15−12
@@ -46,12 +46,13 @@ so_socket(int type) · 45 unmodified lines
4646
4747 fd = socket(AF_INET, type, 0);
4848 if(fd < 0)
49− error(sys_errlist[errno]);
49+ oserror();
5050
5151 one = 1;
52− if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof(one)) > 0)
53− print("setsockopt: %s", sys_errlist[errno]);
54−
52+ if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof(one)) > 0){
53+ oserrstr();
54+ print("setsockopt: %s\n", up->errstr);
55+ }
5556
5657 return fd;
5758 }
@@ -68,7 +69,7 @@ so_connect(int fd, unsigned long raddr, unsigned short rport) · 10 unmodified lines
6869 hnputl(&sin.sin_addr.s_addr, raddr);
6970
7071 if(connect(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
71− error(sys_errlist[errno]);
72+ oserror();
7273 }
7374
7475 void
@@ -79,7 +80,7 @@ so_getsockname(int fd, unsigned long *laddr, unsigned short *lport) · 4 unmodified lines
7980
8081 len = sizeof(sin);
8182 if(getsockname(fd, (struct sockaddr*)&sin, &len) < 0)
82− error(sys_errlist[errno]);
83+ oserror();
8384
8485 if(sin.sin_family != AF_INET || len != sizeof(sin))
8586 error("not AF_INET");
@@ -92,7 +93,7 @@ void · 6 unmodified lines
9293 so_listen(int fd)
9394 {
9495 if(listen(fd, 5) < 0)
95− error(sys_errlist[errno]);
96+ oserror();
9697 }
9798
9899 int
@@ -104,7 +105,7 @@ so_accept(int fd, unsigned long *raddr, unsigned short *rport) · 5 unmodified lines
104105 len = sizeof(sin);
105106 nfd = accept(fd, (struct sockaddr*)&sin, &len);
106107 if(nfd < 0)
107− error(sys_errlist[errno]);
108+ oserror();
108109
109110 if(sin.sin_family != AF_INET || len != sizeof(sin))
110111 error("not AF_INET");
@@ -121,8 +122,10 @@ so_bind(int fd, int su, unsigned short port) · 10 unmodified lines
121122 struct sockaddr_in sin;
122123
123124 one = 1;
124− if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one)) < 0)
125− print("setsockopt: %s", sys_errlist[errno]);
125+ if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one)) < 0){
126+ oserrstr();
127+ print("setsockopt: %s", up->errstr);
128+ }
126129
127130 if(su) {
128131 for(i = 600; i < 1024; i++) {
@@ -133,7 +136,7 @@ so_bind(int fd, int su, unsigned short port) · 4 unmodified lines
133136 if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) >= 0)
134137 return;
135138 }
136− error(sys_errlist[errno]);
139+ oserror();
137140 }
138141
139142 memset(&sin, 0, sizeof(sin));
@@ -141,7 +144,7 @@ so_bind(int fd, int su, unsigned short port) · 1 unmodified line
141144 hnputs(&sin.sin_port, port);
142145
143146 if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
144− error(sys_errlist[errno]);
147+ oserror();
145148 }
146149
147150 int
kern/devip.c+1−0
@@ -228,6 +228,7 @@ ipopen(Chan *c, int omode) · 227 unmodified lines
228228 Conv *cv, *lcv;
229229
230230 omode &= 3;
231+ perm = 0;
231232 switch(omode) {
232233 case OREAD:
233234 perm = 4;
kern/devroot.c+2−0
@@ -181,6 +181,8 @@ rootgen(Chan *c, char *name, Dirtab *dirt, int ndirt, int s, Dir *dp) · 180 unmodified lines
181181 t = c->qid.path - Qmnt - 1;
182182 l = &mntlist;
183183 break;
184+ default:
185+ return -1;
184186 }
185187 if(t >= l->ndir)
186188 return -1;
kern/devssl.c+1−1
@@ -717,7 +717,7 @@ static void · 716 unmodified lines
717717 randfill(uchar *buf, int len)
718718 {
719719 while(len-- > 0)
720− *buf++ = nrand(256);
720+ *buf++ = fastrand();
721721 }
722722
723723 static long
kern/win32.c+174−11
@@ -3,6 +3,7 @@ · 2 unmodified lines
33 #include "lib.h"
44 #include "dat.h"
55 #include "fns.h"
6+#include <libsec.h>
67
78 typedef struct Oproc Oproc;
89 struct Oproc {
@@ -136,24 +137,49 @@ procwakeup(Proc *p) · 127 unmodified lines
136137 ReleaseSemaphore(op->sema, 1, 0);
137138 }
138139
140+void
141+random20(uchar *p)
142+{
143+ LARGE_INTEGER ti;
144+ int i, j;
145+ FILETIME ft;
146+ DigestState ds;
147+ vlong tsc;
148+
149+ GetSystemTimeAsFileTime(&ft);
150+ memset(&ds, 0, sizeof ds);
151+ sha1((uchar*)&ft, sizeof(ft), 0, &ds);
152+ for(i=0; i<50; i++) {
153+ for(j=0; j<10; j++) {
154+ QueryPerformanceCounter(&ti);
155+ sha1((uchar*)&ti, sizeof(ti), 0, &ds);
156+ tsc = GetTickCount();
157+ sha1((uchar*)&tsc, sizeof(tsc), 0, &ds);
158+ }
159+ Sleep(10);
160+ }
161+ sha1(0, 0, p, &ds);
162+}
163+
139164 void
140165 randominit(void)
141166 {
142− srand(seconds());
143167 }
144168
145169 ulong
146170 randomread(void *v, ulong n)
147171 {
148− int m, i, *r;
149−
150− m = (n / sizeof(int)) * sizeof(int);
151− for (i = 0, r = (int*)v; i < m; i += sizeof(int)) {
152− *r = rand();
153− r += sizeof(int);
172+ int i;
173+ uchar p[20];
174+
175+ for(i=0; i<n; i+=20){
176+ random20(p);
177+ if(i+20 <= n)
178+ memmove((char*)v+i, p, 20);
179+ else
180+ memmove((char*)v+i, p, n-i);
154181 }
155−
156− return m;
182+ return n;
157183 }
158184
159185 long
@@ -183,14 +209,151 @@ fastticks(uvlong *v) · 23 unmodified lines
183209
184210 extern int main(int, char*[]);
185211
212+
213+int
214+wstrutflen(Rune *s)
215+{
216+ int n;
217+
218+ for(n=0; *s; n+=runelen(*s),s++)
219+ ;
220+ return n;
221+}
222+
223+int
224+wstrtoutf(char *s, Rune *t, int n)
225+{
226+ int i;
227+ char *s0;
228+
229+ s0 = s;
230+ if(n <= 0)
231+ return wstrutflen(t)+1;
232+ while(*t) {
233+ if(n < UTFmax+1 && n < runelen(*t)+1) {
234+ *s = 0;
235+ return s-s0+wstrutflen(t)+1;
236+ }
237+ i = runetochar(s, t);
238+ s += i;
239+ n -= i;
240+ t++;
241+ }
242+ *s = 0;
243+ return s-s0;
244+}
245+
246+int
247+win_hasunicode(void)
248+{
249+ OSVERSIONINFOA osinfo;
250+ int r;
251+
252+ osinfo.dwOSVersionInfoSize = sizeof(osinfo);
253+ if(!GetVersionExA(&osinfo))
254+ panic("GetVersionEx failed");
255+ switch(osinfo.dwPlatformId) {
256+ default:
257+ panic("unknown PlatformId");
258+ case VER_PLATFORM_WIN32s:
259+ panic("Win32s not supported");
260+ case VER_PLATFORM_WIN32_WINDOWS:
261+ r = 0;
262+ break;
263+ case VER_PLATFORM_WIN32_NT:
264+ r = 1;
265+ break;
266+ }
267+
268+ return r;
269+}
270+
271+int
272+wstrlen(Rune *s)
273+{
274+ int n;
275+
276+ for(n=0; *s; s++,n++)
277+ ;
278+ return n;
279+}
280+static int args(char *argv[], int n, char *p);
281+
186282 int APIENTRY
187−WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR arg, int nshow)
283+WinMain(HINSTANCE x, HINSTANCE y, LPSTR z, int w)
188284 {
189− main(__argc, __argv);
285+ int argc, n;
286+ char *arg, *p, **argv;
287+ Rune *warg;
288+
289+ if(0 && win_hasunicode()){
290+ warg = GetCommandLineW();
291+ n = (wstrlen(warg)+1)*UTFmax;
292+ arg = malloc(n);
293+ wstrtoutf(arg, warg, n);
294+ }else
295+ arg = GetCommandLineA();
296+
297+ /* conservative guess at the number of args */
298+ for(argc=4,p=arg; *p; p++)
299+ if(*p == ' ' || *p == '\t')
300+ argc++;
301+ argv = malloc(argc*sizeof(char*));
302+ argc = args(argv, argc, arg);
303+
304+ mymain(argc, argv);
190305 ExitThread(0);
191306 return 0;
192307 }
193308
309+/*
310+ * Break the command line into arguments
311+ * The rules for this are not documented but appear to be the following
312+ * according to the source for the microsoft C library.
313+ * Words are seperated by space or tab
314+ * Words containing a space or tab can be quoted using "
315+ * 2N backslashes + " ==> N backslashes and end quote
316+ * 2N+1 backslashes + " ==> N backslashes + literal "
317+ * N backslashes not followed by " ==> N backslashes
318+ */
319+static int
320+args(char *argv[], int n, char *p)
321+{
322+ char *p2;
323+ int i, j, quote, nbs;
324+
325+ for(i=0; *p && i<n-1; i++) {
326+ while(*p == ' ' || *p == '\t')
327+ p++;
328+ quote = 0;
329+ argv[i] = p2 = p;
330+ for(;*p; p++) {
331+ if(!quote && (*p == ' ' || *p == '\t'))
332+ break;
333+ for(nbs=0; *p == '\\'; p++,nbs++)
334+ ;
335+ if(*p == '"') {
336+ for(j=0; j<(nbs>>1); j++)
337+ *p2++ = '\\';
338+ if(nbs&1)
339+ *p2++ = *p;
340+ else
341+ quote = !quote;
342+ } else {
343+ for(j=0; j<nbs; j++)
344+ *p2++ = '\\';
345+ *p2++ = *p;
346+ }
347+ }
348+ /* move p up one to avoid pointing to null at end of p2 */
349+ if(*p)
350+ p++;
351+ *p2 = 0;
352+ }
353+ argv[i] = 0;
354+
355+ return i;
356+}
194357 /*
195358 * Windows socket error messages
196359 * There must be a way to get these strings out of the library.
libc/Makefile+0−4
@@ -29,16 +29,12 @@ OFILES=\ · 28 unmodified lines
2929 fmtstr.$O\
3030 fmtvprint.$O\
3131 fprint.$O\
32− frand.$O\
3332 getfields.$O\
3433 getpid.$O\
35− lnrand.$O\
3634 lock.$O\
37− lrand.$O\
3835 mallocz.$O\
3936 nan64.$O\
4037 netmkaddr.$O\
41− nrand.$O\
4238 nsec.$O\
4339 pow10.$O\
4440 pushssl.$O\
libc/nan64.c+5−5
@@ -19,13 +19,13 @@ static uvlong uvneginf = 0xFFF0000000000000ULL; · 18 unmodified lines
1919 double
2020 __NaN(void)
2121 {
22− return *(double*)&uvnan;
22+ return *(double*)(void*)&uvnan;
2323 }
2424
2525 int
2626 __isNaN(double d)
2727 {
28− uvlong x = *(uvlong*)&d;
28+ uvlong x = *(uvlong*)(void*)&d;
2929 return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0);
3030 }
3131
@@ -33,9 +33,9 @@ double · 1 unmodified line
3333 __Inf(int sign)
3434 {
3535 if(sign < 0)
36− return *(double*)&uvinf;
36+ return *(double*)(void*)&uvinf;
3737 else
38− return *(double*)&uvneginf;
38+ return *(double*)(void*)&uvneginf;
3939 }
4040
4141 int
@@ -43,7 +43,7 @@ __isInf(double d, int sign) · 1 unmodified line
4343 {
4444 uvlong x;
4545
46− x = *(uvlong*)&d;
46+ x = *(uvlong*)(void*)&d;
4747 if(sign == 0)
4848 return x==uvinf || x==uvneginf;
4949 else if(sign > 0)
libmemdraw/draw.c+1−1
@@ -2368,7 +2368,7 @@ DBG print("bsh %d\n", bsh); · 2367 unmodified lines
23682368
23692369 bx = -bsh-1;
23702370 ex = -bsh-1-dx;
2371− SET(bits);
2371+ bits = 0;
23722372 v = par->sdval;
23732373
23742374 /* make little endian */
main.c+3−0
@@ -32,6 +32,8 @@ int · 31 unmodified lines
3232 main(int argc, char **argv)
3333 {
3434 eve = getuser();
35+ if(eve == nil)
36+ eve = "drawterm";
3537
3638 sizebug();
3739 fmtinstall('r', errfmt);
@@ -101,6 +103,7 @@ findkey(char **puser, char *dom) · 63 unmodified lines
101103 continue;
102104 pass = nil;
103105 haveproto = havedom = 0;
106+ user = nil;
104107 for(i=1; i<nf; i++){
105108 if(strncmp(f[i], "user=", 5) == 0)
106109 user = f[i]+5;

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