xref: /third_party/toybox/lib/lib.c (revision 0f66f451)
1/* lib.c - various reusable stuff.
2 *
3 * Copyright 2006 Rob Landley <rob@landley.net>
4 */
5
6#define SYSLOG_NAMES
7#include "toys.h"
8
9void verror_msg(char *msg, int err, va_list va)
10{
11  char *s = ": %s";
12
13  fprintf(stderr, "%s: ", toys.which->name);
14  if (msg) vfprintf(stderr, msg, va);
15  else s+=2;
16  if (err>0) fprintf(stderr, s, strerror(err));
17  if (err<0 && CFG_TOYBOX_HELP)
18    fprintf(stderr, " (see \"%s --help\")", toys.which->name);
19  if (msg || err) putc('\n', stderr);
20  if (!toys.exitval) toys.exitval++;
21}
22
23// These functions don't collapse together because of the va_stuff.
24
25void error_msg(char *msg, ...)
26{
27  va_list va;
28
29  va_start(va, msg);
30  verror_msg(msg, 0, va);
31  va_end(va);
32}
33
34void perror_msg(char *msg, ...)
35{
36  va_list va;
37
38  va_start(va, msg);
39  verror_msg(msg, errno, va);
40  va_end(va);
41}
42
43// Die with an error message.
44void error_exit(char *msg, ...)
45{
46  va_list va;
47
48  va_start(va, msg);
49  verror_msg(msg, 0, va);
50  va_end(va);
51
52  xexit();
53}
54
55// Die with an error message and strerror(errno)
56void perror_exit(char *msg, ...)
57{
58  // Die silently if our pipeline exited.
59  if (errno != EPIPE) {
60    va_list va;
61
62    va_start(va, msg);
63    verror_msg(msg, errno, va);
64    va_end(va);
65  }
66
67  xexit();
68}
69
70// Exit with an error message after showing help text.
71void help_exit(char *msg, ...)
72{
73  va_list va;
74
75  if (!msg) show_help(stdout);
76  else {
77    va_start(va, msg);
78    verror_msg(msg, -1, va);
79    va_end(va);
80  }
81
82  xexit();
83}
84
85// If you want to explicitly disable the printf() behavior (because you're
86// printing user-supplied data, or because android's static checker produces
87// false positives for 'char *s = x ? "blah1" : "blah2"; printf(s);' and it's
88// -Werror there for policy reasons).
89void error_msg_raw(char *msg)
90{
91  error_msg("%s", msg);
92}
93
94void perror_msg_raw(char *msg)
95{
96  perror_msg("%s", msg);
97}
98
99void error_exit_raw(char *msg)
100{
101  error_exit("%s", msg);
102}
103
104void perror_exit_raw(char *msg)
105{
106  perror_exit("%s", msg);
107}
108
109// Keep reading until full or EOF
110ssize_t readall(int fd, void *buf, size_t len)
111{
112  size_t count = 0;
113
114  while (count<len) {
115    int i = read(fd, (char *)buf+count, len-count);
116    if (!i) break;
117    if (i<0) return i;
118    count += i;
119  }
120
121  return count;
122}
123
124// Keep writing until done or EOF
125ssize_t writeall(int fd, void *buf, size_t len)
126{
127  size_t count = 0;
128
129  while (count<len) {
130    int i = write(fd, count+(char *)buf, len-count);
131    if (i<1) return i;
132    count += i;
133  }
134
135  return count;
136}
137
138// skip this many bytes of input. Return 0 for success, >0 means this much
139// left after input skipped.
140off_t lskip(int fd, off_t offset)
141{
142  off_t cur = lseek(fd, 0, SEEK_CUR);
143
144  if (cur != -1) {
145    off_t end = lseek(fd, 0, SEEK_END) - cur;
146
147    if (end > 0 && end < offset) return offset - end;
148    end = offset+cur;
149    if (end == lseek(fd, end, SEEK_SET)) return 0;
150    perror_exit("lseek");
151  }
152
153  while (offset>0) {
154    int try = offset>sizeof(libbuf) ? sizeof(libbuf) : offset, or;
155
156    or = readall(fd, libbuf, try);
157    if (or < 0) perror_exit("lskip to %lld", (long long)offset);
158    else offset -= or;
159    if (or < try) break;
160  }
161
162  return offset;
163}
164
165// flags: 1=make last dir (with mode lastmode, otherwise skips last component)
166//        2=make path (already exists is ok)
167//        4=verbose
168// returns 0 = path ok, 1 = error
169int mkpathat(int atfd, char *dir, mode_t lastmode, int flags)
170{
171  struct stat buf;
172  char *s;
173
174  // mkdir -p one/two/three is not an error if the path already exists,
175  // but is if "three" is a file. The others we dereference and catch
176  // not-a-directory along the way, but the last one we must explicitly
177  // test for. Might as well do it up front.
178
179  if (!fstatat(atfd, dir, &buf, 0) && !S_ISDIR(buf.st_mode)) {
180    errno = EEXIST;
181    return 1;
182  }
183
184  for (s = dir; ;s++) {
185    char save = 0;
186    mode_t mode = (0777&~toys.old_umask)|0300;
187
188    // find next '/', but don't try to mkdir "" at start of absolute path
189    if (*s == '/' && (flags&2) && s != dir) {
190      save = *s;
191      *s = 0;
192    } else if (*s) continue;
193
194    // Use the mode from the -m option only for the last directory.
195    if (!save) {
196      if (flags&1) mode = lastmode;
197      else break;
198    }
199
200    if (mkdirat(atfd, dir, mode)) {
201      if (!(flags&2) || errno != EEXIST) return 1;
202    } else if (flags&4)
203      fprintf(stderr, "%s: created directory '%s'\n", toys.which->name, dir);
204
205    if (!(*s = save)) break;
206  }
207
208  return 0;
209}
210
211// The common case
212int mkpath(char *dir)
213{
214  return mkpathat(AT_FDCWD, dir, 0, MKPATHAT_MAKE);
215}
216
217// Split a path into linked list of components, tracking head and tail of list.
218// Filters out // entries with no contents.
219struct string_list **splitpath(char *path, struct string_list **list)
220{
221  char *new = path;
222
223  *list = 0;
224  do {
225    int len;
226
227    if (*path && *path != '/') continue;
228    len = path-new;
229    if (len > 0) {
230      *list = xmalloc(sizeof(struct string_list) + len + 1);
231      (*list)->next = 0;
232      memcpy((*list)->str, new, len);
233      (*list)->str[len] = 0;
234      list = &(*list)->next;
235    }
236    new = path+1;
237  } while (*path++);
238
239  return list;
240}
241
242// Find all file in a colon-separated path with access type "type" (generally
243// X_OK or R_OK).  Returns a list of absolute paths to each file found, in
244// order.
245
246struct string_list *find_in_path(char *path, char *filename)
247{
248  struct string_list *rlist = NULL, **prlist=&rlist;
249  char *cwd;
250
251  if (!path) return 0;
252
253  cwd = xgetcwd();
254  for (;;) {
255    char *res, *next = strchr(path, ':');
256    int len = next ? next-path : strlen(path);
257    struct string_list *rnext;
258    struct stat st;
259
260    rnext = xmalloc(sizeof(void *) + strlen(filename)
261      + (len ? len : strlen(cwd)) + 2);
262    if (!len) sprintf(rnext->str, "%s/%s", cwd, filename);
263    else {
264      memcpy(res = rnext->str, path, len);
265      res += len;
266      *(res++) = '/';
267      strcpy(res, filename);
268    }
269
270    // Confirm it's not a directory.
271    if (!stat(rnext->str, &st) && S_ISREG(st.st_mode)) {
272      *prlist = rnext;
273      rnext->next = NULL;
274      prlist = &(rnext->next);
275    } else free(rnext);
276
277    if (!next) break;
278    path += len;
279    path++;
280  }
281  free(cwd);
282
283  return rlist;
284}
285
286long long estrtol(char *str, char **end, int base)
287{
288  errno = 0;
289
290  return strtoll(str, end, base);
291}
292
293long long xstrtol(char *str, char **end, int base)
294{
295  long long l = estrtol(str, end, base);
296
297  if (errno) perror_exit_raw(str);
298
299  return l;
300}
301
302// atol() with the kilo/mega/giga/tera/peta/exa extensions, plus word and block.
303// (zetta and yotta don't fit in 64 bits.)
304long long atolx(char *numstr)
305{
306  char *c = numstr, *suffixes="cwbkmgtpe", *end;
307  long long val;
308
309  val = xstrtol(numstr, &c, 0);
310  if (c != numstr && *c && (end = strchr(suffixes, tolower(*c)))) {
311    int shift = end-suffixes-2;
312    ++c;
313    if (shift==-1) val *= 2;
314    else if (!shift) val *= 512;
315    else if (shift>0) {
316      if (*c && tolower(*c++)=='d') while (shift--) val *= 1000;
317      else val *= 1LL<<(shift*10);
318    }
319  }
320  while (isspace(*c)) c++;
321  if (c==numstr || *c) error_exit("not integer: %s", numstr);
322
323  return val;
324}
325
326long long atolx_range(char *numstr, long long low, long long high)
327{
328  long long val = atolx(numstr);
329
330  if (val < low) error_exit("%lld < %lld", val, low);
331  if (val > high) error_exit("%lld > %lld", val, high);
332
333  return val;
334}
335
336int stridx(char *haystack, char needle)
337{
338  char *off;
339
340  if (!needle) return -1;
341  off = strchr(haystack, needle);
342  if (!off) return -1;
343
344  return off-haystack;
345}
346
347// Convert wc to utf8, returning bytes written. Does not null terminate.
348int wctoutf8(char *s, unsigned wc)
349{
350  int len = (wc>0x7ff)+(wc>0xffff), i;
351
352  if (wc<128) {
353    *s = wc;
354    return 1;
355  } else {
356    i = len;
357    do {
358      s[1+i] = 0x80+(wc&0x3f);
359      wc >>= 6;
360    } while (i--);
361    *s = (((signed char) 0x80) >> (len+1)) | wc;
362  }
363
364  return 2+len;
365}
366
367// Convert utf8 sequence to a unicode wide character
368int utf8towc(unsigned *wc, char *str, unsigned len)
369{
370  unsigned result, mask, first;
371  char *s, c;
372
373  // fast path ASCII
374  if (len && *str<128) return !!(*wc = *str);
375
376  result = first = *(s = str++);
377  if (result<0xc2 || result>0xf4) return -1;
378  for (mask = 6; (first&0xc0)==0xc0; mask += 5, first <<= 1) {
379    if (!--len) return -2;
380    if (((c = *(str++))&0xc0) != 0x80) return -1;
381    result = (result<<6)|(c&0x3f);
382  }
383  result &= (1<<mask)-1;
384  c = str-s;
385
386  // Avoid overlong encodings
387  if (result<(unsigned []){0x80,0x800,0x10000}[c-2]) return -1;
388
389  // Limit unicode so it can't encode anything UTF-16 can't.
390  if (result>0x10ffff || (result>=0xd800 && result<=0xdfff)) return -1;
391  *wc = result;
392
393  return str-s;
394}
395
396char *strlower(char *s)
397{
398  char *try, *new;
399
400  if (!CFG_TOYBOX_I18N) {
401    try = new = xstrdup(s);
402    for (; *s; s++) *(new++) = tolower(*s);
403  } else {
404    // I can't guarantee the string _won't_ expand during reencoding, so...?
405    try = new = xmalloc(strlen(s)*2+1);
406
407    while (*s) {
408      unsigned c;
409      int len = utf8towc(&c, s, MB_CUR_MAX);
410
411      if (len < 1) *(new++) = *(s++);
412      else {
413        s += len;
414        // squash title case too
415        c = towlower(c);
416
417        // if we had a valid utf8 sequence, convert it to lower case, and can't
418        // encode back to utf8, something is wrong with your libc. But just
419        // in case somebody finds an exploit...
420        len = wcrtomb(new, c, 0);
421        if (len < 1) error_exit("bad utf8 %x", (int)c);
422        new += len;
423      }
424    }
425    *new = 0;
426  }
427
428  return try;
429}
430
431// strstr but returns pointer after match
432char *strafter(char *haystack, char *needle)
433{
434  char *s = strstr(haystack, needle);
435
436  return s ? s+strlen(needle) : s;
437}
438
439// Remove trailing \n
440char *chomp(char *s)
441{
442  char *p = strrchr(s, '\n');
443
444  if (p && !p[1]) *p = 0;
445  return s;
446}
447
448int unescape(char c)
449{
450  char *from = "\\abefnrtv", *to = "\\\a\b\033\f\n\r\t\v";
451  int idx = stridx(from, c);
452
453  return (idx == -1) ? 0 : to[idx];
454}
455
456// parse next character advancing pointer. echo requires leading 0 in octal esc
457int unescape2(char **c, int echo)
458{
459  int idx = *((*c)++), i, off;
460
461  if (idx != '\\' || !**c) return idx;
462  if (**c == 'c') return 31&*(++*c);
463  for (i = 0; i<4; i++) {
464    if (sscanf(*c, (char *[]){"0%3o%n"+!echo, "x%2x%n", "u%4x%n", "U%6x%n"}[i],
465        &idx, &off) > 0)
466    {
467      *c += off;
468
469      return idx;
470    }
471  }
472
473  if (-1 == (idx = stridx("\\abeEfnrtv'\"?0", **c))) return '\\';
474  ++*c;
475
476  return "\\\a\b\033\033\f\n\r\t\v'\"?"[idx];
477}
478
479// If string ends with suffix return pointer to start of suffix in string,
480// else NULL
481char *strend(char *str, char *suffix)
482{
483  long a = strlen(str), b = strlen(suffix);
484
485  if (a>b && !strcmp(str += a-b, suffix)) return str;
486
487  return 0;
488}
489
490// If *a starts with b, advance *a past it and return 1, else return 0;
491int strstart(char **a, char *b)
492{
493  char *c = *a;
494
495  while (*b && *c == *b) b++, c++;
496  if (!*b) *a = c;
497
498  return !*b;
499}
500
501// If *a starts with b, advance *a past it and return 1, else return 0;
502int strcasestart(char **a, char *b)
503{
504  int len = strlen(b), i = !strncasecmp(*a, b, len);
505
506  if (i) *a += len;
507
508  return i;
509}
510
511// Return how long the file at fd is, if there's any way to determine it.
512off_t fdlength(int fd)
513{
514  struct stat st;
515  off_t base = 0, range = 1, expand = 1, old;
516
517  if (!fstat(fd, &st) && S_ISREG(st.st_mode)) return st.st_size;
518
519  // If the ioctl works for this, return it.
520  // TODO: is blocksize still always 512, or do we stat for it?
521  // unsigned int size;
522  // if (ioctl(fd, BLKGETSIZE, &size) >= 0) return size*512L;
523
524  // If not, do a binary search for the last location we can read.  (Some
525  // block devices don't do BLKGETSIZE right.)  This should probably have
526  // a CONFIG option...
527
528  // If not, do a binary search for the last location we can read.
529
530  old = lseek(fd, 0, SEEK_CUR);
531  do {
532    char temp;
533    off_t pos = base + range / 2;
534
535    if (lseek(fd, pos, 0)>=0 && read(fd, &temp, 1)==1) {
536      off_t delta = (pos + 1) - base;
537
538      base += delta;
539      if (expand) range = (expand <<= 1) - base;
540      else range -= delta;
541    } else {
542      expand = 0;
543      range = pos - base;
544    }
545  } while (range > 0);
546
547  lseek(fd, old, SEEK_SET);
548
549  return base;
550}
551
552// Read contents of file as a single nul-terminated string.
553// measure file size if !len, allocate buffer if !buf
554// Existing buffers need len in *plen
555// Returns amount of data read in *plen
556char *readfileat(int dirfd, char *name, char *ibuf, off_t *plen)
557{
558  off_t len, rlen;
559  int fd;
560  char *buf, *rbuf;
561
562  // Unsafe to probe for size with a supplied buffer, don't ever do that.
563  if (CFG_TOYBOX_DEBUG && (ibuf ? !*plen : *plen)) error_exit("bad readfileat");
564
565  if (-1 == (fd = openat(dirfd, name, O_RDONLY))) return 0;
566
567  // If we dunno the length, probe it. If we can't probe, start with 1 page.
568  if (!*plen) {
569    if ((len = fdlength(fd))>0) *plen = len;
570    else len = 4096;
571  } else len = *plen-1;
572
573  if (!ibuf) buf = xmalloc(len+1);
574  else buf = ibuf;
575
576  for (rbuf = buf;;) {
577    rlen = readall(fd, rbuf, len);
578    if (*plen || rlen<len) break;
579
580    // If reading unknown size, expand buffer by 1.5 each time we fill it up.
581    rlen += rbuf-buf;
582    buf = xrealloc(buf, len = (rlen*3)/2);
583    rbuf = buf+rlen;
584    len -= rlen;
585  }
586  *plen = len = rlen+(rbuf-buf);
587  close(fd);
588
589  if (rlen<0) {
590    if (ibuf != buf) free(buf);
591    buf = 0;
592  } else buf[len] = 0;
593
594  return buf;
595}
596
597char *readfile(char *name, char *ibuf, off_t len)
598{
599  return readfileat(AT_FDCWD, name, ibuf, &len);
600}
601
602// Sleep for this many thousandths of a second
603void msleep(long milliseconds)
604{
605  struct timespec ts;
606
607  ts.tv_sec = milliseconds/1000;
608  ts.tv_nsec = (milliseconds%1000)*1000000;
609  nanosleep(&ts, &ts);
610}
611
612// Adjust timespec by nanosecond offset
613void nanomove(struct timespec *ts, long long offset)
614{
615  long long nano = ts->tv_nsec + offset, secs = nano/1000000000;
616
617  ts->tv_sec += secs;
618  nano %= 1000000000;
619  if (nano<0) {
620    ts->tv_sec--;
621    nano += 1000000000;
622  }
623  ts->tv_nsec = nano;
624}
625
626// return difference between two timespecs in nanosecs
627long long nanodiff(struct timespec *old, struct timespec *new)
628{
629  return (new->tv_sec - old->tv_sec)*1000000000LL+(new->tv_nsec - old->tv_nsec);
630}
631
632// return 1<<x of highest bit set
633int highest_bit(unsigned long l)
634{
635  int i;
636
637  for (i = 0; l; i++) l >>= 1;
638
639  return i-1;
640}
641
642// Inefficient, but deals with unaligned access
643int64_t peek_le(void *ptr, unsigned size)
644{
645  int64_t ret = 0;
646  char *c = ptr;
647  int i;
648
649  for (i=0; i<size; i++) ret |= ((int64_t)c[i])<<(i*8);
650  return ret;
651}
652
653int64_t peek_be(void *ptr, unsigned size)
654{
655  int64_t ret = 0;
656  char *c = ptr;
657  int i;
658
659  for (i=0; i<size; i++) ret = (ret<<8)|(c[i]&0xff);
660  return ret;
661}
662
663int64_t peek(void *ptr, unsigned size)
664{
665  return (IS_BIG_ENDIAN ? peek_be : peek_le)(ptr, size);
666}
667
668void poke_le(void *ptr, long long val, unsigned size)
669{
670  char *c = ptr;
671
672  while (size--) {
673    *c++ = val&255;
674    val >>= 8;
675  }
676}
677
678void poke_be(void *ptr, long long val, unsigned size)
679{
680  char *c = ptr + size;
681
682  while (size--) {
683    *--c = val&255;
684    val >>=8;
685  }
686}
687
688void poke(void *ptr, long long val, unsigned size)
689{
690  (IS_BIG_ENDIAN ? poke_be : poke_le)(ptr, val, size);
691}
692
693// Iterate through an array of files, opening each one and calling a function
694// on that filehandle and name. The special filename "-" means stdin if
695// flags is O_RDONLY, stdout otherwise. An empty argument list calls
696// function() on just stdin/stdout.
697//
698// Note: pass O_CLOEXEC to automatically close filehandles when function()
699// returns, otherwise filehandles must be closed by function().
700// pass WARN_ONLY to produce warning messages about files it couldn't
701// open/create, and skip them. Otherwise function is called with fd -1.
702void loopfiles_rw(char **argv, int flags, int permissions,
703  void (*function)(int fd, char *name))
704{
705  int fd, failok = !(flags&WARN_ONLY);
706
707  flags &= ~WARN_ONLY;
708
709  // If no arguments, read from stdin.
710  if (!*argv) function((flags & O_ACCMODE) != O_RDONLY ? 1 : 0, "-");
711  else do {
712    // Filename "-" means read from stdin.
713    // Inability to open a file prints a warning, but doesn't exit.
714
715    if (!strcmp(*argv, "-")) fd = 0;
716    else if (0>(fd = notstdio(open(*argv, flags, permissions))) && !failok) {
717      perror_msg_raw(*argv);
718      continue;
719    }
720    function(fd, *argv);
721    if ((flags & O_CLOEXEC) && fd) close(fd);
722  } while (*++argv);
723}
724
725// Call loopfiles_rw with O_RDONLY|O_CLOEXEC|WARN_ONLY (common case)
726void loopfiles(char **argv, void (*function)(int fd, char *name))
727{
728  loopfiles_rw(argv, O_RDONLY|O_CLOEXEC|WARN_ONLY, 0, function);
729}
730
731// glue to call do_lines() from loopfiles
732static void (*do_lines_bridge)(char **pline, long len);
733static void loopfile_lines_bridge(int fd, char *name)
734{
735  do_lines(fd, '\n', do_lines_bridge);
736}
737
738void loopfiles_lines(char **argv, void (*function)(char **pline, long len))
739{
740  do_lines_bridge = function;
741  // No O_CLOEXEC because we need to call fclose.
742  loopfiles_rw(argv, O_RDONLY|WARN_ONLY, 0, loopfile_lines_bridge);
743}
744
745// Slow, but small.
746char *get_line(int fd)
747{
748  char c, *buf = NULL;
749  long len = 0;
750
751  for (;;) {
752    if (1>read(fd, &c, 1)) break;
753    if (!(len & 63)) buf=xrealloc(buf, len+65);
754    if ((buf[len++]=c) == '\n') break;
755  }
756  if (buf) {
757    buf[len]=0;
758    if (buf[--len]=='\n') buf[len]=0;
759  }
760
761  return buf;
762}
763
764int wfchmodat(int fd, char *name, mode_t mode)
765{
766  int rc = fchmodat(fd, name, mode, 0);
767
768  if (rc) {
769    perror_msg("chmod '%s' to %04o", name, mode);
770    toys.exitval=1;
771  }
772  return rc;
773}
774
775static char *tempfile2zap;
776static void tempfile_handler(void)
777{
778  if (1 < (long)tempfile2zap) unlink(tempfile2zap);
779}
780
781// Open a temporary file to copy an existing file into.
782int copy_tempfile(int fdin, char *name, char **tempname)
783{
784  struct stat statbuf;
785  int fd = xtempfile(name, tempname), ignored __attribute__((__unused__));
786
787  // Record tempfile for exit cleanup if interrupted
788  if (!tempfile2zap) sigatexit(tempfile_handler);
789  tempfile2zap = *tempname;
790
791  // Set permissions of output file.
792  if (!fstat(fdin, &statbuf)) fchmod(fd, statbuf.st_mode);
793
794  // We chmod before chown, which strips the suid bit. Caller has to explicitly
795  // switch it back on if they want to keep suid.
796
797  // Suppress warn-unused-result. Both gcc and clang clutch their pearls about
798  // this but it's _supposed_ to fail when we're not root.
799  ignored = fchown(fd, statbuf.st_uid, statbuf.st_gid);
800
801  return fd;
802}
803
804// Abort the copy and delete the temporary file.
805void delete_tempfile(int fdin, int fdout, char **tempname)
806{
807  close(fdin);
808  close(fdout);
809  if (*tempname) unlink(*tempname);
810  tempfile2zap = (char *)1;
811  free(*tempname);
812  *tempname = NULL;
813}
814
815// Copy the rest of the data and replace the original with the copy.
816void replace_tempfile(int fdin, int fdout, char **tempname)
817{
818  char *temp = xstrdup(*tempname);
819
820  temp[strlen(temp)-6]=0;
821  if (fdin != -1) {
822    xsendfile(fdin, fdout);
823    xclose(fdin);
824  }
825  xclose(fdout);
826  xrename(*tempname, temp);
827  tempfile2zap = (char *)1;
828  free(*tempname);
829  free(temp);
830  *tempname = NULL;
831}
832
833// Create a 256 entry CRC32 lookup table.
834
835void crc_init(unsigned int *crc_table, int little_endian)
836{
837  unsigned int i;
838
839  // Init the CRC32 table (big endian)
840  for (i=0; i<256; i++) {
841    unsigned int j, c = little_endian ? i : i<<24;
842    for (j=8; j; j--)
843      if (little_endian) c = (c&1) ? (c>>1)^0xEDB88320 : c>>1;
844      else c=c&0x80000000 ? (c<<1)^0x04c11db7 : (c<<1);
845    crc_table[i] = c;
846  }
847}
848
849// Init base64 table
850
851void base64_init(char *p)
852{
853  int i;
854
855  for (i = 'A'; i != ':'; i++) {
856    if (i == 'Z'+1) i = 'a';
857    if (i == 'z'+1) i = '0';
858    *(p++) = i;
859  }
860  *(p++) = '+';
861  *(p++) = '/';
862}
863
864int yesno(int def)
865{
866  return fyesno(stdin, def);
867}
868
869int fyesno(FILE *in, int def)
870{
871  char buf;
872
873  fprintf(stderr, " (%c/%c):", def ? 'Y' : 'y', def ? 'n' : 'N');
874  fflush(stderr);
875  while (fread(&buf, 1, 1, in)) {
876    int new;
877
878    // The letter changes the value, the newline (or space) returns it.
879    if (isspace(buf)) break;
880    if (-1 != (new = stridx("ny", tolower(buf)))) def = new;
881  }
882
883  return def;
884}
885
886// Handler that sets toys.signal, and writes to toys.signalfd if set
887void generic_signal(int sig)
888{
889  if (toys.signalfd) {
890    char c = sig;
891
892    writeall(toys.signalfd, &c, 1);
893  }
894  toys.signal = sig;
895}
896
897void exit_signal(int sig)
898{
899  if (sig) toys.exitval = sig|128;
900  xexit();
901}
902
903// Install the same handler on every signal that defaults to killing the
904// process, calling the handler on the way out. Calling multiple times
905// adds the handlers to a list, to be called in order.
906void sigatexit(void *handler)
907{
908  xsignal_all_killers(handler ? exit_signal : SIG_DFL);
909
910  if (handler) {
911    struct arg_list *al = xmalloc(sizeof(struct arg_list));
912
913    al->next = toys.xexit;
914    al->arg = handler;
915    toys.xexit = al;
916  } else {
917    llist_traverse(toys.xexit, free);
918    toys.xexit = 0;
919  }
920}
921
922// Output a nicely formatted 80-column table of all the signals.
923void list_signals()
924{
925  int i = 0, count = 0;
926  char *name;
927
928  for (; i<=NSIG; i++) {
929    if ((name = num_to_sig(i))) {
930      printf("%2d) SIG%-9s", i, name);
931      if (++count % 5 == 0) putchar('\n');
932    }
933  }
934  putchar('\n');
935}
936
937// premute mode bits based on posix mode strings.
938mode_t string_to_mode(char *modestr, mode_t mode)
939{
940  char *whos = "ogua", *hows = "=+-", *whats = "xwrstX", *whys = "ogu",
941       *s, *str = modestr;
942  mode_t extrabits = mode & ~(07777);
943
944  // Handle octal mode
945  if (isdigit(*str)) {
946    mode = estrtol(str, &s, 8);
947    if (errno || *s || (mode & ~(07777))) goto barf;
948
949    return mode | extrabits;
950  }
951
952  // Gaze into the bin of permission...
953  for (;;) {
954    int i, j, dowho, dohow, dowhat, amask;
955
956    dowho = dohow = dowhat = amask = 0;
957
958    // Find the who, how, and what stanzas, in that order
959    while (*str && (s = strchr(whos, *str))) {
960      dowho |= 1<<(s-whos);
961      str++;
962    }
963    // If who isn't specified, like "a" but honoring umask.
964    if (!dowho) {
965      dowho = 8;
966      umask(amask=umask(0));
967    }
968    if (!*str || !(s = strchr(hows, *str))) goto barf;
969    dohow = *(str++);
970
971    if (!dohow) goto barf;
972    while (*str && (s = strchr(whats, *str))) {
973      dowhat |= 1<<(s-whats);
974      str++;
975    }
976
977    // Convert X to x for directory or if already executable somewhere
978    if ((dowhat&32) &&  (S_ISDIR(mode) || (mode&0111))) dowhat |= 1;
979
980    // Copy mode from another category?
981    if (!dowhat && *str && (s = strchr(whys, *str))) {
982      dowhat = (mode>>(3*(s-whys)))&7;
983      str++;
984    }
985
986    // Are we ready to do a thing yet?
987    if (*str && *(str++) != ',') goto barf;
988
989    // Ok, apply the bits to the mode.
990    for (i=0; i<4; i++) {
991      for (j=0; j<3; j++) {
992        mode_t bit = 0;
993        int where = 1<<((3*i)+j);
994
995        if (amask & where) continue;
996
997        // Figure out new value at this location
998        if (i == 3) {
999          // suid/sticky bit.
1000          if (j) {
1001            if ((dowhat & 8) && (dowho&(8|(1<<i)))) bit++;
1002          } else if (dowhat & 16) bit++;
1003        } else {
1004          if (!(dowho&(8|(1<<i)))) continue;
1005          if (dowhat&(1<<j)) bit++;
1006        }
1007
1008        // When selection active, modify bit
1009
1010        if (dohow == '=' || (bit && dohow == '-')) mode &= ~where;
1011        if (bit && dohow != '-') mode |= where;
1012      }
1013    }
1014
1015    if (!*str) break;
1016  }
1017
1018  return mode|extrabits;
1019barf:
1020  error_exit("bad mode '%s'", modestr);
1021}
1022
1023// Format access mode into a drwxrwxrwx string
1024void mode_to_string(mode_t mode, char *buf)
1025{
1026  char c, d;
1027  int i, bit;
1028
1029  buf[10]=0;
1030  for (i=0; i<9; i++) {
1031    bit = mode & (1<<i);
1032    c = i%3;
1033    if (!c && (mode & (1<<((d=i/3)+9)))) {
1034      c = "tss"[d];
1035      if (!bit) c &= ~0x20;
1036    } else c = bit ? "xwr"[c] : '-';
1037    buf[9-i] = c;
1038  }
1039
1040  if (S_ISDIR(mode)) c = 'd';
1041  else if (S_ISBLK(mode)) c = 'b';
1042  else if (S_ISCHR(mode)) c = 'c';
1043  else if (S_ISLNK(mode)) c = 'l';
1044  else if (S_ISFIFO(mode)) c = 'p';
1045  else if (S_ISSOCK(mode)) c = 's';
1046  else c = '-';
1047  *buf = c;
1048}
1049
1050// dirname() can modify its argument or return a pointer to a constant string
1051// This always returns a malloc() copy of everyting before last (run of ) '/'.
1052char *getdirname(char *name)
1053{
1054  char *s = xstrdup(name), *ss = strrchr(s, '/');
1055
1056  while (ss && *ss && *ss == '/' && s != ss) *ss-- = 0;
1057
1058  return s;
1059}
1060
1061// basename() can modify its argument or return a pointer to a constant string
1062// This just gives after the last '/' or the whole stirng if no /
1063char *getbasename(char *name)
1064{
1065  char *s = strrchr(name, '/');
1066
1067  if (s) return s+1;
1068
1069  return name;
1070}
1071
1072// Return pointer to xabspath(file) if file is under dir, else 0
1073char *fileunderdir(char *file, char *dir)
1074{
1075  char *s1 = xabspath(dir, 1), *s2 = xabspath(file, -1), *ss = s2;
1076  int rc = s1 && s2 && strstart(&ss, s1) && (!s1[1] || s2[strlen(s1)] == '/');
1077
1078  free(s1);
1079  if (!rc) free(s2);
1080
1081  return rc ? s2 : 0;
1082}
1083
1084// Execute a callback for each PID that matches a process name from a list.
1085void names_to_pid(char **names, int (*callback)(pid_t pid, char *name),
1086    int scripts)
1087{
1088  DIR *dp;
1089  struct dirent *entry;
1090
1091  if (!(dp = opendir("/proc"))) perror_exit("no /proc");
1092
1093  while ((entry = readdir(dp))) {
1094    unsigned u = atoi(entry->d_name);
1095    char *cmd = 0, *comm = 0, **cur;
1096    off_t len;
1097
1098    if (!u) continue;
1099
1100    // Comm is original name of executable (argv[0] could be #! interpreter)
1101    // but it's limited to 15 characters
1102    if (scripts) {
1103      sprintf(libbuf, "/proc/%u/comm", u);
1104      len = sizeof(libbuf);
1105      if (!(comm = readfileat(AT_FDCWD, libbuf, libbuf, &len)) || !len)
1106        continue;
1107      if (libbuf[len-1] == '\n') libbuf[--len] = 0;
1108    }
1109
1110    for (cur = names; *cur; cur++) {
1111      struct stat st1, st2;
1112      char *bb = getbasename(*cur);
1113      off_t len = strlen(bb);
1114
1115      // Fast path: only matching a filename (no path) that fits in comm.
1116      // `len` must be 14 or less because with a full 15 bytes we don't
1117      // know whether the name fit or was truncated.
1118      if (scripts && len<=14 && bb==*cur && !strcmp(comm, bb)) goto match;
1119
1120      // If we have a path to existing file only match if same inode
1121      if (bb!=*cur && !stat(*cur, &st1)) {
1122        char buf[32];
1123
1124        sprintf(buf, "/proc/%u/exe", u);
1125        if (stat(buf, &st2)) continue;
1126        if (st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) continue;
1127        goto match;
1128      }
1129
1130      // Nope, gotta read command line to confirm
1131      if (!cmd) {
1132        sprintf(cmd = libbuf+16, "/proc/%u/cmdline", u);
1133        len = sizeof(libbuf)-17;
1134        if (!(cmd = readfileat(AT_FDCWD, cmd, cmd, &len))) continue;
1135        // readfile only guarantees one null terminator and we need two
1136        // (yes the kernel should do this for us, don't care)
1137        cmd[len] = 0;
1138      }
1139      if (!strcmp(bb, getbasename(cmd))) goto match;
1140      if (scripts && !strcmp(bb, getbasename(cmd+strlen(cmd)+1))) goto match;
1141      continue;
1142match:
1143      if (callback(u, *cur)) break;
1144    }
1145  }
1146  closedir(dp);
1147}
1148
1149// display first "dgt" many digits of number plus unit (kilo-exabytes)
1150int human_readable_long(char *buf, unsigned long long num, int dgt, int style)
1151{
1152  unsigned long long snap = 0;
1153  int len, unit, divisor = (style&HR_1000) ? 1000 : 1024;
1154
1155  // Divide rounding up until we have 3 or fewer digits. Since the part we
1156  // print is decimal, the test is 999 even when we divide by 1024.
1157  // We can't run out of units because 1<<64 is 18 exabytes.
1158  for (unit = 0; snprintf(0, 0, "%llu", num)>dgt; unit++)
1159    num = ((snap = num)+(divisor/2))/divisor;
1160  len = sprintf(buf, "%llu", num);
1161  if (unit && len == 1) {
1162    // Redo rounding for 1.2M case, this works with and without HR_1000.
1163    num = snap/divisor;
1164    snap -= num*divisor;
1165    snap = ((snap*100)+50)/divisor;
1166    snap /= 10;
1167    len = sprintf(buf, "%llu.%llu", num, snap);
1168  }
1169  if (style & HR_SPACE) buf[len++] = ' ';
1170  if (unit) {
1171    unit = " kMGTPE"[unit];
1172
1173    if (!(style&HR_1000)) unit = toupper(unit);
1174    buf[len++] = unit;
1175  } else if (style & HR_B) buf[len++] = 'B';
1176  buf[len] = 0;
1177
1178  return len;
1179}
1180
1181// Give 3 digit estimate + units ala 999M or 1.7T
1182int human_readable(char *buf, unsigned long long num, int style)
1183{
1184  return human_readable_long(buf, num, 3, style);
1185}
1186
1187// The qsort man page says you can use alphasort, the posix committee
1188// disagreed, and doubled down: http://austingroupbugs.net/view.php?id=142
1189// So just do our own. (The const is entirely to humor the stupid compiler.)
1190int qstrcmp(const void *a, const void *b)
1191{
1192  return strcmp(*(char **)a, *(char **)b);
1193}
1194
1195// See https://tools.ietf.org/html/rfc4122, specifically section 4.4
1196// "Algorithms for Creating a UUID from Truly Random or Pseudo-Random
1197// Numbers".
1198void create_uuid(char *uuid)
1199{
1200  // "Set all the ... bits to randomly (or pseudo-randomly) chosen values".
1201  xgetrandom(uuid, 16, 0);
1202
1203  // "Set the four most significant bits ... of the time_hi_and_version
1204  // field to the 4-bit version number [4]".
1205  uuid[6] = (uuid[6] & 0x0F) | 0x40;
1206  // "Set the two most significant bits (bits 6 and 7) of
1207  // clock_seq_hi_and_reserved to zero and one, respectively".
1208  uuid[8] = (uuid[8] & 0x3F) | 0x80;
1209}
1210
1211char *show_uuid(char *uuid)
1212{
1213  char *out = libbuf;
1214  int i;
1215
1216  for (i=0; i<16; i++) out+=sprintf(out, "-%02x"+!(0x550&(1<<i)), uuid[i]);
1217  *out = 0;
1218
1219  return libbuf;
1220}
1221
1222// Returns pointer to letter at end, 0 if none. *start = initial %
1223char *next_printf(char *s, char **start)
1224{
1225  for (; *s; s++) {
1226    if (*s != '%') continue;
1227    if (*++s == '%') continue;
1228    if (start) *start = s-1;
1229    while (0 <= stridx("0'#-+ ", *s)) s++;
1230    while (isdigit(*s)) s++;
1231    if (*s == '.') s++;
1232    while (isdigit(*s)) s++;
1233
1234    return s;
1235  }
1236
1237  return 0;
1238}
1239
1240int dev_minor(int dev)
1241{
1242  return ((dev&0xfff00000)>>12)|(dev&0xff);
1243}
1244
1245int dev_major(int dev)
1246{
1247  return (dev&0xfff00)>>8;
1248}
1249
1250int dev_makedev(int major, int minor)
1251{
1252  return (minor&0xff)|((major&0xfff)<<8)|((minor&0xfff00)<<12);
1253}
1254
1255// Return cached passwd entries.
1256struct passwd *bufgetpwuid(uid_t uid)
1257{
1258  struct pwuidbuf_list {
1259    struct pwuidbuf_list *next;
1260    struct passwd pw;
1261  } *list = 0;
1262  struct passwd *temp;
1263  static struct pwuidbuf_list *pwuidbuf;
1264  unsigned size = 256;
1265
1266  // If we already have this one, return it.
1267  for (list = pwuidbuf; list; list = list->next)
1268    if (list->pw.pw_uid == uid) return &(list->pw);
1269
1270  for (;;) {
1271    list = xrealloc(list, size *= 2);
1272    errno = getpwuid_r(uid, &list->pw, sizeof(*list)+(char *)list,
1273      size-sizeof(*list), &temp);
1274    if (errno != ERANGE) break;
1275  }
1276
1277  if (!temp) {
1278    free(list);
1279
1280    return 0;
1281  }
1282  list->next = pwuidbuf;
1283  pwuidbuf = list;
1284
1285  return &list->pw;
1286}
1287
1288// Return cached group entries.
1289struct group *bufgetgrgid(gid_t gid)
1290{
1291  struct grgidbuf_list {
1292    struct grgidbuf_list *next;
1293    struct group gr;
1294  } *list = 0;
1295  struct group *temp;
1296  static struct grgidbuf_list *grgidbuf;
1297  unsigned size = 256;
1298
1299  for (list = grgidbuf; list; list = list->next)
1300    if (list->gr.gr_gid == gid) return &(list->gr);
1301
1302  for (;;) {
1303    list = xrealloc(list, size *= 2);
1304    errno = getgrgid_r(gid, &list->gr, sizeof(*list)+(char *)list,
1305      size-sizeof(*list), &temp);
1306    if (errno != ERANGE) break;
1307  }
1308  if (!temp) {
1309    free(list);
1310
1311    return 0;
1312  }
1313  list->next = grgidbuf;
1314  grgidbuf = list;
1315
1316  return &list->gr;
1317}
1318
1319// Always null terminates, returns 0 for failure, len for success
1320int readlinkat0(int dirfd, char *path, char *buf, int len)
1321{
1322  if (!len) return 0;
1323
1324  len = readlinkat(dirfd, path, buf, len-1);
1325  if (len<0) len = 0;
1326  buf[len] = 0;
1327
1328  return len;
1329}
1330
1331int readlink0(char *path, char *buf, int len)
1332{
1333  return readlinkat0(AT_FDCWD, path, buf, len);
1334}
1335
1336// Do regex matching with len argument to handle embedded NUL bytes in string
1337int regexec0(regex_t *preg, char *string, long len, int nmatch,
1338  regmatch_t *pmatch, int eflags)
1339{
1340  regmatch_t backup;
1341
1342  if (!nmatch) pmatch = &backup;
1343  pmatch->rm_so = 0;
1344  pmatch->rm_eo = len;
1345  return regexec(preg, string, nmatch, pmatch, eflags|REG_STARTEND);
1346}
1347
1348// Return user name or string representation of number, returned buffer
1349// lasts until next call.
1350char *getusername(uid_t uid)
1351{
1352  struct passwd *pw = bufgetpwuid(uid);
1353  static char unum[12];
1354
1355  sprintf(unum, "%u", (unsigned)uid);
1356  return pw ? pw->pw_name : unum;
1357}
1358
1359// Return group name or string representation of number, returned buffer
1360// lasts until next call.
1361char *getgroupname(gid_t gid)
1362{
1363  struct group *gr = bufgetgrgid(gid);
1364  static char gnum[12];
1365
1366  sprintf(gnum, "%u", (unsigned)gid);
1367  return gr ? gr->gr_name : gnum;
1368}
1369
1370// Iterate over lines in file, calling function. Function can write 0 to
1371// the line pointer if they want to keep it, or 1 to terminate processing,
1372// otherwise line is freed. Passed file descriptor is closed at the end.
1373// At EOF calls function(0, 0)
1374void do_lines(int fd, char delim, void (*call)(char **pline, long len))
1375{
1376  FILE *fp = fd ? xfdopen(fd, "r") : stdin;
1377
1378  for (;;) {
1379    char *line = 0;
1380    ssize_t len;
1381
1382    len = getdelim(&line, (void *)&len, delim, fp);
1383    if (len > 0) {
1384      call(&line, len);
1385      if (line == (void *)1) break;
1386      free(line);
1387    } else break;
1388  }
1389  call(0, 0);
1390
1391  if (fd) fclose(fp);
1392}
1393
1394// Return unix time in milliseconds
1395long long millitime(void)
1396{
1397  struct timespec ts;
1398
1399  clock_gettime(CLOCK_MONOTONIC, &ts);
1400  return ts.tv_sec*1000+ts.tv_nsec/1000000;
1401}
1402
1403// Formats `ts` in ISO format ("2018-06-28 15:08:58.846386216 -0700").
1404char *format_iso_time(char *buf, size_t len, struct timespec *ts)
1405{
1406  char *s = buf;
1407
1408  s += strftime(s, len, "%F %T", localtime(&(ts->tv_sec)));
1409  s += sprintf(s, ".%09ld ", ts->tv_nsec);
1410  s += strftime(s, len-strlen(buf), "%z", localtime(&(ts->tv_sec)));
1411
1412  return buf;
1413}
1414
1415// Syslog with the openlog/closelog, autodetecting daemon status via no tty
1416
1417void loggit(int priority, char *format, ...)
1418{
1419  int i, facility = LOG_DAEMON;
1420  va_list va;
1421
1422  for (i = 0; i<3; i++) if (isatty(i)) facility = LOG_AUTH;
1423  openlog(toys.which->name, LOG_PID, facility);
1424  va_start(va, format);
1425  vsyslog(priority, format, va);
1426  va_end(va);
1427  closelog();
1428}
1429
1430// Calculate tar packet checksum, with cksum field treated as 8 spaces
1431unsigned tar_cksum(void *data)
1432{
1433  unsigned i, cksum = 8*' ';
1434
1435  for (i = 0; i<500; i += (i==147) ? 9 : 1) cksum += ((char *)data)[i];
1436
1437  return cksum;
1438}
1439
1440// is this a valid tar header?
1441int is_tar_header(void *pkt)
1442{
1443  char *p = pkt;
1444  int i = 0;
1445
1446  if (p[257] && memcmp("ustar", p+257, 5)) return 0;
1447  if (p[148] != '0' && p[148] != ' ') return 0;
1448  sscanf(p+148, "%8o", &i);
1449
1450  return i && tar_cksum(pkt) == i;
1451}
1452