summaryrefslogtreecommitdiff
path: root/libexec/ftpd
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/ftpd')
-rw-r--r--libexec/ftpd/Makefile3
-rw-r--r--libexec/ftpd/ftpd.819
-rw-r--r--libexec/ftpd/ftpd.c30
-rw-r--r--libexec/ftpd/logutmp.c121
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);
+}