summaryrefslogtreecommitdiffstats
path: root/libexec/fingerd/fingerd.c
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/fingerd/fingerd.c')
-rw-r--r--libexec/fingerd/fingerd.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/libexec/fingerd/fingerd.c b/libexec/fingerd/fingerd.c
index 7d2a754..0225d94 100644
--- a/libexec/fingerd/fingerd.c
+++ b/libexec/fingerd/fingerd.c
@@ -72,17 +72,23 @@ main(int argc, char *argv[])
char *lp;
struct sockaddr_storage ss;
socklen_t sval;
- int p[2], logging, pflag, secure;
+ int p[2], debug, kflag, logging, pflag, secure;
#define ENTRIES 50
char **ap, *av[ENTRIES + 1], **comp, line[1024], *prog;
char rhost[MAXHOSTNAMELEN];
prog = _PATH_FINGER;
- logging = pflag = secure = 0;
+ debug = logging = kflag = pflag = secure = 0;
openlog("fingerd", LOG_PID | LOG_CONS, LOG_DAEMON);
opterr = 0;
- while ((ch = getopt(argc, argv, "lp:s")) != -1)
+ while ((ch = getopt(argc, argv, "dklp:s")) != -1)
switch (ch) {
+ case 'd':
+ debug = 1;
+ break;
+ case 'k':
+ kflag = 1;
+ break;
case 'l':
logging = 1;
break;
@@ -101,7 +107,7 @@ main(int argc, char *argv[])
/*
* Enable server-side Transaction TCP.
*/
- {
+ if (!debug) {
int one = 1;
if (setsockopt(STDOUT_FILENO, IPPROTO_TCP, TCP_NOPUSH, &one,
sizeof one) < 0) {
@@ -112,7 +118,7 @@ main(int argc, char *argv[])
if (!fgets(line, sizeof(line), stdin))
exit(1);
- if (logging || pflag) {
+ if (!debug && (logging || pflag)) {
sval = sizeof(ss);
if (getpeername(0, (struct sockaddr *)&ss, &sval) < 0)
logerr("getpeername: %s", strerror(errno));
@@ -143,12 +149,14 @@ main(int argc, char *argv[])
syslog(LOG_NOTICE, "query from %s: `%s'", rhost, t);
}
- comp = &av[1];
- av[2] = "--";
- for (lp = line, ap = &av[3];;) {
+ comp = &av[2];
+ av[3] = "--";
+ if (kflag)
+ *comp-- = "-k";
+ for (lp = line, ap = &av[4];;) {
*ap = strtok(lp, " \t\r\n");
if (!*ap) {
- if (secure && ap == &av[3]) {
+ if (secure && ap == &av[4]) {
puts("must provide username\r\n");
exit(1);
}
@@ -161,8 +169,7 @@ main(int argc, char *argv[])
/* RFC742: "/[Ww]" == "-l" */
if ((*ap)[0] == '/' && ((*ap)[1] == 'W' || (*ap)[1] == 'w')) {
- av[1] = "-l";
- comp = &av[0];
+ *comp-- = "-l";
}
else if (++ap == av + ENTRIES) {
*ap = NULL;
@@ -178,6 +185,13 @@ main(int argc, char *argv[])
if (pipe(p) < 0)
logerr("pipe: %s", strerror(errno));
+ if (debug) {
+ fprintf(stderr, "%s", prog);
+ for (ap = comp; *ap != NULL; ++ap)
+ fprintf(stderr, " %s", *ap);
+ fprintf(stderr, "\n");
+ }
+
switch(vfork()) {
case 0:
(void)close(p[0]);
OpenPOWER on IntegriCloud