xref: /plan9/sys/src/cmd/sam/plan9.c (revision 1269a55e17378f8f0a601a13c99e4e804209c23f)
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