Skip to content

Commit

Permalink
make it possible to use faithd via inet6d(8)/inetd(8).
Browse files Browse the repository at this point in the history
inet6d/inetd must perform sysctl(IPV6_FAITH).
  • Loading branch information
itojun committed Jul 1, 2000
1 parent a6fb0e0 commit a758b71
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 16 deletions.
108 changes: 94 additions & 14 deletions kame/kame/faithd/faithd.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $KAME: faithd.c,v 1.19 2000/06/29 01:17:29 itojun Exp $ */
/* $KAME: faithd.c,v 1.20 2000/07/01 11:40:45 itojun Exp $ */

/*
* Copyright (C) 1997 and 1998 WIDE Project.
Expand Down Expand Up @@ -101,8 +101,11 @@ static int sockfd = 0;
#endif
int dflag = 0;
static int pflag = 0;
static int inetd = 0;

int main __P((int, char **));
static int inetd_main __P((int, char **));
static int daemon_main __P((int, char **));
static void play_service __P((int));
static void play_child __P((int, struct sockaddr *));
static int faith_prefix __P((struct sockaddr *));
Expand All @@ -122,15 +125,8 @@ static void update_myaddrs __P((void));
static void usage __P((void));

int
main(int argc, char *argv[])
main(int argc, char **argv)
{
struct addrinfo hints, *res;
int s_wld, error, i, serverargc, on = 1;
int family = AF_INET6;
int c;
#ifdef FAITH_NS
char *ns;
#endif /* FAITH_NS */

/*
* Initializing stuff
Expand All @@ -142,6 +138,88 @@ main(int argc, char *argv[])
else
faithdname = argv[0];

if (strcmp(faithdname, "faithd") != 0) {
inetd = 1;
return inetd_main(argc, argv);
} else
return daemon_main(argc, argv);
}

static int
inetd_main(int argc, char **argv)
{
char path[MAXPATHLEN];
struct sockaddr_storage me;
struct sockaddr_storage from;
int melen, fromlen;
int i;
int error;
const int on = 1;
char sbuf[NI_MAXSERV], snum[NI_MAXSERV];

if (strrchr(argv[0], '/') == NULL)
snprintf(path, sizeof(path), "%s/%s", DEFAULT_DIR, argv[0]);
else
snprintf(path, sizeof(path), "%s", argv[0]);

#ifdef USE_ROUTE
grab_myaddrs();

sockfd = socket(PF_ROUTE, SOCK_RAW, PF_UNSPEC);
if (sockfd < 0) {
exit_error("socket(PF_ROUTE): %s", ERRSTR);
/*NOTREACHED*/
}
#endif

melen = sizeof(me);
if (getsockname(STDIN_FILENO, (struct sockaddr *)&me, &melen) < 0)
exit_error("getsockname");
fromlen = sizeof(from);
if (getpeername(STDIN_FILENO, (struct sockaddr *)&from, &fromlen) < 0)
exit_error("getpeername");
if (getnameinfo((struct sockaddr *)&me, melen, NULL, 0,
sbuf, sizeof(sbuf), NI_NUMERICHOST) == 0)
service = sbuf;
else
service = DEFAULT_PORT_NAME;
if (getnameinfo((struct sockaddr *)&me, melen, NULL, 0,
snum, sizeof(snum), NI_NUMERICHOST) != 0)
snprintf(snum, sizeof(snum), "?");

snprintf(logname, sizeof(logname), "faithd %s", snum);
snprintf(procname, sizeof(procname), "accepting port %s", snum);
openlog(logname, LOG_PID | LOG_NOWAIT, LOG_DAEMON);

if (argc >= MAXARGV)
exit_failure("too many augments");
serverarg[0] = serverpath = path;
for (i = 1; i < argc; i++)
serverarg[i] = argv[i];
serverarg[i] = NULL;

error = setsockopt(STDIN_FILENO, SOL_SOCKET, SO_OOBINLINE, &on,
sizeof(on));
if (error < 0)
exit_error("setsockopt(SO_OOBINLINE): %s", ERRSTR);

syslog(LOG_INFO, "%s %d", __FILE__, __LINE__);
play_child(STDIN_FILENO, (struct sockaddr *)&from);
exit_failure("should not reach here");
return 0; /*dummy!*/
}

static int
daemon_main(int argc, char **argv)
{
struct addrinfo hints, *res;
int s_wld, error, i, serverargc, on = 1;
int family = AF_INET6;
int c;
#ifdef FAITH_NS
char *ns;
#endif /* FAITH_NS */

while ((c = getopt(argc, argv, "dp46")) != -1) {
switch (c) {
case 'd':
Expand Down Expand Up @@ -197,7 +275,7 @@ main(int argc, char *argv[])
break;
default:
serverargc = argc - NUMARG;
if (serverargc > MAXARGV)
if (serverargc >= MAXARGV)
exit_error("too many augments");

serverpath = malloc(strlen(argv[NUMPRG]) + 1);
Expand Down Expand Up @@ -387,10 +465,12 @@ play_child(int s_src, struct sockaddr *srcaddr)
* Local service
*/
syslog(LOG_INFO, "executing local %s", serverpath);
dup2(s_src, 0);
close(s_src);
dup2(0, 1);
dup2(0, 2);
if (!inetd) {
dup2(s_src, 0);
close(s_src);
dup2(0, 1);
dup2(0, 2);
}
execv(serverpath, serverarg);
syslog(LOG_ERR, "execv %s: %s", serverpath, ERRSTR);
_exit(EXIT_FAILURE);
Expand Down
5 changes: 3 additions & 2 deletions kame/kame/faithd/faithd.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $KAME: faithd.h,v 1.2 2000/05/31 03:06:07 itojun Exp $ */
/* $KAME: faithd.h,v 1.3 2000/07/01 11:40:45 itojun Exp $ */

/*
* Copyright (C) 1997 and 1998 WIDE Project.
Expand Down Expand Up @@ -43,8 +43,9 @@ extern void exit_success __P((const char *fmt, ...));
extern void exit_failure __P((const char *fmt, ...));

#define DEFAULT_PORT_NAME "telnet"
#define DEFAULT_PATH "/usr/local/v6/libexec/telnetd"
#define DEFAULT_DIR "/usr/local/v6/libexec"
#define DEFAULT_NAME "telnetd"
#define DEFAULT_PATH (DEFAULT_DIR "/" DEFAULT_NAME)

#define FTP_PORT 21
#define RLOGIN_PORT 513
Expand Down

0 comments on commit a758b71

Please sign in to comment.