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