/* ISC license. */ #include #include #include #include #include #include #include #include #ifdef PATH_MAX # define S6_PATH_MAX PATH_MAX #else # define S6_PATH_MAX 4096 #endif void s6_supervise_unlink (char const *scdir, char const *name, uint32_t options) { int e = errno ; int fd = -1 ; size_t scdirlen = strlen(scdir) ; size_t namelen = strlen(name) ; char fn[scdirlen + namelen + sizeof(S6_SUPERVISE_CTLDIR) + 10] ; memcpy(fn, scdir, scdirlen) ; fn[scdirlen] = '/' ; memcpy(fn + scdirlen + 1, name, namelen) ; if (options & 1) { fn[scdirlen + 1 + namelen] = '/' ; memcpy(fn + scdirlen + 1 + namelen + 1, S6_SUPERVISE_CTLDIR, sizeof(S6_SUPERVISE_CTLDIR) - 1) ; memcpy(fn + scdirlen + 1 + namelen + sizeof(S6_SUPERVISE_CTLDIR), "/control", 9) ; fd = open_write(fn) ; } fn[scdirlen + 1 + namelen] = 0 ; unlink_void(fn) ; if (fd >= 0) { fd_write(fd, "xd", 1 + !!(options & 2)) ; fd_close(fd) ; } errno = e ; }