diff options
author | 2011-04-10 15:47:28 +0000 | |
---|---|---|
committer | 2011-04-10 15:47:28 +0000 | |
commit | 4e245ff644da134beb38807899c688dfb43becf0 (patch) | |
tree | 470df7aac1d59fc9299a84cc3aaf1e83ead21b14 | |
parent | I am only now noticing the number of sets have not been adjusted after the (diff) | |
download | wireguard-openbsd-4e245ff644da134beb38807899c688dfb43becf0.tar.xz wireguard-openbsd-4e245ff644da134beb38807899c688dfb43becf0.zip |
Apply some tough type-love and give rdist a chance to handle files
larger than 2GB. Diff from Stephan R. Gerber via PR#6586, tweaks
by me.
ok deraadt@
-rw-r--r-- | usr.bin/rdist/child.c | 8 | ||||
-rw-r--r-- | usr.bin/rdist/client.c | 24 | ||||
-rw-r--r-- | usr.bin/rdist/common.c | 14 | ||||
-rw-r--r-- | usr.bin/rdist/config-data.h | 6 | ||||
-rw-r--r-- | usr.bin/rdist/defs.h | 6 | ||||
-rw-r--r-- | usr.bin/rdist/docmd.c | 4 | ||||
-rw-r--r-- | usr.bin/rdist/rdist.c | 21 | ||||
-rw-r--r-- | usr.bin/rdistd/filesys.c | 10 | ||||
-rw-r--r-- | usr.bin/rdistd/server.c | 53 |
9 files changed, 78 insertions, 68 deletions
diff --git a/usr.bin/rdist/child.c b/usr.bin/rdist/child.c index 331d92b9eae..7de8236a779 100644 --- a/usr.bin/rdist/child.c +++ b/usr.bin/rdist/child.c @@ -1,4 +1,4 @@ -/* $OpenBSD: child.c,v 1.14 2009/10/27 23:59:42 deraadt Exp $ */ +/* $OpenBSD: child.c,v 1.15 2011/04/10 15:47:28 krw Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. @@ -177,7 +177,7 @@ static void readchild(CHILD *child) { char rbuf[BUFSIZ]; - int amt; + ssize_t amt; debugmsg(DM_CALL, "[readchild(%s, %d, %d) start]", child->c_name, child->c_pid, child->c_readfd); @@ -196,7 +196,7 @@ readchild(CHILD *child) */ while ((amt = read(child->c_readfd, rbuf, sizeof(rbuf))) > 0) { /* XXX remove these debug calls */ - debugmsg(DM_MISC, "[readchild(%s, %d, %d) got %d bytes]", + debugmsg(DM_MISC, "[readchild(%s, %d, %d) got %lld bytes]", child->c_name, child->c_pid, child->c_readfd, amt); (void) xwrite(fileno(stdout), rbuf, amt); @@ -205,7 +205,7 @@ readchild(CHILD *child) child->c_name, child->c_pid, child->c_readfd); } - debugmsg(DM_MISC, "readchild(%s, %d, %d) done: amt = %d errno = %d\n", + debugmsg(DM_MISC, "readchild(%s, %d, %d) done: amt = %lld errno = %d\n", child->c_name, child->c_pid, child->c_readfd, amt, errno); /* diff --git a/usr.bin/rdist/client.c b/usr.bin/rdist/client.c index 930bb6a0508..82844eaa8c1 100644 --- a/usr.bin/rdist/client.c +++ b/usr.bin/rdist/client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: client.c,v 1.22 2009/10/27 23:59:42 deraadt Exp $ */ +/* $OpenBSD: client.c,v 1.23 2011/04/10 15:47:28 krw Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. @@ -399,8 +399,8 @@ sendfile(char *rname, opt_t opts, struct stat *stb, char *user, */ ENCODE(ername, rname); - (void) sendcmd(C_RECVREG, "%o %04o %ld %ld %ld %s %s %s", - opts, stb->st_mode & 07777, (long) stb->st_size, + (void) sendcmd(C_RECVREG, "%o %04o %lld %ld %ld %s %s %s", + opts, stb->st_mode & 07777, (long long) stb->st_size, stb->st_mtime, stb->st_atime, user, group, ername); if (response() < 0) { @@ -409,8 +409,8 @@ sendfile(char *rname, opt_t opts, struct stat *stb, char *user, } - debugmsg(DM_MISC, "Send file '%s' %ld bytes\n", rname, - (long) stb->st_size); + debugmsg(DM_MISC, "Send file '%s' %lld bytes\n", rname, + (long long) stb->st_size); /* * Set remote time out alarm handler. @@ -666,8 +666,8 @@ sendlink(char *rname, opt_t opts, struct stat *stb, char *user, * Gather and send basic link info */ ENCODE(ername, rname); - (void) sendcmd(C_RECVSYMLINK, "%o %04o %ld %ld %ld %s %s %s", - opts, stb->st_mode & 07777, (long) stb->st_size, + (void) sendcmd(C_RECVSYMLINK, "%o %04o %lld %ld %ld %s %s %s", + opts, stb->st_mode & 07777, (long long) stb->st_size, stb->st_mtime, stb->st_atime, user, group, ername); if (response() < 0) @@ -869,7 +869,7 @@ update(char *rname, opt_t opts, struct stat *statp) /* * Parse size */ - size = (off_t) strtol(cp, (char **)&cp, 10); + size = (off_t) strtoll(cp, (char **)&cp, 10); if (*cp++ != ' ') { error("update: size not delimited"); return(US_NOTHING); @@ -921,8 +921,8 @@ update(char *rname, opt_t opts, struct stat *statp) debugmsg(DM_MISC, "update(%s,) local mode %04o remote mode %04o\n", rname, lmode, rmode); - debugmsg(DM_MISC, "update(%s,) size %ld mtime %d owner '%s' grp '%s'\n", - rname, (long) size, mtime, owner, group); + debugmsg(DM_MISC, "update(%s,) size %lld mtime %d owner '%s' grp '%s'" + "\n", rname, (long long) size, mtime, owner, group); if (statp->st_mtime != mtime) { if (statp->st_mtime < mtime && IS_ON(opts, DO_YOUNGER)) { @@ -935,8 +935,8 @@ update(char *rname, opt_t opts, struct stat *statp) } if (statp->st_size != size) { - debugmsg(DM_MISC, "size does not match (%ld != %ld).\n", - (long) statp->st_size, (long) size); + debugmsg(DM_MISC, "size does not match (%lld != %lld).\n", + (long long) statp->st_size, (long long) size); return(US_OUTDATE); } diff --git a/usr.bin/rdist/common.c b/usr.bin/rdist/common.c index 6c8e9d69155..4a3ea958786 100644 --- a/usr.bin/rdist/common.c +++ b/usr.bin/rdist/common.c @@ -1,4 +1,4 @@ -/* $OpenBSD: common.c,v 1.23 2009/10/27 23:59:42 deraadt Exp $ */ +/* $OpenBSD: common.c,v 1.24 2011/04/10 15:47:28 krw Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. @@ -69,7 +69,7 @@ char defowner[64] = "bin"; /* Default owner */ char defgroup[64] = "bin"; /* Default group */ static int sendcmdmsg(int, char *, size_t); -static int remread(int, u_char *, int); +static ssize_t remread(int, u_char *, size_t); static int remmore(void); /* @@ -354,15 +354,15 @@ sendcmd(va_alist) */ static u_char rembuf[BUFSIZ]; static u_char *remptr; -static int remleft; +static ssize_t remleft; #define remc() (--remleft < 0 ? remmore() : *remptr++) /* * Back end to remote read() */ -static int -remread(int fd, u_char *buf, int bufsiz) +static ssize_t +remread(int fd, u_char *buf, size_t bufsiz) { return(read(fd, (char *)buf, bufsiz)); } @@ -452,8 +452,8 @@ remline(u_char *buffer, int space, int doclean) /* * Non-line-oriented remote read. */ -int -readrem(char *p, int space) +ssize_t +readrem(char *p, ssize_t space) { if (remleft <= 0) { /* diff --git a/usr.bin/rdist/config-data.h b/usr.bin/rdist/config-data.h index cc1cee4ac9d..608726e19f8 100644 --- a/usr.bin/rdist/config-data.h +++ b/usr.bin/rdist/config-data.h @@ -1,4 +1,4 @@ -/* $OpenBSD: config-data.h,v 1.6 2003/06/03 02:56:14 millert Exp $ */ +/* $OpenBSD: config-data.h,v 1.7 2011/04/10 15:47:28 krw Exp $ */ /* * Copyright (c) 1993 Michael A. Cooper @@ -82,10 +82,10 @@ typedef struct dirent DIRENTRY; * Set default write(2) return and amount types. */ #if !defined(WRITE_RETURN_T) -#define WRITE_RETURN_T int /* What write() returns */ +#define WRITE_RETURN_T ssize_t /* What write() returns */ #endif /* WRITE_RETURN_T */ #if !defined(WRITE_AMT_T) -#define WRITE_AMT_T int /* Amount to write */ +#define WRITE_AMT_T size_t /* Amount to write */ #endif /* WRITE_AMT_T */ #endif /* __configdata_h__ */ diff --git a/usr.bin/rdist/defs.h b/usr.bin/rdist/defs.h index 378ff9379ea..5dc77403c04 100644 --- a/usr.bin/rdist/defs.h +++ b/usr.bin/rdist/defs.h @@ -1,4 +1,4 @@ -/* $OpenBSD: defs.h,v 1.16 2008/01/02 17:44:11 chl Exp $ */ +/* $OpenBSD: defs.h,v 1.17 2011/04/10 15:47:28 krw Exp $ */ #ifndef __DEFS_H__ #define __DEFS_H__ @@ -370,7 +370,7 @@ void coredump(void); void sighandler(int); int sendcmd(char, char *, ...); int remline(u_char *, int, int); -int readrem(char *, int); +ssize_t readrem(char *, ssize_t); char *getusername(UID_T, char *, opt_t); char *getgroupname(GID_T, char *, opt_t); int response(void); @@ -420,7 +420,7 @@ mntent_t *getmntpt(char *, struct stat *, int *); int is_nfs_mounted(char *, struct stat *, int *); int is_ro_mounted(char *, struct stat *, int *); int is_symlinked(char *, struct stat *, int *); -int getfilesysinfo(char *, long *, long *); +int getfilesysinfo(char *, int64_t *, int64_t *); /* gram.c */ int yylex(void); diff --git a/usr.bin/rdist/docmd.c b/usr.bin/rdist/docmd.c index 3db7e91604b..90deae56a79 100644 --- a/usr.bin/rdist/docmd.c +++ b/usr.bin/rdist/docmd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: docmd.c,v 1.21 2009/10/27 23:59:42 deraadt Exp $ */ +/* $OpenBSD: docmd.c,v 1.22 2011/04/10 15:47:28 krw Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. @@ -308,7 +308,7 @@ makeconn(char *rhost) char *ruser, *cp; static char *cur_host = NULL; extern char *locuser; - extern long min_freefiles, min_freespace; + extern int64_t min_freefiles, min_freespace; extern char *remotemsglist; char tuser[BUFSIZ], buf[BUFSIZ]; u_char respbuff[BUFSIZ]; diff --git a/usr.bin/rdist/rdist.c b/usr.bin/rdist/rdist.c index d29b47a7209..9deb307e37f 100644 --- a/usr.bin/rdist/rdist.c +++ b/usr.bin/rdist/rdist.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rdist.c,v 1.19 2009/10/27 23:59:42 deraadt Exp $ */ +/* $OpenBSD: rdist.c,v 1.20 2011/04/10 15:47:28 krw Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. @@ -88,6 +88,7 @@ main(int argc, char **argv, char **envp) char *cp; int cmdargs = 0; int c; + const char *errstr; progname = __progname; @@ -160,10 +161,20 @@ main(int argc, char **argv, char **envp) error("\"%s\" is not a number.", optarg); usage(); } - if (c == 'a') - min_freespace = atoi(optarg); - else if (c == 'A') - min_freefiles = atoi(optarg); + if (c == 'a') { + min_freespace = (int64_t)strtonum(optarg, + 0, LLONG_MAX, &errstr); + if (errstr) + fatalerr("Minimum free space is %s: " + "'%s'", errstr, optarg); + } + else if (c == 'A') { + min_freefiles = (u_int64_t)strtonum(optarg, + 0, LLONG_MAX, &errstr); + if (errstr) + fatalerr("Minimum free files is %s: " + "'%s'", errstr, optarg); + } else if (c == 'M') maxchildren = atoi(optarg); else if (c == 't') diff --git a/usr.bin/rdistd/filesys.c b/usr.bin/rdistd/filesys.c index 8c37fbd22c8..8323f98de54 100644 --- a/usr.bin/rdistd/filesys.c +++ b/usr.bin/rdistd/filesys.c @@ -1,4 +1,4 @@ -/* $OpenBSD: filesys.c,v 1.11 2009/10/27 23:59:42 deraadt Exp $ */ +/* $OpenBSD: filesys.c,v 1.12 2011/04/10 15:47:28 krw Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. @@ -402,7 +402,7 @@ is_symlinked(char *path, struct stat *statbuf, int *isvalid) * information. */ int -getfilesysinfo(char *file, long *freespace, long *freefiles) +getfilesysinfo(char *file, int64_t *freespace, int64_t *freefiles) { #if defined(STATFS_TYPE) static statfs_t statfsbuf; @@ -449,11 +449,11 @@ getfilesysinfo(char *file, long *freespace, long *freefiles) * to < 0 if the field is unsupported for the filesystem type. */ #if defined(BROKEN_STATFS) - if (statfsbuf.f_ffree > 0) + if (statfsbuf.f_favail > 0) #else - if (statfsbuf.f_ffree >= 0) + if (statfsbuf.f_favail >= 0) #endif /* BROKEN_STATFS */ - *freefiles = statfsbuf.f_ffree; + *freefiles = statfsbuf.f_favail; #else /* !STATFS_TYPE */ diff --git a/usr.bin/rdistd/server.c b/usr.bin/rdistd/server.c index 06c95f2734d..ab4343583d2 100644 --- a/usr.bin/rdistd/server.c +++ b/usr.bin/rdistd/server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server.c,v 1.21 2009/10/27 23:59:42 deraadt Exp $ */ +/* $OpenBSD: server.c,v 1.22 2011/04/10 15:47:28 krw Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. @@ -41,8 +41,8 @@ char *ptarget; /* pointer to end of target name */ int catname = 0; /* cat name to target name */ char *sptarget[32]; /* stack of saved ptarget's for directories */ char *fromhost = NULL; /* Client hostname */ -static long min_freespace = 0; /* Minimium free space on a filesystem */ -static long min_freefiles = 0; /* Minimium free # files on a filesystem */ +static int64_t min_freespace = 0; /* Minimium free space on a filesystem */ +static int64_t min_freefiles = 0; /* Minimium free # files on a filesystem */ int oumask; /* Old umask */ static int cattarget(char *); @@ -656,8 +656,8 @@ query(char *xname) case S_IFIFO: #endif #endif - (void) sendcmd(QC_YES, "%ld %ld %o %s %s", - (long) stb.st_size, stb.st_mtime, + (void) sendcmd(QC_YES, "%lld %ld %o %s %s", + (long long) stb.st_size, stb.st_mtime, stb.st_mode & 07777, getusername(stb.st_uid, target, options), getgroupname(stb.st_gid, target, options)); @@ -794,13 +794,13 @@ recvfile(char *new, opt_t opts, int mode, char *owner, char *group, wrerr = 0; olderrno = 0; for (i = 0; i < size; i += BUFSIZ) { - int amt = BUFSIZ; + off_t amt = BUFSIZ; cp = buf; if (i + amt > size) amt = size - i; do { - int j; + ssize_t j; j = readrem(cp, amt); if (j <= 0) { @@ -1330,6 +1330,7 @@ setconfig(char *cmd) { char *cp = cmd; char *estr; + const char *errstr; switch (*cp++) { case SC_HOSTNAME: /* Set hostname */ @@ -1346,19 +1347,17 @@ setconfig(char *cmd) break; case SC_FREESPACE: /* Minimium free space */ - if (!isdigit((unsigned char)*cp)) { - fatalerr("Expected digit, got '%s'.", cp); - return; - } - min_freespace = (unsigned long) atoi(cp); + min_freespace = (int64_t)strtonum(cp, 0, LLONG_MAX, &errstr); + if (errstr) + fatalerr("Minimum free space is %s: '%s'", errstr, + optarg); break; case SC_FREEFILES: /* Minimium free files */ - if (!isdigit((unsigned char)*cp)) { - fatalerr("Expected digit, got '%s'.", cp); - return; - } - min_freefiles = (unsigned long) atoi(cp); + min_freefiles = (int64_t)strtonum(cp, 0, LLONG_MAX, &errstr); + if (errstr) + fatalerr("Minimum free files is %s: '%s'", errstr, + optarg); break; case SC_LOGGING: /* Logging options */ @@ -1396,7 +1395,7 @@ recvit(char *cmd, int type) char *owner, *group, *file; char new[MAXPATHLEN]; char fileb[MAXPATHLEN]; - long freespace = -1, freefiles = -1; + int64_t freespace = -1, freefiles = -1; char *cp = cmd; /* @@ -1420,7 +1419,7 @@ recvit(char *cmd, int type) /* * Get file size */ - size = strtol(cp, &cp, 10); + size = (off_t) strtoll(cp, &cp, 10); if (*cp++ != ' ') { error("recvit: size not delimited"); return; @@ -1429,7 +1428,7 @@ recvit(char *cmd, int type) /* * Get modification time */ - mtime = strtol(cp, &cp, 10); + mtime = (time_t) strtol(cp, &cp, 10); if (*cp++ != ' ') { error("recvit: mtime not delimited"); return; @@ -1478,8 +1477,8 @@ recvit(char *cmd, int type) file = fileb; debugmsg(DM_MISC, - "recvit: opts = %04o mode = %04o size = %d mtime = %d", - opts, mode, size, mtime); + "recvit: opts = %04o mode = %04o size = %lld mtime = %d", + opts, mode, (long long) size, mtime); debugmsg(DM_MISC, "recvit: owner = '%s' group = '%s' file = '%s' catname = %d isdir = %d", owner, group, file, catname, (type == S_IFDIR) ? 1 : 0); @@ -1523,7 +1522,7 @@ recvit(char *cmd, int type) */ if (min_freespace || min_freefiles) { /* Convert file size to kilobytes */ - long fsize = (long) (size / 1024); + int64_t fsize = (int64_t)size / 1024; if (getfilesysinfo(target, &freespace, &freefiles) != 0) return; @@ -1535,15 +1534,15 @@ recvit(char *cmd, int type) if (min_freespace && (freespace >= 0) && (freespace - fsize < min_freespace)) { error( - "%s: Not enough free space on filesystem: min %d free %d", - target, min_freespace, freespace); + "%s: Not enough free space on filesystem: min %lld " + "free %lld", target, min_freespace, freespace); return; } if (min_freefiles && (freefiles >= 0) && (freefiles - 1 < min_freefiles)) { error( - "%s: Not enough free files on filesystem: min %d free %d", - target, min_freefiles, freefiles); + "%s: Not enough free files on filesystem: min %lld free " + "%lld", target, min_freefiles, freefiles); return; } } |