13e12c5d1SDavid du Colombier #include "sam.h" 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier Rune samname[] = L"~~sam~~"; 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier Rune *left[]= { 63e12c5d1SDavid du Colombier L"{[(<«", 73e12c5d1SDavid du Colombier L"\n", 83e12c5d1SDavid du Colombier L"'\"`", 93e12c5d1SDavid du Colombier 0 103e12c5d1SDavid du Colombier }; 113e12c5d1SDavid du Colombier Rune *right[]= { 123e12c5d1SDavid du Colombier L"}])>»", 133e12c5d1SDavid du Colombier L"\n", 143e12c5d1SDavid du Colombier L"'\"`", 153e12c5d1SDavid du Colombier 0 163e12c5d1SDavid du Colombier }; 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier char RSAM[] = "sam"; 193e12c5d1SDavid du Colombier char SAMTERM[] = "/bin/aux/samterm"; 203e12c5d1SDavid du Colombier char HOME[] = "home"; 213e12c5d1SDavid du Colombier char TMPDIR[] = "/tmp"; 223e12c5d1SDavid du Colombier char SH[] = "rc"; 233e12c5d1SDavid du Colombier char SHPATH[] = "/bin/rc"; 243e12c5d1SDavid du Colombier char RX[] = "rx"; 253e12c5d1SDavid du Colombier char RXPATH[] = "/bin/rx"; 26bd389b36SDavid du Colombier char SAMSAVECMD[] = "/bin/rc\n/sys/lib/samsave"; 273e12c5d1SDavid du Colombier 283e12c5d1SDavid du Colombier void 293e12c5d1SDavid du Colombier dprint(char *z, ...) 303e12c5d1SDavid du Colombier { 313e12c5d1SDavid du Colombier char buf[BLOCKSIZE]; 323e12c5d1SDavid du Colombier 333e12c5d1SDavid du Colombier doprint(buf, &buf[BLOCKSIZE], z, ((long*)&z)+1); 343e12c5d1SDavid du Colombier termwrite(buf); 353e12c5d1SDavid du Colombier } 363e12c5d1SDavid du Colombier 37bd389b36SDavid du Colombier void 38bd389b36SDavid du Colombier print_ss(char *s, String *a, String *b) 39bd389b36SDavid du Colombier { 40bd389b36SDavid du Colombier dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s); 41bd389b36SDavid du Colombier } 42bd389b36SDavid du Colombier 43bd389b36SDavid du Colombier void 44bd389b36SDavid du Colombier print_s(char *s, String *a) 45bd389b36SDavid du Colombier { 46bd389b36SDavid du Colombier dprint("?warning: %s `%.*S'\n", s, a->n, a->s); 47bd389b36SDavid du Colombier } 48bd389b36SDavid du Colombier 493e12c5d1SDavid du Colombier char* 503e12c5d1SDavid du Colombier getuser(void) 513e12c5d1SDavid du Colombier { 523e12c5d1SDavid du Colombier static char user[NAMELEN]; 533e12c5d1SDavid du Colombier int fd; 543e12c5d1SDavid du Colombier 553e12c5d1SDavid du Colombier if(user[0] == 0){ 563e12c5d1SDavid du Colombier fd = open("/dev/user", 0); 573e12c5d1SDavid du Colombier if(fd<0 || read(fd, user, sizeof user)<=0) 583e12c5d1SDavid du Colombier strcpy(user, "none"); 593e12c5d1SDavid du Colombier close(fd); 603e12c5d1SDavid du Colombier } 613e12c5d1SDavid du Colombier return user; 623e12c5d1SDavid du Colombier } 633e12c5d1SDavid du Colombier 643e12c5d1SDavid du Colombier int 65*219b2ee8SDavid du Colombier statfile(char *name, ulong *dev, ulong *id, long *time, long *length, long *appendonly) 663e12c5d1SDavid du Colombier { 673e12c5d1SDavid du Colombier Dir dirb; 683e12c5d1SDavid du Colombier 693e12c5d1SDavid du Colombier if(dirstat(name, &dirb) == -1) 703e12c5d1SDavid du Colombier return -1; 71bd389b36SDavid du Colombier if(dev) 72bd389b36SDavid du Colombier *dev = dirb.type|(dirb.dev<<16); 733e12c5d1SDavid du Colombier if(id) 743e12c5d1SDavid du Colombier *id = dirb.qid.path; 753e12c5d1SDavid du Colombier if(time) 763e12c5d1SDavid du Colombier *time = dirb.mtime; 773e12c5d1SDavid du Colombier if(length) 783e12c5d1SDavid du Colombier *length = dirb.length; 79*219b2ee8SDavid du Colombier if(appendonly) 80*219b2ee8SDavid du Colombier *appendonly = dirb.mode & CHAPPEND; 813e12c5d1SDavid du Colombier return 1; 823e12c5d1SDavid du Colombier } 833e12c5d1SDavid du Colombier 843e12c5d1SDavid du Colombier int 85*219b2ee8SDavid du Colombier statfd(int fd, ulong *dev, ulong *id, long *time, long *length, long *appendonly) 863e12c5d1SDavid du Colombier { 873e12c5d1SDavid du Colombier Dir dirb; 883e12c5d1SDavid du Colombier 893e12c5d1SDavid du Colombier if(dirfstat(fd, &dirb) == -1) 903e12c5d1SDavid du Colombier return -1; 91bd389b36SDavid du Colombier if(dev) 92bd389b36SDavid du Colombier *dev = dirb.type|(dirb.dev<<16); 933e12c5d1SDavid du Colombier if(id) 943e12c5d1SDavid du Colombier *id = dirb.qid.path; 953e12c5d1SDavid du Colombier if(time) 963e12c5d1SDavid du Colombier *time = dirb.mtime; 973e12c5d1SDavid du Colombier if(length) 983e12c5d1SDavid du Colombier *length = dirb.length; 99*219b2ee8SDavid du Colombier if(appendonly) 100*219b2ee8SDavid du Colombier *appendonly = dirb.mode & CHAPPEND; 1013e12c5d1SDavid du Colombier return 1; 1023e12c5d1SDavid du Colombier } 1033e12c5d1SDavid du Colombier 1043e12c5d1SDavid du Colombier void 1053e12c5d1SDavid du Colombier notifyf(void *a, char *s) 1063e12c5d1SDavid du Colombier { 1073e12c5d1SDavid du Colombier USED(a); 1083e12c5d1SDavid du Colombier if(bpipeok && strcmp(s, "sys: write on closed pipe") == 0) 1093e12c5d1SDavid du Colombier noted(NCONT); 1103e12c5d1SDavid du Colombier if(strcmp(s, "interrupt") == 0) 1113e12c5d1SDavid du Colombier noted(NCONT); 1123e12c5d1SDavid du Colombier panicking = 1; 1133e12c5d1SDavid du Colombier rescue(); 1143e12c5d1SDavid du Colombier noted(NDFLT); 1153e12c5d1SDavid du Colombier } 1163e12c5d1SDavid du Colombier 1173e12c5d1SDavid du Colombier int 1183e12c5d1SDavid du Colombier newtmp(int num) 1193e12c5d1SDavid du Colombier { 1203e12c5d1SDavid du Colombier int i, fd; 1213e12c5d1SDavid du Colombier static char tempnam[30]; 1223e12c5d1SDavid du Colombier 1233e12c5d1SDavid du Colombier i = getpid(); 1243e12c5d1SDavid du Colombier do 1253e12c5d1SDavid du Colombier sprint(tempnam, "%s/%d%.4s%dsam", TMPDIR, num, getuser(), i++); 1263e12c5d1SDavid du Colombier while(access(tempnam, 0) == 0); 1273e12c5d1SDavid du Colombier fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000); 1283e12c5d1SDavid du Colombier if(fd < 0){ 1293e12c5d1SDavid du Colombier remove(tempnam); 1303e12c5d1SDavid du Colombier fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000); 1313e12c5d1SDavid du Colombier } 1323e12c5d1SDavid du Colombier return fd; 1333e12c5d1SDavid du Colombier } 1343e12c5d1SDavid du Colombier 1353e12c5d1SDavid du Colombier int 1363e12c5d1SDavid du Colombier waitfor(int pid) 1373e12c5d1SDavid du Colombier { 1383e12c5d1SDavid du Colombier int rpid; 1393e12c5d1SDavid du Colombier Waitmsg wm; 1403e12c5d1SDavid du Colombier 1413e12c5d1SDavid du Colombier do; while((rpid = wait(&wm)) != pid && rpid != -1); 1423e12c5d1SDavid du Colombier return wm.msg[0]; 1433e12c5d1SDavid du Colombier } 1443e12c5d1SDavid du Colombier 1453e12c5d1SDavid du Colombier void 1463e12c5d1SDavid du Colombier samerr(char *buf) 1473e12c5d1SDavid du Colombier { 1483e12c5d1SDavid du Colombier sprint(buf, "%s/sam.err", TMPDIR); 1493e12c5d1SDavid du Colombier } 1503e12c5d1SDavid du Colombier 1513e12c5d1SDavid du Colombier void* 1523e12c5d1SDavid du Colombier emalloc(ulong n) 1533e12c5d1SDavid du Colombier { 1543e12c5d1SDavid du Colombier void *p; 1553e12c5d1SDavid du Colombier 1563e12c5d1SDavid du Colombier p = malloc(n); 1573e12c5d1SDavid du Colombier if(p == 0) 1583e12c5d1SDavid du Colombier panic("malloc fails"); 1593e12c5d1SDavid du Colombier memset(p, 0, n); 1603e12c5d1SDavid du Colombier return p; 1613e12c5d1SDavid du Colombier } 1623e12c5d1SDavid du Colombier 1633e12c5d1SDavid du Colombier void* 1643e12c5d1SDavid du Colombier erealloc(void *p, ulong n) 1653e12c5d1SDavid du Colombier { 1663e12c5d1SDavid du Colombier p = realloc(p, n); 1673e12c5d1SDavid du Colombier if(p == 0) 1683e12c5d1SDavid du Colombier panic("realloc fails"); 1693e12c5d1SDavid du Colombier return p; 1703e12c5d1SDavid du Colombier } 171