Blob


1 #include "sam.h"
3 Rune samname[] = L"~~sam~~";
5 Rune *left[]= {
6 L"{[(<«",
7 L"\n",
8 L"'\"`",
9 0
10 };
11 Rune *right[]= {
12 L"}])>»",
13 L"\n",
14 L"'\"`",
15 0
16 };
18 char RSAM[] = "sam";
19 char SAMTERM[] = "/bin/aux/samterm";
20 char HOME[] = "HOME";
21 char TMPDIR[] = "/tmp";
22 char SH[] = "rc";
23 char SHPATH[] = "/bin/rc";
24 char RX[] = "rx";
25 char RXPATH[] = "/bin/rx";
26 char SAMSAVECMD[] = "/bin/rc\n/sys/lib/samsave";
28 void
29 dprint(char *z, ...)
30 {
31 char buf[BLOCKSIZE];
32 va_list arg;
34 va_start(arg, z);
35 vseprint(buf, &buf[BLOCKSIZE], z, arg);
36 va_end(arg);
37 termwrite(buf);
38 }
40 void
41 print_ss(char *s, String *a, String *b)
42 {
43 dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s);
44 }
46 void
47 print_s(char *s, String *a)
48 {
49 dprint("?warning: %s `%.*S'\n", s, a->n, a->s);
50 }
52 char*
53 getuser(void)
54 {
55 static char user[64];
56 int fd;
58 if(user[0] == 0){
59 fd = open("/dev/user", 0);
60 if(fd<0 || read(fd, user, sizeof user-1)<=0)
61 strcpy(user, "none");
62 close(fd);
63 }
64 return user;
65 }
67 int
68 statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
69 {
70 Dir *dirb;
72 dirb = dirstat(name);
73 if(dirb == nil)
74 return -1;
75 if(dev)
76 *dev = dirb->type|(dirb->dev<<16);
77 if(id)
78 *id = dirb->qid.path;
79 if(time)
80 *time = dirb->mtime;
81 if(length)
82 *length = dirb->length;
83 if(appendonly)
84 *appendonly = dirb->mode & DMAPPEND;
85 free(dirb);
86 return 1;
87 }
89 int
90 statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
91 {
92 Dir *dirb;
94 dirb = dirfstat(fd);
95 if(dirb == nil)
96 return -1;
97 if(dev)
98 *dev = dirb->type|(dirb->dev<<16);
99 if(id)
100 *id = dirb->qid.path;
101 if(time)
102 *time = dirb->mtime;
103 if(length)
104 *length = dirb->length;
105 if(appendonly)
106 *appendonly = dirb->mode & DMAPPEND;
107 free(dirb);
108 return 1;
111 void
112 notifyf(void *a, char *s)
114 USED(a);
115 if(bpipeok && strcmp(s, "sys: write on closed pipe") == 0)
116 noted(NCONT);
117 if(strcmp(s, "interrupt") == 0)
118 noted(NCONT);
119 panicking = 1;
120 rescue();
121 noted(NDFLT);
124 int
125 newtmp(int num)
127 int i, fd;
128 static char tempnam[30];
130 i = getpid();
131 do
132 snprint(tempnam, sizeof tempnam, "%s/%d%.4s%dsam", TMPDIR, num, getuser(), i++);
133 while(access(tempnam, 0) == 0);
134 fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000);
135 if(fd < 0){
136 remove(tempnam);
137 fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000);
139 return fd;
142 int
143 waitfor(int pid)
145 int msg;
146 Waitmsg *w;
148 while((w = wait()) != nil){
149 if(w->pid != pid){
150 free(w);
151 continue;
153 msg = (w->msg[0] != '\0');
154 free(w);
155 return msg;
157 return -1;
160 void
161 samerr(char *buf)
163 sprint(buf, "%s/sam.err", TMPDIR);
166 void*
167 emalloc(ulong n)
169 void *p;
171 p = malloc(n);
172 if(p == 0)
173 panic("malloc fails");
174 memset(p, 0, n);
175 return p;
178 void*
179 erealloc(void *p, ulong n)
181 p = realloc(p, n);
182 if(p == 0)
183 panic("realloc fails");
184 return p;