From eff778770687829afbfeddca4b1e81724699997a Mon Sep 17 00:00:00 2001 From: "Matthew N. Dodd" Date: Mon, 24 May 2004 22:56:15 +0000 Subject: [PATCH] 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. --- libexec/tftpd/tftpd.8 | 11 ++++++++++- libexec/tftpd/tftpd.c | 26 ++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/libexec/tftpd/tftpd.8 b/libexec/tftpd/tftpd.8 index 953dff7569f2..3d746ac3c8e6 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 6435e8b276f3..4267ebdfbbf7 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");