int main (int argc, char const *const *argv) { stralloc sa = STRALLOC_ZERO ; int nl = 1 ; PROG = "s6-dirname" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "n", &l) ; if (opt == -1) break ; switch (opt) { case 'n' : nl = 0 ; break ; default : strerr_dieusage(100, USAGE) ; } } argc -= l.ind ; argv += l.ind ; } if (!argc) strerr_dieusage(100, USAGE) ; if (!sadirname(&sa, argv[0], str_len(argv[0]))) strerr_diefu2sys(111, "get dirname of ", argv[0]) ; if (nl && !stralloc_catb(&sa, "\n", 1)) strerr_diefu2sys(111, "get dirname of ", argv[0]) ; if (allwrite(1, sa.s, sa.len) < sa.len) strerr_diefu1sys(111, "write to stdout") ; return 0 ; }
char *dirname (char *s) { static stralloc dirname_sa = STRALLOC_ZERO ; static char dot0[2] = "." ; char *dot = dot0 ; if (!s) return dot ; dirname_sa.len = 0 ; if (!sadirname(&dirname_sa, s, str_len(s))) return 0 ; if (!stralloc_0(&dirname_sa)) return 0 ; return dirname_sa.s ; }
int s6rc_sanitize_dir (stralloc *sa, char const *fn, unsigned int *dirlen) { int wasnull = !sa->s ; unsigned int base = sa->len ; unsigned int fnlen = str_len(fn) ; unsigned int ddirlen ; if (!sadirname(sa, fn, fnlen)) return 0 ; if (sa->len != base + 1 || sa->s[base] != '/') if (!stralloc_catb(sa, "/", 1)) goto err ; ddirlen = sa->len ; if (!sabasename(sa, fn, fnlen)) goto err ; *dirlen = ddirlen ; return 1 ; err: if (wasnull) stralloc_free(sa) ; else sa->len = base ; return 0 ; }