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]; 327dd7cddfSDavid du Colombier va_list arg; 333e12c5d1SDavid du Colombier 347dd7cddfSDavid du Colombier va_start(arg, z); 359a747e4fSDavid du Colombier vseprint(buf, &buf[BLOCKSIZE], z, arg); 367dd7cddfSDavid du Colombier va_end(arg); 373e12c5d1SDavid du Colombier termwrite(buf); 383e12c5d1SDavid du Colombier } 393e12c5d1SDavid du Colombier 40bd389b36SDavid du Colombier void 41bd389b36SDavid du Colombier print_ss(char *s, String *a, String *b) 42bd389b36SDavid du Colombier { 43bd389b36SDavid du Colombier dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s); 44bd389b36SDavid du Colombier } 45bd389b36SDavid du Colombier 46bd389b36SDavid du Colombier void 47bd389b36SDavid du Colombier print_s(char *s, String *a) 48bd389b36SDavid du Colombier { 49bd389b36SDavid du Colombier dprint("?warning: %s `%.*S'\n", s, a->n, a->s); 50bd389b36SDavid du Colombier } 51bd389b36SDavid du Colombier 523e12c5d1SDavid du Colombier int 539a747e4fSDavid du Colombier statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly) 543e12c5d1SDavid du Colombier { 559a747e4fSDavid du Colombier Dir *dirb; 563e12c5d1SDavid du Colombier 579a747e4fSDavid du Colombier dirb = dirstat(name); 589a747e4fSDavid du Colombier if(dirb == nil) 593e12c5d1SDavid du Colombier return -1; 60bd389b36SDavid du Colombier if(dev) 619a747e4fSDavid du Colombier *dev = dirb->type|(dirb->dev<<16); 623e12c5d1SDavid du Colombier if(id) 639a747e4fSDavid du Colombier *id = dirb->qid.path; 643e12c5d1SDavid du Colombier if(time) 659a747e4fSDavid du Colombier *time = dirb->mtime; 663e12c5d1SDavid du Colombier if(length) 679a747e4fSDavid du Colombier *length = dirb->length; 68219b2ee8SDavid du Colombier if(appendonly) 699a747e4fSDavid du Colombier *appendonly = dirb->mode & DMAPPEND; 709a747e4fSDavid du Colombier free(dirb); 713e12c5d1SDavid du Colombier return 1; 723e12c5d1SDavid du Colombier } 733e12c5d1SDavid du Colombier 743e12c5d1SDavid du Colombier int 759a747e4fSDavid du Colombier statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly) 763e12c5d1SDavid du Colombier { 779a747e4fSDavid du Colombier Dir *dirb; 783e12c5d1SDavid du Colombier 799a747e4fSDavid du Colombier dirb = dirfstat(fd); 809a747e4fSDavid du Colombier if(dirb == nil) 813e12c5d1SDavid du Colombier return -1; 82bd389b36SDavid du Colombier if(dev) 839a747e4fSDavid du Colombier *dev = dirb->type|(dirb->dev<<16); 843e12c5d1SDavid du Colombier if(id) 859a747e4fSDavid du Colombier *id = dirb->qid.path; 863e12c5d1SDavid du Colombier if(time) 879a747e4fSDavid du Colombier *time = dirb->mtime; 883e12c5d1SDavid du Colombier if(length) 899a747e4fSDavid du Colombier *length = dirb->length; 90219b2ee8SDavid du Colombier if(appendonly) 919a747e4fSDavid du Colombier *appendonly = dirb->mode & DMAPPEND; 929a747e4fSDavid du Colombier free(dirb); 933e12c5d1SDavid du Colombier return 1; 943e12c5d1SDavid du Colombier } 953e12c5d1SDavid du Colombier 963e12c5d1SDavid du Colombier void 973e12c5d1SDavid du Colombier notifyf(void *a, char *s) 983e12c5d1SDavid du Colombier { 993e12c5d1SDavid du Colombier USED(a); 1003e12c5d1SDavid du Colombier if(bpipeok && strcmp(s, "sys: write on closed pipe") == 0) 1013e12c5d1SDavid du Colombier noted(NCONT); 1023e12c5d1SDavid du Colombier if(strcmp(s, "interrupt") == 0) 1033e12c5d1SDavid du Colombier noted(NCONT); 1043e12c5d1SDavid du Colombier panicking = 1; 1053e12c5d1SDavid du Colombier rescue(); 1063e12c5d1SDavid du Colombier noted(NDFLT); 1073e12c5d1SDavid du Colombier } 1083e12c5d1SDavid du Colombier 109*c35931e2SDavid du Colombier char* 1103e12c5d1SDavid du Colombier waitfor(int pid) 1113e12c5d1SDavid du Colombier { 1129a747e4fSDavid du Colombier Waitmsg *w; 113*c35931e2SDavid du Colombier static char msg[ERRMAX]; 1143e12c5d1SDavid du Colombier 1159a747e4fSDavid du Colombier while((w = wait()) != nil){ 1169a747e4fSDavid du Colombier if(w->pid != pid){ 1179a747e4fSDavid du Colombier free(w); 1189a747e4fSDavid du Colombier continue; 1199a747e4fSDavid du Colombier } 120*c35931e2SDavid du Colombier strecpy(msg, msg+sizeof msg, w->msg); 1219a747e4fSDavid du Colombier free(w); 1229a747e4fSDavid du Colombier return msg; 1239a747e4fSDavid du Colombier } 124*c35931e2SDavid du Colombier rerrstr(msg, sizeof msg); 125*c35931e2SDavid du Colombier return msg; 1263e12c5d1SDavid du Colombier } 1273e12c5d1SDavid du Colombier 1283e12c5d1SDavid du Colombier void 1293e12c5d1SDavid du Colombier samerr(char *buf) 1303e12c5d1SDavid du Colombier { 1313e12c5d1SDavid du Colombier sprint(buf, "%s/sam.err", TMPDIR); 1323e12c5d1SDavid du Colombier } 1333e12c5d1SDavid du Colombier 1343e12c5d1SDavid du Colombier void* 1353e12c5d1SDavid du Colombier emalloc(ulong n) 1363e12c5d1SDavid du Colombier { 1373e12c5d1SDavid du Colombier void *p; 1383e12c5d1SDavid du Colombier 1393e12c5d1SDavid du Colombier p = malloc(n); 1403e12c5d1SDavid du Colombier if(p == 0) 1413e12c5d1SDavid du Colombier panic("malloc fails"); 1423e12c5d1SDavid du Colombier memset(p, 0, n); 1433e12c5d1SDavid du Colombier return p; 1443e12c5d1SDavid du Colombier } 1453e12c5d1SDavid du Colombier 1463e12c5d1SDavid du Colombier void* 1473e12c5d1SDavid du Colombier erealloc(void *p, ulong n) 1483e12c5d1SDavid du Colombier { 1493e12c5d1SDavid du Colombier p = realloc(p, n); 1503e12c5d1SDavid du Colombier if(p == 0) 1513e12c5d1SDavid du Colombier panic("realloc fails"); 1523e12c5d1SDavid du Colombier return p; 1533e12c5d1SDavid du Colombier } 154