| plan9.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
| git clone git://git.suckless.org/9base | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| plan9.c (2803B) | |
| --- | |
| 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 | |
| 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 | |
| 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,… | |
| 44 } | |
| 45 | |
| 46 void | |
| 47 print_s(char *s, String *a) | |
| 48 { | |
| 49 dprint("?warning: %s `%.*S'\n", s, a->n, a->s); | |
| 50 } | |
| 51 | |
| 52 char* | |
| 53 getuser(void) | |
| 54 { | |
| 55 static char user[64]; | |
| 56 int fd; | |
| 57 | |
| 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 } | |
| 66 | |
| 67 int | |
| 68 statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, l… | |
| 69 { | |
| 70 Dir *dirb; | |
| 71 | |
| 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 } | |
| 88 | |
| 89 int | |
| 90 statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *a… | |
| 91 { | |
| 92 Dir *dirb; | |
| 93 | |
| 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 } | |
| 110 | |
| 111 void | |
| 112 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 } | |
| 123 | |
| 124 int | |
| 125 newtmp(int num) | |
| 126 { | |
| 127 int i, fd; | |
| 128 static char tempnam[30]; | |
| 129 | |
| 130 i = getpid(); | |
| 131 do | |
| 132 snprint(tempnam, sizeof tempnam, "%s/%d%.4s%dsam", TMPDI… | |
| 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 } | |
| 141 | |
| 142 int | |
| 143 waitfor(int pid) | |
| 144 { | |
| 145 int msg; | |
| 146 Waitmsg *w; | |
| 147 | |
| 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 } | |
| 159 | |
| 160 void | |
| 161 samerr(char *buf) | |
| 162 { | |
| 163 sprint(buf, "%s/sam.err", TMPDIR); | |
| 164 } | |
| 165 | |
| 166 void* | |
| 167 emalloc(ulong n) | |
| 168 { | |
| 169 void *p; | |
| 170 | |
| 171 p = malloc(n); | |
| 172 if(p == 0) | |
| 173 panic("malloc fails"); | |
| 174 memset(p, 0, n); | |
| 175 return p; | |
| 176 } | |
| 177 | |
| 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 } |