Image *img;
Tos *tos;
- a = nil;
- elem = nil;
+ args = elem = nil;
file0 = va_arg(list, char*);
validaddr((uintptr)file0, 1, 0);
argp0 = va_arg(list, char**);
if(waserror()){
free(file0);
free(elem);
- free(a);
+ free(args);
/* Disaster after commit */
if(!up->seg[SSEG])
pexit(up->errstr, 1);
* 8-byte align SP for those (e.g. sparc) that need it.
* execregs() will subtract another 4 bytes for argc.
*/
- if((ssize+4) & 7)
+ if(BY2WD == 4 && (ssize+4) & 7)
ssize += 4;
if(PGROUND(ssize) >= USTKSIZE)
argv = (char**)(tstk - ssize);
charp = (char*)(tstk - nbytes);
- args = charp;
+ a = charp;
if(indir)
argp = progarg;
else
}
/* copy args; easiest from new process's stack */
- n = charp - args;
+ n = charp - a;
if(n > 128) /* don't waste too much space on huge arg lists */
n = 128;
- a = smalloc(n);
- memmove(a, args, n);
- if(n>0 && a[n-1]!='\0'){
+ args = smalloc(n);
+ memmove(args, a, n);
+ if(n>0 && args[n-1]!='\0'){
/* make sure last arg is NUL-terminated */
/* put NUL at UTF-8 character boundary */
for(i=n-1; i>0; --i)
- if(fullrune(a+i, n-i))
+ if(fullrune(args+i, n-i))
break;
- a[i] = 0;
+ args[i] = 0;
n = i+1;
}
free(up->text);
up->text = elem;
free(up->args);
- up->args = a;
+ up->args = args;
up->nargs = n;
up->setargs = 0;
error(Ebadarg);
return (uintptr)semrelease(s, addr, delta);
}
+
+/* For binary compatibility */
+uintptr
+sys_nsec(va_list list)
+{
+ vlong *v;
+
+ v = va_arg(list, vlong*);
+ evenaddr((uintptr)v);
+ validaddr((uintptr)v, sizeof(vlong), 1);
+ *v = todget(nil);
+ return 0;
+}