Hi Steven, On Fri, Aug 05, 2011 at 12:29:31PM -0700, Steven Allen wrote: > Devs, > > Here is a simple patch to add support for creating a pid-file when > backgrounding. This is obviously not a high priority feature but it > makes it easier to track openconnect sessions after they have been > backgrounded. While I do not believe that my patch introduces any > bugs, my experience with C is very limited. > > Steven Allen > > --- > main.c | 17 +++++++++++++++++ > openconnect.8 | 9 +++++++++ > 2 files changed, 26 insertions(+), 0 deletions(-) > > diff --git a/main.c b/main.c > index bee6502..0fef578 100644 > --- a/main.c > +++ b/main.c > @@ -81,6 +81,7 @@ enum { > OPT_NO_HTTP_KEEPALIVE, > OPT_NO_PASSWD, > OPT_NO_PROXY, > + OPT_PIDFILE, > OPT_PASSWORD_ON_STDIN, > OPT_PRINTCOOKIE, > OPT_RECONNECT_TIMEOUT, > @@ -91,6 +92,7 @@ enum { > > static struct option long_options[] = { > {"background", 0, 0, 'b'}, > + {"pid-file", 1, 0, OPT_PIDFILE}, > {"certificate", 1, 0, 'c'}, > {"sslkey", 1, 0, 'k'}, > {"cookie", 1, 0, 'C'}, > @@ -143,6 +145,7 @@ void usage(void) > printf("Usage: openconnect [options] <server>\n"); > printf("Open client for Cisco AnyConnect VPN, version %s\n\n", openconnect_version); > printf(" -b, --background Continue in background after startup\n"); > + printf(" --pid-file=PIDFILE Write the daemons pid to this file\n"); > printf(" -c, --certificate=CERT Use SSL client certificate CERT\n"); > printf(" -k, --sslkey=KEY Use SSL private key file KEY\n"); > printf(" -K, --key-type=TYPE Private key type (PKCS#12 / TPM / PEM)\n"); > @@ -230,6 +233,7 @@ int main(int argc, char **argv) > int autoproxy = 0; > uid_t uid = getuid(); > int opt; > + char *pidfile = NULL; > > openconnect_init_openssl(); > > @@ -268,6 +272,9 @@ int main(int argc, char **argv) > case OPT_CAFILE: > vpninfo->cafile = optarg; > break; > + case OPT_PIDFILE: > + pidfile = optarg; > + break; > case OPT_SERVERCERT: > vpninfo->servercert = optarg; > break; > @@ -571,6 +578,16 @@ int main(int argc, char **argv) > if (background) { > int pid; > if ((pid = fork())) { > + if (pidfile != NULL) { > + FILE *fp; > + fp = fopen(pidfile, "w"); > + if (pidfile != NULL) { s/pidfile/fp/ ? You already checked it three lines above. > + fprintf(fp, "%d\n", pid); > + fclose(fp); > + } else { > + fprintf(stderr, "Failed to open '%s' for writing\n", pidfile); I would exit fail here. If the user or a startup script expect a pid file to be created, then failing out is appropriate. > + } > + } > vpn_progress(vpninfo, PRG_INFO, > "Continuing in background; pid %d\n", > pid); > diff --git a/openconnect.8 b/openconnect.8 > index 352fa89..ab71a64 100644 > --- a/openconnect.8 > +++ b/openconnect.8 > @@ -7,6 +7,10 @@ openconnect \- Connect to Cisco AnyConnect VPN > .B -b,--background > ] > [ > +.B --pid-file > +.I PIDFILE > +] > +[ > .B -c,--certificate > .I CERT > ] > @@ -188,6 +192,11 @@ exchanged, which allows data transport over UDP to occur. > .B -b,--background > Continue in background after startup > .TP > +.B --pid-file=PIDFILE > +Save the pid to > +.I PIDFILE > +when backgrounding > +.TP > .B -c,--certificate=CERT > Use SSL client certificate > .I CERT > -- > 1.7.6 hth, Jason.