Some updates, still nothing interesting here.
[inetdmx.git] / inetdmx.c
index e3c4d96..4029438 100644 (file)
--- 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} <start-timeout] [-S|--syslog] [-e|--stderr]\n\
+        [{-l|--lock} <filename>]\n\
         {-p|--port} <server-port> <start-server-command>\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, <start-server-command> needs quoting?");
        command=argv[optind];
 
+       lock_create();
        session_try();
        system_checked(command);