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
dprint(char * z,...)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
print_ss(char * s,String * a,String * b)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
print_s(char * s,String * a)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
statfile(char * name,ulong * dev,uvlong * id,long * time,long * length,long * appendonly)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
statfd(int fd,ulong * dev,uvlong * id,long * time,long * length,long * appendonly)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
notifyf(void * a,char * s)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*
waitfor(int pid)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
samerr(char * buf)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*
emalloc(ulong n)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*
erealloc(void * p,ulong n)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