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 */
{
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\
{"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 },
};
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;
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))
fatal("Too many arguments, <start-server-command> needs quoting?");
command=argv[optind];
+ lock_create();
session_try();
system_checked(command);