X-Git-Url: http://git.jankratochvil.net/?p=inetdmx.git;a=blobdiff_plain;f=inetdmx.c;h=006a4f2947e233280cd963ccffcea68daf96dfde;hp=ebab3bf2b0a34bff752249f9b2b3fb23214d8fd7;hb=be1836412ce05f1ed3902fa90d433a95e4ff8281;hpb=009beb6c39a09220131eed12a9d79a83e140e245 diff --git a/inetdmx.c b/inetdmx.c index ebab3bf..006a4f2 100644 --- a/inetdmx.c +++ b/inetdmx.c @@ -72,11 +72,14 @@ static int opt_syslog; static int opt_stderr; static const char *opt_lock; static int opt_ignore_spawned_command_output; -static const char *opt_command; +static char *opt_command; static void fatal(const char *fmt,...) G_GNUC_PRINTF(1,2) G_GNUC_NORETURN; +/* for atexit(3) function */ +static int verror_quiet; + static void verror(const char *fmt,va_list ap) G_GNUC_PRINTF(1,0); static void verror(const char *fmt,va_list ap) { @@ -84,6 +87,8 @@ int use_syslog=opt_syslog,use_stderr=opt_stderr; char *string; const char *const double_error="Error printing error message"; + if (verror_quiet) + return; if (!use_syslog && !use_stderr) use_stderr=1; if (-1==vasprintf(&string,fmt,ap)) { @@ -135,6 +140,15 @@ int rc; return string; } +static void *xmalloc(size_t size) +{ +void *r; + + if ((r=malloc(size))) + return r; + fatal("Error allocing %lu bytes",(unsigned long)size); +} + static void usage(void) { fprintf(stderr,"\ @@ -228,13 +242,25 @@ static void lock_touch(void) static void lock_close(void) { - if (lock_fd==-1) + if (lock_fd==-1 || !opt_lock) return; + /* It should not be needed but some stale locks were seen on: + * White Box Linux kernel-smp-2.6.9-5.0.5.EL + */ + if (flock(lock_fd,LOCK_UN|LOCK_NB)) + fatal("Error unlocking lock file \"%s\": %m",opt_lock); if (close(lock_fd)) fatal("Error closing lock file \"%s\": %m",opt_lock); lock_fd=-1; } +static void lock_close_atexit(void) +{ + /* Prevent some crashes of malloc(3) etc. */ + verror_quiet=1; + lock_close(); +} + static int connect_try(void) { int fdtcp; @@ -276,13 +302,6 @@ int fdi,fdo; pollfdi_name[0]=conn0_name; pollfdi_name[1]=conn1_name; for (;;) { - for (fdi=0;fdi=G_N_ELEMENTS(pollfdi)) { - lock_close(); - exit(EXIT_SUCCESS); - } if (0>=poll(pollfdi,G_N_ELEMENTS(pollfdi),-1)) fatal("poll(%s socket,%s socket): %m",pollfdi_name[0],pollfdi_name[1]); for (fdi=0;fdi=argc) fatal(" is a required argument"); - if (optind+1 may need quoting"); - opt_command=argv[optind]; + opt_command_len=0; + for (i=optind;iopt_command) + *s++=' '; + memcpy(s,argv[i],argv_i_len); + s+=argv_i_len; + } + *s++=0; + assert(s==opt_command+opt_command_len); if (!opt_syslog && !opt_stderr) opt_stderr=1;