unix.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
       ---
       unix.c (4057B)
       ---
            1 #include <u.h>
            2 #include <sys/types.h>
            3 #include <sys/stat.h>
            4 #include <sys/wait.h>
            5 #include <pwd.h>
            6 #include <signal.h>
            7 #include <fcntl.h>
            8 #include <errno.h>
            9 
           10 #include "sam.h"
           11 
           12 Rune    samname[] = { '~', '~', 's', 'a', 'm', '~', '~', 0 };
           13  
           14 static Rune l1[] = { '{', '[', '(', '<', 0253, 0};
           15 static Rune l2[] = { '\n', 0};
           16 static Rune l3[] = { '\'', '"', '`', 0};
           17 Rune *left[]= { l1, l2, l3, 0};
           18 
           19 static Rune r1[] = {'}', ']', ')', '>', 0273, 0};
           20 static Rune r2[] = {'\n', 0};
           21 static Rune r3[] = {'\'', '"', '`', 0};
           22 Rune *right[]= { r1, r2, r3, 0};
           23 
           24 #ifndef SAMTERMNAME
           25 #define SAMTERMNAME "samterm"
           26 #endif
           27 #ifndef TMPDIRNAME
           28 #define TMPDIRNAME "/tmp"
           29 #endif
           30 #ifndef SHNAME
           31 #define SHNAME "sh"
           32 #endif
           33 #ifndef SHPATHNAME
           34 #define SHPATHNAME "/bin/sh"
           35 #endif
           36 #ifndef RXNAME
           37 #define RXNAME "ssh"
           38 #endif
           39 #ifndef RXPATHNAME
           40 #define RXPATHNAME "ssh"
           41 #endif
           42 
           43 char        RSAM[] = "sam";
           44 char        SAMTERM[] = SAMTERMNAME;
           45 char        HOME[] = "HOME";
           46 char        TMPDIR[] = TMPDIRNAME;
           47 char        SH[] = SHNAME;
           48 char        SHPATH[] = SHPATHNAME;
           49 char        RX[] = RXNAME;
           50 char        RXPATH[] = RXPATHNAME;
           51 
           52 
           53 void
           54 dprint(char *z, ...)
           55 {
           56         char buf[BLOCKSIZE];
           57         va_list arg;
           58 
           59         va_start(arg, z);
           60         vseprint(buf, &buf[BLOCKSIZE], z, arg);
           61         va_end(arg);
           62         termwrite(buf);
           63 }
           64 
           65 void
           66 print_ss(char *s, String *a, String *b)
           67 {
           68         dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s);
           69 }
           70 
           71 void
           72 print_s(char *s, String *a)
           73 {
           74         dprint("?warning: %s `%.*S'\n", s, a->n, a->s);
           75 }
           76 
           77 char*
           78 getuser(void)
           79 {
           80         static char user[64];
           81         if(user[0] == 0){
           82                 struct passwd *pw = getpwuid(getuid());
           83                 strcpy(user, pw ? pw->pw_name : "nobody");
           84         }
           85         return user;
           86 }
           87 
           88 int     
           89 statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly) 
           90 {
           91         struct stat dirb;
           92 
           93         if (stat(name, &dirb) == -1)
           94                 return -1;
           95         if (dev)
           96                 *dev = dirb.st_dev;   
           97         if (id)
           98                 *id = dirb.st_ino;
           99         if (time)
          100                 *time = dirb.st_mtime;
          101         if (length)
          102                 *length = dirb.st_size;
          103         if(appendonly)
          104                 *appendonly = 0;
          105         return 1;
          106 }
          107 
          108 int
          109 statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
          110 {
          111         struct stat dirb;
          112 
          113         if (fstat(fd, &dirb) == -1)   
          114                 return -1;
          115         if (dev)
          116                 *dev = dirb.st_dev;
          117         if (id) 
          118                 *id = dirb.st_ino;
          119         if (time)
          120                 *time = dirb.st_mtime;
          121         if (length)
          122                 *length = dirb.st_size;
          123         if(appendonly)
          124                 *appendonly = 0;
          125         return 1;
          126 }
          127 
          128 void
          129 hup(int sig)
          130 {
          131         panicking = 1; /* ??? */
          132         rescue();
          133         exit(1);
          134 }
          135 
          136 int
          137 notify(void(*f)(void *, char *))
          138 {
          139         signal(SIGINT, SIG_IGN);
          140         signal(SIGPIPE, SIG_IGN);  /* XXX - bpipeok? */
          141         signal(SIGHUP, hup);
          142         return 1;
          143 }
          144 
          145 void
          146 notifyf(void *a, char *b)       /* never called; hup is instead */
          147 {
          148 }
          149 
          150 static int
          151 temp_file(char *buf, int bufsize)
          152 {
          153         char *tmp;
          154         int n, fd;
          155 
          156         tmp = getenv("TMPDIR");
          157         if (!tmp)
          158                 tmp = TMPDIR;
          159 
          160         n = snprint(buf, bufsize, "%s/sam.%d.XXXXXXX", tmp, getuid());
          161         if (bufsize <= n)
          162                 return -1;
          163         if ((fd = mkstemp(buf)) < 0)  /* SES - linux sometimes uses mode 0666 */
          164                 return -1;
          165         if (fcntl(fd, F_SETFD, fcntl(fd,F_GETFD,0) | FD_CLOEXEC) < 0)
          166                 return -1;
          167         return fd;
          168 }
          169 
          170 int
          171 tempdisk(void)
          172 {
          173         char buf[4096];
          174         int fd = temp_file(buf, sizeof buf);
          175         if (fd >= 0)
          176                 remove(buf);
          177         return fd; 
          178 }
          179 
          180 #undef waitfor
          181 int     
          182 samwaitfor(int pid)
          183 {
          184         int r;
          185         Waitmsg *w;
          186 
          187         w = p9waitfor(pid);
          188         if(w == nil)
          189                 return -1;
          190         r = atoi(w->msg);
          191         free(w);
          192         return r;
          193 }
          194 
          195 void
          196 samerr(char *buf)
          197 {
          198         sprint(buf, "%s/sam.%s.err", TMPDIR, getuser());
          199 }
          200 
          201 void*
          202 emalloc(ulong n)
          203 {
          204         void *p;
          205 
          206         p = malloc(n);
          207         if(p == 0)
          208                 panic("malloc fails");
          209         memset(p, 0, n);
          210         return p;
          211 }
          212 
          213 void*
          214 erealloc(void *p, ulong n)
          215 {
          216         p = realloc(p, n);
          217         if(p == 0)
          218                 panic("realloc fails");
          219         return p;
          220 }
          221 
          222