summaryrefslogtreecommitdiffstats
path: root/libexec/tftpd
diff options
context:
space:
mode:
authormdodd <mdodd@FreeBSD.org>2004-05-24 22:56:15 +0000
committermdodd <mdodd@FreeBSD.org>2004-05-24 22:56:15 +0000
commitdbabd85d3efcd6c357cd7c912cc9a6d5929f1d4c (patch)
tree0c0a2085148b23e83645fc973c41ad5b84720e0a /libexec/tftpd
parent322e28b5538399dca2d1063201a6d19520eeaffc (diff)
downloadFreeBSD-src-dbabd85d3efcd6c357cd7c912cc9a6d5929f1d4c.zip
FreeBSD-src-dbabd85d3efcd6c357cd7c912cc9a6d5929f1d4c.tar.gz
Add two new flags: -w, which allows new files to be created,
and -U, which allows the umask to be set. Obtained from: Patton Electronics, Co.
Diffstat (limited to 'libexec/tftpd')
-rw-r--r--libexec/tftpd/tftpd.811
-rw-r--r--libexec/tftpd/tftpd.c26
2 files changed, 32 insertions, 5 deletions
diff --git a/libexec/tftpd/tftpd.8 b/libexec/tftpd/tftpd.8
index 953dff7..3d746ac 100644
--- a/libexec/tftpd/tftpd.8
+++ b/libexec/tftpd/tftpd.8
@@ -40,9 +40,10 @@
.Nd Internet Trivial File Transfer Protocol server
.Sh SYNOPSIS
.Nm /usr/libexec/tftpd
-.Op Fl cCln
+.Op Fl cClnw
.Op Fl s Ar directory
.Op Fl u Ar user
+.Op Fl U Ar umask
.Op Ar directory ...
.Sh DESCRIPTION
The
@@ -163,6 +164,14 @@ when the
.Fl s
option is used.
The user must be specified by name, not a numeric UID.
+.It Fl U Ar umask
+Set the
+.Ar umask
+for newly created files. The default is 022 (S_IWGRP|S_IWOTH).
+.It Fl w
+Allow writes requests to create new files. By default
+.Nm
+requires that the file specified in a write request exist.
.El
.Sh SEE ALSO
.Xr tftp 1 ,
diff --git a/libexec/tftpd/tftpd.c b/libexec/tftpd/tftpd.c
index 6435e8b..4267ebd 100644
--- a/libexec/tftpd/tftpd.c
+++ b/libexec/tftpd/tftpd.c
@@ -109,6 +109,8 @@ static struct dirlist {
static int suppress_naks;
static int logging;
static int ipchroot;
+static int create_new = 0;
+static mode_t mask = S_IWGRP|S_IWOTH;
static const char *errtomsg(int);
static void nak(int);
@@ -130,7 +132,7 @@ main(int argc, char *argv[])
const char *chuser = "nobody";
openlog("tftpd", LOG_PID | LOG_NDELAY, LOG_FTP);
- while ((ch = getopt(argc, argv, "cClns:u:")) != -1) {
+ while ((ch = getopt(argc, argv, "cClns:u:Uw")) != -1) {
switch (ch) {
case 'c':
ipchroot = 1;
@@ -150,6 +152,12 @@ main(int argc, char *argv[])
case 'u':
chuser = optarg;
break;
+ case 'U':
+ mask = strtol(optarg, NULL, 0);
+ break;
+ case 'w':
+ create_new = 1;
+ break;
default:
syslog(LOG_WARNING, "ignoring unknown option -%c", ch);
}
@@ -176,6 +184,8 @@ main(int argc, char *argv[])
exit(1);
}
+ umask(mask);
+
on = 1;
if (ioctl(0, FIONBIO, &on) < 0) {
syslog(LOG_ERR, "ioctl(FIONBIO): %m");
@@ -553,9 +563,10 @@ validate_access(char **filep, int mode)
err = EACCESS;
}
}
- if (dirp->name == NULL)
+ if (dirp->name != NULL)
+ *filep = filename = pathname;
+ else if (mode == RRQ)
return (err);
- *filep = filename = pathname;
}
if (options[OPT_TSIZE].o_request) {
if (mode == RRQ)
@@ -565,7 +576,14 @@ validate_access(char **filep, int mode)
options[OPT_TSIZE].o_reply =
atoi(options[OPT_TSIZE].o_request);
}
- fd = open(filename, mode == RRQ ? O_RDONLY : O_WRONLY|O_TRUNC);
+ if (mode == RRQ)
+ fd = open(filename, O_RDONLY);
+ else {
+ if (create_new)
+ fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0666);
+ else
+ fd = open(filename, O_WRONLY|O_TRUNC);
+ }
if (fd < 0)
return (errno + 100);
file = fdopen(fd, (mode == RRQ)? "r":"w");
OpenPOWER on IntegriCloud