Blob
1 #include "sam.h"3 Rune samname[] = L"~~sam~~";5 Rune *left[]= {6 L"{[(<«",7 L"\n",8 L"'\"`",9 010 };11 Rune *right[]= {12 L"}])>»",13 L"\n",14 L"'\"`",15 016 };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 void29 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 void41 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 void47 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 int68 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 int90 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;109 }111 void112 notifyf(void *a, char *s)113 {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);122 }124 int125 newtmp(int num)126 {127 int i, fd;128 static char tempnam[30];130 i = getpid();131 do132 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);138 }139 return fd;140 }142 int143 waitfor(int pid)144 {145 int msg;146 Waitmsg *w;148 while((w = wait()) != nil){149 if(w->pid != pid){150 free(w);151 continue;152 }153 msg = (w->msg[0] != '\0');154 free(w);155 return msg;156 }157 return -1;158 }160 void161 samerr(char *buf)162 {163 sprint(buf, "%s/sam.err", TMPDIR);164 }166 void*167 emalloc(ulong n)168 {169 void *p;171 p = malloc(n);172 if(p == 0)173 panic("malloc fails");174 memset(p, 0, n);175 return p;176 }178 void*179 erealloc(void *p, ulong n)180 {181 p = realloc(p, n);182 if(p == 0)183 panic("realloc fails");184 return p;185 }