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