1*4882a593SmuzhiyunFrom 7ee585cab1d5b68f804a5601a66ae87799c8a7c3 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Gerrit Pape <pape@smarden.org>
3*4882a593SmuzhiyunDate: Sun, 24 Feb 2008 10:54:26 +0000
4*4882a593SmuzhiyunSubject: [PATCH] supervise.c: ./supervise may be a symlink, if it's dangling, create link target
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun---
7*4882a593Smuzhiyun daemontools-0.76/src/supervise.c |   17 ++++++++++++++++-
8*4882a593Smuzhiyun 1 files changed, 16 insertions(+), 1 deletions(-)
9*4882a593Smuzhiyun
10*4882a593Smuzhiyundiff --git daemontools-0.76.orig/src/supervise.c daemontools-0.76/src/supervise.c
11*4882a593Smuzhiyunindex 2482ad2..f43cabf 100644
12*4882a593Smuzhiyun--- daemontools-0.76.orig/src/supervise.c
13*4882a593Smuzhiyun+++ daemontools-0.76/src/supervise.c
14*4882a593Smuzhiyun@@ -208,6 +208,8 @@ void doit(void)
15*4882a593Smuzhiyun int main(int argc,char **argv)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun   struct stat st;
18*4882a593Smuzhiyun+  int r;
19*4882a593Smuzhiyun+  char buf[256];
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun   dir = argv[1];
22*4882a593Smuzhiyun   if (!dir || argv[2])
23*4882a593Smuzhiyun@@ -232,7 +234,20 @@ int main(int argc,char **argv)
24*4882a593Smuzhiyun     if (errno != error_noent)
25*4882a593Smuzhiyun       strerr_die4sys(111,FATAL,"unable to stat ",dir,"/down: ");
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun-  mkdir("supervise",0700);
28*4882a593Smuzhiyun+  if (mkdir("supervise",0700) == -1) {
29*4882a593Smuzhiyun+    if ((r = readlink("supervise", buf, 256)) != -1) {
30*4882a593Smuzhiyun+      if (r == 256) {
31*4882a593Smuzhiyun+        errno = EOVERFLOW;
32*4882a593Smuzhiyun+        strerr_die1sys(111,"unable to readlink ./supervise: ");
33*4882a593Smuzhiyun+      }
34*4882a593Smuzhiyun+      buf[r] = 0;
35*4882a593Smuzhiyun+      mkdir(buf, 0700);
36*4882a593Smuzhiyun+    }
37*4882a593Smuzhiyun+    else {
38*4882a593Smuzhiyun+      if ((errno != ENOENT) && (errno != EINVAL))
39*4882a593Smuzhiyun+        strerr_die1sys(111, "unable to readlink ./supervise: ");
40*4882a593Smuzhiyun+    }
41*4882a593Smuzhiyun+  }
42*4882a593Smuzhiyun   fdlock = open_append("supervise/lock");
43*4882a593Smuzhiyun   if ((fdlock == -1) || (lock_exnb(fdlock) == -1))
44*4882a593Smuzhiyun     strerr_die4sys(111,FATAL,"unable to acquire ",dir,"/supervise/lock: ");
45*4882a593Smuzhiyun--
46*4882a593Smuzhiyun1.5.4.2
47*4882a593Smuzhiyun
48