diff options
Diffstat (limited to 'libexec/ftpd')
-rw-r--r-- | libexec/ftpd/Makefile | 3 | ||||
-rw-r--r-- | libexec/ftpd/ftpd.8 | 19 | ||||
-rw-r--r-- | libexec/ftpd/ftpd.c | 30 | ||||
-rw-r--r-- | libexec/ftpd/logutmp.c | 121 |
4 files changed, 167 insertions, 6 deletions
diff --git a/libexec/ftpd/Makefile b/libexec/ftpd/Makefile index 79134750b6c..7543ec7a0e8 100644 --- a/libexec/ftpd/Makefile +++ b/libexec/ftpd/Makefile @@ -1,9 +1,10 @@ +# $OpenBSD: Makefile,v 1.5 1996/06/18 10:09:15 downsj Exp $ # $NetBSD: Makefile,v 1.13 1996/02/16 02:07:41 cgd Exp $ # @(#)Makefile 8.2 (Berkeley) 4/4/94 PROG= ftpd CFLAGS+=-DHASSETPROCTITLE -Dunix -SRCS= ftpd.c ftpcmd.c logwtmp.c popen.c +SRCS= ftpd.c ftpcmd.c logutmp.c logwtmp.c popen.c MAN= ftpd.8 CLEANFILES+=ftpcmd.c y.tab.h .PATH: ${.CURDIR}/../../usr.bin/ftp diff --git a/libexec/ftpd/ftpd.8 b/libexec/ftpd/ftpd.8 index 57e1185a5f1..307b461adb0 100644 --- a/libexec/ftpd/ftpd.8 +++ b/libexec/ftpd/ftpd.8 @@ -1,3 +1,4 @@ +.\" $OpenBSD: ftpd.8,v 1.3 1996/06/18 10:09:17 downsj Exp $ .\" $NetBSD: ftpd.8,v 1.8 1996/01/14 20:55:23 thorpej Exp $ .\" .\" Copyright (c) 1985, 1988, 1991, 1993 @@ -33,7 +34,7 @@ .\" .\" @(#)ftpd.8 8.2 (Berkeley) 4/19/94 .\" -.Dd April 19, 1994 +.Dd June 18, 1996 .Dt FTPD 8 .Os BSD 4.2 .Sh NAME @@ -42,9 +43,10 @@ Internet File Transfer Protocol server .Sh SYNOPSIS .Nm ftpd -.Op Fl dl +.Op Fl dlU .Op Fl T Ar maxtimeout .Op Fl t Ar timeout +.Op Fl u Ar mask .Sh DESCRIPTION .Nm Ftpd is the @@ -68,6 +70,13 @@ session is logged using syslog with a facility of LOG_FTP. If this option is specified twice, the retrieve (get), store (put), append, delete, make directory, remove directory and rename operations and their filename arguments are also logged. +.It Fl U +Each concurrent +.Xr ftp 1 +session is logged to the file +.Pa /var/run/utmp , +making them visible to commands such as +.Xr who 1 . .It Fl T A client may also request a different timeout period; the maximum period allowed may be set to @@ -80,6 +89,9 @@ The default limit is 2 hours. The inactivity timeout period is set to .Ar timeout seconds (the default is 15 minutes). +.It Fl u +The default umask is set to +.Ar mask . .El .Pp The file @@ -296,10 +308,13 @@ Welcome notice. Welcome notice after login. .It Pa /etc/nologin Displayed and access refused. +.It Pa /var/run/utmp +List of users on the system. .El .Sh SEE ALSO .Xr ftp 1 , .Xr skey 1 , +.Xr who 1 , .Xr getusershell 3 , .Xr syslogd 8 .Sh BUGS diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c index 67d310563f2..b9ee6649fd8 100644 --- a/libexec/ftpd/ftpd.c +++ b/libexec/ftpd/ftpd.c @@ -1,3 +1,4 @@ +/* $OpenBSD: ftpd.c,v 1.2 1996/06/18 10:09:20 downsj Exp $ */ /* $NetBSD: ftpd.c,v 1.15 1995/06/03 22:46:47 mycroft Exp $ */ /* @@ -82,6 +83,7 @@ static char rcsid[] = "$NetBSD: ftpd.c,v 1.15 1995/06/03 22:46:47 mycroft Exp $" #include <syslog.h> #include <time.h> #include <unistd.h> +#include <utmp.h> #include "pathnames.h" #include "extern.h" @@ -117,6 +119,7 @@ int type; int form; int stru; /* avoid C keyword */ int mode; +int doutmp = 0; /* update utmp file */ int usedefault = 1; /* for data transfers */ int pdata = -1; /* for passive mode */ sig_atomic_t transflag; @@ -132,6 +135,7 @@ char hostname[MAXHOSTNAMELEN]; char remotehost[MAXHOSTNAMELEN]; static char ttyline[20]; char *tty = ttyline; /* for klogin */ +static struct utmp utmp; /* for utmp */ #if defined(KERBEROS) int notickets = 1; @@ -235,9 +239,9 @@ main(argc, argv, envp) debug = 0; /* set this here so klogin can use it... */ - (void)sprintf(ttyline, "ftp%d", getpid()); + (void)snprintf(ttyline, sizeof(ttyline), "ftp%d", getpid()); - while ((ch = getopt(argc, argv, "dlt:T:u:v")) != EOF) { + while ((ch = getopt(argc, argv, "dlt:T:u:Uv")) != EOF) { switch (ch) { case 'd': debug = 1; @@ -271,6 +275,10 @@ main(argc, argv, envp) break; } + case 'U': + doutmp = 1; + break; + case 'v': debug = 1; break; @@ -521,8 +529,11 @@ end_login() { (void) seteuid((uid_t)0); - if (logged_in) + if (logged_in) { logwtmp(ttyline, "", ""); + if (doutmp) + logout(utmp.ut_line); + } pw = NULL; logged_in = 0; guest = 0; @@ -597,6 +608,17 @@ skip: /* open wtmp before chroot */ logwtmp(ttyline, pw->pw_name, remotehost); + + /* open utmp before chroot */ + if (doutmp) { + memset((void *)&utmp, 0, sizeof(utmp)); + (void)time(&utmp.ut_time); + (void)strncpy(utmp.ut_name, pw->pw_name, sizeof(utmp.ut_name)); + (void)strncpy(utmp.ut_host, remotehost, sizeof(utmp.ut_host)); + (void)strncpy(utmp.ut_line, ttyline, sizeof(utmp.ut_line)); + login(&utmp); + } + logged_in = 1; dochroot = checkuser(_PATH_FTPCHROOT, pw->pw_name); @@ -1394,6 +1416,8 @@ dologout(status) if (logged_in) { (void) seteuid((uid_t)0); logwtmp(ttyline, "", ""); + if (doutmp) + logout(utmp.ut_line); #if defined(KERBEROS) if (!notickets && krbtkfile_env) unlink(krbtkfile_env); diff --git a/libexec/ftpd/logutmp.c b/libexec/ftpd/logutmp.c new file mode 100644 index 00000000000..442efc93291 --- /dev/null +++ b/libexec/ftpd/logutmp.c @@ -0,0 +1,121 @@ +/* $OpenBSD: logutmp.c,v 1.1 1996/06/18 10:09:23 downsj Exp $ */ +/* + * Portions Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * Portions Copyright (c) 1996, Jason Downs. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/types.h> + +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <utmp.h> +#include <stdio.h> +#include <string.h> +#include <ttyent.h> + +typedef struct utmp UTMP; + +static int fd = -1; +static int topslot = -1; + +/* + * Special versions of login()/logout() which hold the utmp file open, + * for use with ftpd. + */ + +void +login(ut) + UTMP *ut; +{ + UTMP ubuf; + + /* + * First, loop through /etc/ttys, if needed, to initialize the + * top of the tty slots, since ftpd has no tty. + */ + if (topslot < 0) { + topslot = 0; + while (getttyent() != (struct ttyent *)NULL) + topslot++; + } + if ((topslot < 0) || ((fd < 0) + && (fd = open(_PATH_UTMP, O_RDWR|O_CREAT, 0644)) < 0)) + return; + + /* + * Now find a slot that's not in use... + */ + (void)lseek(fd, (off_t)(topslot * sizeof(UTMP)), L_SET); + + while (1) { + if (read(fd, &ubuf, sizeof(UTMP)) == sizeof(UTMP)) { + if (!ubuf.ut_name[0]) { + (void)lseek(fd, -(off_t)sizeof(UTMP), L_INCR); + break; + } + topslot++; + } else { + (void)lseek(fd, (off_t)(topslot * sizeof(UTMP)), L_SET); + break; + } + } + + (void)write(fd, ut, sizeof(UTMP)); +} + +int +logout(line) + register char *line; +{ + UTMP ut; + int rval; + + rval = 0; + if (fd < 0) + return(rval); + + (void)lseek(fd, 0, L_SET); + + while (read(fd, &ut, sizeof(UTMP)) == sizeof(UTMP)) { + if (!ut.ut_name[0] + || strncmp(ut.ut_line, line, UT_LINESIZE)) + continue; + bzero(ut.ut_name, UT_NAMESIZE); + bzero(ut.ut_host, UT_HOSTSIZE); + (void)time(&ut.ut_time); + (void)lseek(fd, -(off_t)sizeof(UTMP), L_INCR); + (void)write(fd, &ut, sizeof(UTMP)); + rval = 1; + } + return(rval); +} |