plan9.c - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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, b->s);
           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, long *appendonly)
           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 *appendonly)
           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", 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 }
          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 }