#include #include #include #include #include #include #define USAGE "sdnotifywrapper fd socket prog..." int newsock(char const *p) { int s = ipc_datagram_coe(); if (s == -1) return -1; if (ipc_bind_reuse(s, p) == -1) return -1; return s; } int monitor(int nfd, int sfd) { pid_t pid = doublefork(); if (pid != 0) return pid > 0 ? 0 : -1; size_t len = 100, n; ssize_t r; char p[len]; for (;;) { memset(&p, 0, sizeof p); r = ipc_recv(sfd, p, len-1, NULL); if (r == -1) strerr_diefu1sys(111, "ipc_recv") ; char *s = p; while (s) { char *t = strsep(&s, "\n"); if (strcmp(t, "READY=1") == 0) { if (allwrite(nfd, "\n", 1) == -1) strerr_diefu1sys(111, "write to nfd") ; exit(0); } } } } int main (int argc, char const *const *argv) { int nfd, sfd; PROG = "sdnotifywrapper" ; if ((argc < 4) || !uint0_scan(argv[1], (unsigned int *)&nfd)) strerr_dieusage(100, USAGE) ; sfd = newsock(argv[2]); if (sfd == -1) strerr_diefu1sys(111, "create sock") ; if (monitor(nfd, sfd) == -1) strerr_diefu1sys(111, "monitor") ; if (setenv("NOTIFY_SOCKET", argv[2], 1) == -1) strerr_diefu1sys(111, "setenv") ; xexec(argv+3) ; }