Browse Source

Add pidfile support to ggated(8)

The tests will manipulate the system daemon today, which can cause undesired
service interruption when the tests are run.

This change allows the geom_gate tests to be run with an arbitrary ggated(8)
daemon / geom_gate(4) device pairing.

Other changes:
- Sort #includes
- Use a more common idiom for parsing options with getopt(3)

Differential Revision: https://reviews.freebsd.org/D4836
MFC after: 2 weeks
Reviewed by: bjk (manpages), pjd (maintainer timeout)
Sponsored by: EMC / Isilon Storage Division
tags/ggatessh-v1.0.0
ngie 8 years ago
parent
commit
9f45dcac92
3 changed files with 52 additions and 25 deletions
  1. +1
    -1
      ggated/Makefile
  2. +13
    -1
      ggated/ggated.8
  3. +38
    -23
      ggated/ggated.c

+ 1
- 1
ggated/Makefile View File

@@ -6,7 +6,7 @@ PROG= ggated
MAN= ggated.8
SRCS= ggated.c ggate.c

LIBADD= pthread
LIBADD= pthread util

CFLAGS+= -I${.CURDIR}/../shared



+ 13
- 1
ggated/ggated.8 View File

@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd July 14, 2015
.Dd January 27, 2016
.Dt GGATED 8
.Os
.Sh NAME
@@ -37,6 +37,7 @@
.Op Fl v
.Op Fl a Ar address
.Op Fl p Ar port
.Op Fl F Ar pidfile
.Op Fl R Ar rcvbuf
.Op Fl S Ar sndbuf
.Op Ar "exports file"
@@ -67,6 +68,10 @@ Port on which
.Nm
listens for connections.
Default is 3080.
.It Fl F Ar pidfile
PID file that
.Nm
uses.
.It Fl R Ar rcvbuf
Size of receive buffer to use.
Default is 131072 (128kB).
@@ -86,6 +91,13 @@ The format of an exports file is as follows:
1.2.3.0/24 RW /tmp/test.img
hostname WO /tmp/image
.Ed
.Sh FILES
.Bl -tag -width ".Pa /var/run/ggated.pid" -compact
.It Pa /var/run/ggated.pid
The default location of the
.Nm
PID file.
.El
.Sh EXIT STATUS
Exit status is 0 on success, or 1 if the command fails.
To get details about the failure,


+ 38
- 23
ggated/ggated.c View File

@@ -26,32 +26,34 @@
* $FreeBSD$
*/

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/param.h>
#include <sys/queue.h>
#include <sys/bio.h>
#include <sys/disk.h>
#include <sys/endian.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/disk.h>
#include <sys/bio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <signal.h>
#include <assert.h>
#include <err.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <libgen.h>
#include <syslog.h>
#include <libutil.h>
#include <paths.h>
#include <pthread.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>

#include "ggate.h"

@@ -110,8 +112,8 @@ static void
usage(void)
{

fprintf(stderr, "usage: %s [-nv] [-a address] [-p port] [-R rcvbuf] "
"[-S sndbuf] [exports file]\n", getprogname());
fprintf(stderr, "usage: %s [-nv] [-a address] [-F pidfile] [-p port] "
"[-R rcvbuf] [-S sndbuf] [exports file]\n", getprogname());
exit(EXIT_FAILURE);
}

@@ -946,20 +948,18 @@ huphandler(int sig __unused)
int
main(int argc, char *argv[])
{
const char *ggated_pidfile = _PATH_VARRUN "/ggated.pid";
struct pidfh *pfh;
struct sockaddr_in serv;
struct sockaddr from;
socklen_t fromlen;
int sfd, tmpsfd;
pid_t otherpid;
int ch, sfd, tmpsfd;
unsigned port;

bindaddr = htonl(INADDR_ANY);
port = G_GATE_PORT;
for (;;) {
int ch;

ch = getopt(argc, argv, "a:hnp:R:S:v");
if (ch == -1)
break;
while ((ch = getopt(argc, argv, "a:hnp:F:R:S:v")) != -1) {
switch (ch) {
case 'a':
bindaddr = g_gate_str2ip(optarg);
@@ -968,6 +968,9 @@ main(int argc, char *argv[])
"Invalid IP/host name to bind to.");
}
break;
case 'F':
ggated_pidfile = optarg;
break;
case 'n':
nagle = 0;
break;
@@ -1004,12 +1007,23 @@ main(int argc, char *argv[])
exports_file = argv[0];
exports_get();

pfh = pidfile_open(ggated_pidfile, 0600, &otherpid);
if (pfh == NULL) {
if (errno == EEXIST) {
errx(EXIT_FAILURE, "Daemon already running, pid: %jd.",
(intmax_t)otherpid);
}
err(EXIT_FAILURE, "Cannot open/create pidfile");
}

if (!g_gate_verbose) {
/* Run in daemon mode. */
if (daemon(0, 0) == -1)
g_gate_xlog("Cannot daemonize: %s", strerror(errno));
}

pidfile_write(pfh);

signal(SIGCHLD, SIG_IGN);

sfd = socket(AF_INET, SOCK_STREAM, 0);
@@ -1046,5 +1060,6 @@ main(int argc, char *argv[])
close(tmpsfd);
}
close(sfd);
pidfile_remove(pfh);
exit(EXIT_SUCCESS);
}

Loading…
Cancel
Save