From: short <> Date: Mon, 8 Aug 2005 23:49:12 +0000 (+0000) Subject: Some updates, still nothing interesting here. X-Git-Url: http://git.jankratochvil.net/?p=inetdmx.git;a=commitdiff_plain;h=f692db7f13fda5aefb49fcde0caa34f96118e44a Some updates, still nothing interesting here. --- diff --git a/inetdmx.c b/inetdmx.c index e3c4d96..4029438 100644 --- a/inetdmx.c +++ b/inetdmx.c @@ -26,6 +26,7 @@ static long opt_start_timeout=60; static int opt_port; static int opt_syslog; static int opt_stderr; +static const char *opt_lock; /* /usr/include/glib-2.0/glib/gmacros.h */ @@ -89,6 +90,7 @@ static void usage(void) { fprintf(stderr,"\ Syntax: %s [{-T|--start-timeout} ]\n\ {-p|--port} \n\ \n\ Error messages out to stderr by default, -S|--syslog omits stderr output,\n\ @@ -101,6 +103,7 @@ static const struct option longopts[]={ {"start-timeout",1,0,'T'}, {"syslog" ,0,0,'S'}, {"stderr" ,0,0,'e'}, + {"lock" ,1,0,'l'}, {"port" ,1,0,'p'}, {NULL ,0,0,0 }, }; @@ -232,6 +235,40 @@ int rc; command); } +static int lock_fd=-1; + +static void lock_create(void) +{ +int retries=3; + + if (!opt_lock) + return; +retry: + if (-1==(lock_fd=open(opt_lock,O_CREAT|O_RDWR,0600))) + fatal("Error creating lock file \"%s\": %m",opt_lock); + if (flock(lock_fd,LOCK_EX)) + fatal("Error locking lock file \"%s\": %m",opt_lock); + if (!access(opt_lock,O_RD|O_WR)) { + if (retries--<=0) + fatal("Racing for the lock file \"%s\", giving up"); + if (close(lock_fd)) + fatal("Error closing lock file \"%s\": %m",opt_lock); + lock_fd=-1; + goto retry; + } + if (utime(opt_lock,NULL)) + fatal("Error updating lock file \"%s\" timestamp: %m",opt_lock); +} + +static void lock_close(void) +{ + if (lock_fd==-1) + return; + if (close(lock_fd)) + fatal("Error closing lock file \"%s\": %m",opt_lock); + lock_fd=-1; +} + int main(int argc,char **argv) { int retry; @@ -255,6 +292,17 @@ char *endptr; opt_start_timeout=l; break; + case 'S': /* -S|--syslog */ + opt_syslog=1; + break; + + case 'e': /* -e|--stderr */ + opt_stderr=1; + break; + + case 'l': /* -l|--lock */ + opt_lock=optarg; + case 'p': /* -p|--port */ l=strtol(optarg,&endptr,0); if (l<=0 || l>=0x10000 || (endptr && *endptr)) @@ -277,6 +325,7 @@ char *endptr; fatal("Too many arguments, needs quoting?"); command=argv[optind]; + lock_create(); session_try(); system_checked(command);