summaryrefslogtreecommitdiff
path: root/src/libs6/s6_svc_writectl.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2017-11-10 12:53:37 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2017-11-10 12:53:37 +0000
commit321f8dd75df79a714b17a0f2cd16644ccc4febf9 (patch)
tree0763334456c8a5b2c2338634773f3b41082c102c /src/libs6/s6_svc_writectl.c
parent5aa544ac273ea5253682b63f9640f9da08073ef3 (diff)
downloads6-321f8dd75df79a714b17a0f2cd16644ccc4febf9.tar.xz
More accurate exit code and clearer error messages for s6-svc and s6-svscanctl
Diffstat (limited to 'src/libs6/s6_svc_writectl.c')
-rw-r--r--src/libs6/s6_svc_writectl.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/libs6/s6_svc_writectl.c b/src/libs6/s6_svc_writectl.c
index b4d8e15..c522923 100644
--- a/src/libs6/s6_svc_writectl.c
+++ b/src/libs6/s6_svc_writectl.c
@@ -1,16 +1,35 @@
/* ISC license. */
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
#include <string.h>
+#include <skalibs/djbunix.h>
+#include <skalibs/unix-transactional.h>
#include <s6/s6-supervise.h>
int s6_svc_writectl (char const *service, char const *subdir, char const *s, size_t len)
{
size_t svlen = strlen(service) ;
size_t sublen = strlen(subdir) ;
+ int r ;
char fn[svlen + sublen + 10] ;
memcpy(fn, service, svlen) ;
fn[svlen] = '/' ;
memcpy(fn + svlen + 1, subdir, sublen) ;
memcpy(fn + svlen + 1 + sublen, "/control", 9) ;
- return s6_svc_write(fn, s, len) ;
+ r = s6_svc_write(fn, s, len) ;
+ if (r != -2) return r ;
+
+ /* Now we need to investigate what went wrong... */
+ {
+ int fd, fdsub ;
+ fd = open(service, O_RDONLY | O_DIRECTORY) ;
+ if (fd < 0) return -1 ;
+ fdsub = open2_at(fd, subdir, O_RDONLY | O_DIRECTORY) ;
+ fd_close(fd) ;
+ if (fdsub < 0) return (errno == ENOENT) ? 0 : -2 ;
+ fd_close(fdsub) ;
+ return -2 ;
+ }
}