1 #include "sam.h"
2
3 Rune samname[] = L"~~sam~~";
4
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 };
17
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";
27
28 void
dprint(char * z,...)29 dprint(char *z, ...)
30 {
31 char buf[BLOCKSIZE];
32 va_list arg;
33
34 va_start(arg, z);
35 vseprint(buf, &buf[BLOCKSIZE], z, arg);
36 va_end(arg);
37 termwrite(buf);
38 }
39
40 void
print_ss(char * s,String * a,String * b)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 }
45
46 void
print_s(char * s,String * a)47 print_s(char *s, String *a)
48 {
49 dprint("?warning: %s `%.*S'\n", s, a->n, a->s);
50 }
51
52 int
statfile(char * name,ulong * dev,uvlong * id,long * time,long * length,long * appendonly)53 statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
54 {
55 Dir *dirb;
56
57 dirb = dirstat(name);
58 if(dirb == nil)
59 return -1;
60 if(dev)
61 *dev = dirb->type|(dirb->dev<<16);
62 if(id)
63 *id = dirb->qid.path;
64 if(time)
65 *time = dirb->mtime;
66 if(length)
67 *length = dirb->length;
68 if(appendonly)
69 *appendonly = dirb->mode & DMAPPEND;
70 free(dirb);
71 return 1;
72 }
73
74 int
statfd(int fd,ulong * dev,uvlong * id,long * time,long * length,long * appendonly)75 statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
76 {
77 Dir *dirb;
78
79 dirb = dirfstat(fd);
80 if(dirb == nil)
81 return -1;
82 if(dev)
83 *dev = dirb->type|(dirb->dev<<16);
84 if(id)
85 *id = dirb->qid.path;
86 if(time)
87 *time = dirb->mtime;
88 if(length)
89 *length = dirb->length;
90 if(appendonly)
91 *appendonly = dirb->mode & DMAPPEND;
92 free(dirb);
93 return 1;
94 }
95
96 void
notifyf(void * a,char * s)97 notifyf(void *a, char *s)
98 {
99 USED(a);
100 if(bpipeok && strcmp(s, "sys: write on closed pipe") == 0)
101 noted(NCONT);
102 if(strcmp(s, "interrupt") == 0)
103 noted(NCONT);
104 panicking = 1;
105 rescue();
106 noted(NDFLT);
107 }
108
109 char*
waitfor(int pid)110 waitfor(int pid)
111 {
112 Waitmsg *w;
113 static char msg[ERRMAX];
114
115 while((w = wait()) != nil){
116 if(w->pid != pid){
117 free(w);
118 continue;
119 }
120 strecpy(msg, msg+sizeof msg, w->msg);
121 free(w);
122 return msg;
123 }
124 rerrstr(msg, sizeof msg);
125 return msg;
126 }
127
128 void
samerr(char * buf)129 samerr(char *buf)
130 {
131 sprint(buf, "%s/sam.err", TMPDIR);
132 }
133
134 void*
emalloc(ulong n)135 emalloc(ulong n)
136 {
137 void *p;
138
139 p = malloc(n);
140 if(p == 0)
141 panic("malloc fails");
142 memset(p, 0, n);
143 return p;
144 }
145
146 void*
erealloc(void * p,ulong n)147 erealloc(void *p, ulong n)
148 {
149 p = realloc(p, n);
150 if(p == 0)
151 panic("realloc fails");
152 return p;
153 }
154