Date: Tue, 14 Mar 2006 21:58:27 GMT From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 93313 for review Message-ID: <200603142158.k2ELwRgg091156@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=93313 Change 93313 by peter@peter_daintree on 2006/03/14 21:57:49 IFC @93312 Affected files ... .. //depot/projects/hammer/contrib/csup/GNUmakefile#2 integrate .. //depot/projects/hammer/contrib/csup/Makefile#2 integrate .. //depot/projects/hammer/contrib/csup/TODO#2 integrate .. //depot/projects/hammer/contrib/csup/config.c#2 integrate .. //depot/projects/hammer/contrib/csup/config.h#2 integrate .. //depot/projects/hammer/contrib/csup/csup.1#2 integrate .. //depot/projects/hammer/contrib/csup/fattr.c#2 integrate .. //depot/projects/hammer/contrib/csup/globtree.c#2 integrate .. //depot/projects/hammer/contrib/csup/idcache.c#1 branch .. //depot/projects/hammer/contrib/csup/idcache.h#1 branch .. //depot/projects/hammer/contrib/csup/lister.c#2 integrate .. //depot/projects/hammer/contrib/csup/main.c#2 integrate .. //depot/projects/hammer/contrib/csup/misc.c#2 integrate .. //depot/projects/hammer/contrib/csup/misc.h#2 integrate .. //depot/projects/hammer/contrib/csup/proto.c#2 integrate .. //depot/projects/hammer/contrib/csup/token.h#2 integrate .. //depot/projects/hammer/contrib/csup/token.l#2 integrate .. //depot/projects/hammer/contrib/csup/updater.c#2 integrate .. //depot/projects/hammer/etc/mtree/BSD.x11-4.dist#13 integrate .. //depot/projects/hammer/include/stdlib.h#14 integrate .. //depot/projects/hammer/lib/libc/stdlib/Makefile.inc#15 integrate .. //depot/projects/hammer/lib/libc/stdlib/Symbol.map#2 integrate .. //depot/projects/hammer/lib/libc/stdlib/strtonum.3#1 branch .. //depot/projects/hammer/lib/libc/stdlib/strtonum.c#1 branch .. //depot/projects/hammer/share/man/man5/Makefile#17 integrate .. //depot/projects/hammer/share/man/man9/hash.9#1 branch .. //depot/projects/hammer/sys/amd64/amd64/machdep.c#153 integrate .. //depot/projects/hammer/sys/boot/i386/libi386/Makefile#18 integrate .. //depot/projects/hammer/sys/boot/i386/libi386/smbios.c#5 integrate .. //depot/projects/hammer/sys/fs/fifofs/fifo_vnops.c#34 integrate .. //depot/projects/hammer/sys/i386/i386/machdep.c#69 integrate .. //depot/projects/hammer/sys/kern/kern_exit.c#58 integrate .. //depot/projects/hammer/sys/kern/kern_thread.c#88 integrate .. //depot/projects/hammer/sys/kern/uipc_mbuf.c#39 integrate .. //depot/projects/hammer/sys/pc98/pc98/machdep.c#10 integrate .. //depot/projects/hammer/usr.bin/csup/Makefile#2 integrate .. //depot/projects/hammer/usr.bin/ktrace/ktrace.c#3 integrate .. //depot/projects/hammer/usr.sbin/bluetooth/bthidd/bthidd.c#4 integrate .. //depot/projects/hammer/usr.sbin/bluetooth/bthidd/hid.c#3 integrate Differences ... ==== //depot/projects/hammer/contrib/csup/GNUmakefile#2 (text) ==== @@ -2,7 +2,7 @@ # be used elsewhere because it assumes that the target system doesn't # support BSD extended file flags. # -# $FreeBSD: src/contrib/csup/GNUmakefile,v 1.1.1.1 2006/03/03 04:11:25 mux Exp $ +# $FreeBSD: src/contrib/csup/GNUmakefile,v 1.1.1.2 2006/03/14 03:51:13 mux Exp $ # PREFIX?=/usr/local @@ -12,8 +12,8 @@ UNAME= $(shell uname -s) SRCS= attrstack.c config.c detailer.c diff.c fattr.c fixups.c fnmatch.c \ - globtree.c keyword.c lister.c main.c misc.c mux.c pathcomp.c parse.c \ - proto.c status.c stream.c threads.c token.c updater.c + globtree.c idcache.c keyword.c lister.c main.c misc.c mux.c pathcomp.c \ + parse.c proto.c status.c stream.c threads.c token.c updater.c OBJS= $(SRCS:.c=.o) WARNS= -Wall -W -Wno-unused-parameter -Wmissing-prototypes -Wpointer-arith \ @@ -22,10 +22,10 @@ -Wnested-externs -Wredundant-decls -Wno-format-y2k CFLAGS+= -g -O -pipe -DNDEBUG -I$(PREFIX)/include -ifeq ($(UNAME), "Linux") +ifeq ($(UNAME), Linux) CFLAGS+= -D_XOPEN_SOURCE -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 endif -ifeq ($(UNAME), "Darwin") +ifeq ($(UNAME), Darwin) CFLAGS+= -DHAVE_FFLAGS endif CFLAGS+= $(WARNS) ==== //depot/projects/hammer/contrib/csup/Makefile#2 (text) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/contrib/csup/Makefile,v 1.1.1.1 2006/03/03 04:11:25 mux Exp $ +# $FreeBSD: src/contrib/csup/Makefile,v 1.1.1.2 2006/03/14 03:51:13 mux Exp $ PREFIX?= /usr/local BINDIR?= ${PREFIX}/bin @@ -7,27 +7,9 @@ UNAME!= /usr/bin/uname -s PROG= csup -SRCS= attrstack.c attrstack.h \ - config.c config.h \ - detailer.c detailer.h \ - diff.c diff.h \ - fattr.c fattr.h fattr_bsd.h \ - fixups.c fixups.h \ - fnmatch.c fnmatch.h \ - globtree.c globtree.h \ - keyword.c keyword.h \ - lister.c lister.h \ - main.c main.h \ - misc.c misc.h \ - mux.c mux.h \ - parse.h parse.y \ - pathcomp.c pathcomp.h \ - proto.c proto.h \ - status.c status.h \ - stream.c stream.h \ - threads.c threads.h \ - token.h token.l \ - updater.c updater.h +SRCS= attrstack.c config.c detailer.c diff.c fattr.c fixups.c fnmatch.c \ + globtree.c idcache.c keyword.c lister.c main.c misc.c mux.c parse.y \ + pathcomp.c proto.c status.c stream.c threads.c token.l updater.c CFLAGS+= -I. -I${.CURDIR} -g -pthread -DHAVE_FFLAGS -DNDEBUG WARNS?= 6 ==== //depot/projects/hammer/contrib/csup/TODO#2 (text) ==== @@ -1,4 +1,4 @@ -$FreeBSD: src/contrib/csup/TODO,v 1.1.1.1 2006/03/03 04:11:25 mux Exp $ +$FreeBSD: src/contrib/csup/TODO,v 1.1.1.2 2006/03/14 03:51:13 mux Exp $ BUGS: @@ -9,9 +9,6 @@ has global variables because of yacc, but I think it should be possible to do it better by using YYFUNC_PROTOTYPE or something. I think it should also be possible to completely get rid of the lex file. -- Some code uses getpwnam() while it should use the thread-safe variant, - getpwnam_r(). Same for getpwuid() and getgrgid(). We probably need a - UID/GID lookup cache here. - The $Log$ CVS keyword is not supported. - Add missing support for supfile keywords and add sanity checks for some of them. Also, we're not supposed to choke on unknown keywords @@ -22,9 +19,9 @@ - Add support for authentication. - Add support for shell commands sent by the server. -- Add missing support for various CVSup options : -k, -d, -D, - -a (requires authentication support), -e and -E (requires shell - commands support) and the destDir parameter. +- Add missing support for various CVSup options : -D, -a (requires + authentication support), -e and -E (requires shell commands support) + and the destDir parameter. - For now, this code should build fine on FreeBSD, NetBSD, OpenBSD, Linux and Darwin. Solaris support would also be nice at some point. - Implement some new useful options : the ability to generate CVS ==== //depot/projects/hammer/contrib/csup/config.c#2 (text) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/config.c,v 1.1.1.1 2006/03/03 04:11:26 mux Exp $ + * $FreeBSD: src/contrib/csup/config.c,v 1.1.1.2 2006/03/14 03:51:13 mux Exp $ */ #include <sys/types.h> @@ -53,6 +53,8 @@ static STAILQ_HEAD(, coll) colls; static struct coll *cur_coll; static struct coll *defaults; +static struct coll *ovcoll; +static int ovmask; static const char *cfgfile; /* @@ -78,13 +80,14 @@ mask = umask(0); umask(mask); defaults->co_umask = mask; + ovcoll = override; + ovmask = overridemask; /* Extract a list of collections from the configuration file. */ cur_coll = coll_new(defaults); yyin = fopen(file, "r"); if (yyin == NULL) { - lprintf(-1, "Cannot open \"%s\": %s\n", file, - strerror(errno)); + lprintf(-1, "Cannot open \"%s\": %s\n", file, strerror(errno)); goto bad; } cfgfile = file; @@ -101,7 +104,6 @@ /* Fixup the list of collections. */ STAILQ_FOREACH(coll, &config->colls, co_next) { - coll_override(coll, override, overridemask); if (coll->co_base == NULL) coll->co_base = xstrdup("/usr/local/etc/cvsup"); if (coll->co_colldir == NULL) @@ -229,13 +231,27 @@ config_parse_refusefile(struct coll *coll, char *path) { struct stream *rd; - char *line; + char *cp, *line, *pat; rd = stream_open_file(path, O_RDONLY); if (rd == NULL) return (0); - while ((line = stream_getln(rd, NULL)) != NULL) - pattlist_add(coll->co_refusals, line); + while ((line = stream_getln(rd, NULL)) != NULL) { + pat = line; + for (;;) { + /* Trim leading whitespace. */ + pat += strspn(pat, " \t"); + if (pat[0] == '\0') + break; + cp = strpbrk(pat, " \t"); + if (cp != NULL) + *cp = '\0'; + pattlist_add(coll->co_refusals, pat); + if (cp == NULL) + break; + pat = cp + 1; + } + } if (!stream_eof(rd)) { stream_close(rd); lprintf(-1, "Read failure from \"%s\": %s\n", path, @@ -417,6 +433,7 @@ struct coll *coll; cur_coll->co_name = name; + coll_override(cur_coll, ovcoll, ovmask); if (cur_coll->co_release == NULL) { lprintf(-1, "Release not specified for collection " "\"%s\"\n", cur_coll->co_name); @@ -472,6 +489,8 @@ globtree_free(coll->co_dirfilter); if (coll->co_dirfilter != NULL) globtree_free(coll->co_filefilter); + if (coll->co_norsync != NULL) + globtree_free(coll->co_norsync); if (coll->co_accepts != NULL) pattlist_free(coll->co_accepts); if (coll->co_refusals != NULL) @@ -483,6 +502,7 @@ coll_setopt(int opt, char *value) { struct coll *coll; + int error, mask; coll = cur_coll; switch (opt) { @@ -529,14 +549,14 @@ coll->co_listsuffix = value; break; case PT_UMASK: - errno = 0; - coll->co_umask = strtol(value, NULL, 8); + error = asciitoint(value, &mask, 8); free(value); - if (errno) { + if (error) { lprintf(-1, "Parse error in \"%s\": Invalid " "umask value\n", cfgfile); exit(1); } + coll->co_umask = mask; break; case PT_USE_REL_SUFFIX: coll->co_options |= CO_USERELSUFFIX; @@ -547,6 +567,9 @@ case PT_COMPRESS: coll->co_options |= CO_COMPRESS; break; + case PT_NORSYNC: + coll->co_options |= CO_NORSYNC; + break; } } ==== //depot/projects/hammer/contrib/csup/config.h#2 (text) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/config.h,v 1.1.1.1 2006/03/03 04:11:26 mux Exp $ + * $FreeBSD: src/contrib/csup/config.h,v 1.1.1.2 2006/03/14 03:51:12 mux Exp $ */ #ifndef _CONFIG_H_ #define _CONFIG_H_ @@ -86,6 +86,7 @@ struct pattlist *co_refusals; struct globtree *co_dirfilter; struct globtree *co_filefilter; + struct globtree *co_norsync; const char *co_colldir; char *co_listsuffix; time_t co_scantime; /* Set by the detailer thread. */ @@ -101,6 +102,7 @@ char *host; struct sockaddr *laddr; socklen_t laddrlen; + int deletelim; int socket; struct chan *chan0; struct chan *chan1; ==== //depot/projects/hammer/contrib/csup/csup.1#2 (text) ==== @@ -22,7 +22,7 @@ .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" $Id: cvsup.1,v 1.70 2003/03/04 18:23:46 jdp Exp $ -.\" $FreeBSD: src/contrib/csup/csup.1,v 1.1.1.1 2006/03/03 04:11:26 mux Exp $ +.\" $FreeBSD: src/contrib/csup/csup.1,v 1.1.1.2 2006/03/14 03:51:12 mux Exp $ .\" .Dd February 1, 2006 .Os FreeBSD @@ -32,10 +32,11 @@ .Nd network distribution package for CVS repositories .Sh SYNOPSIS .Nm -.Op Fl 146svzZ +.Op Fl 146ksvzZ .Op Fl A Ar addr .Op Fl b Ar base .Op Fl c Ar collDir +.Op Fl d Ar delLimit .Op Fl h Ar host .Op Fl i Ar pattern .Op Fl l Ar lockfile @@ -123,6 +124,13 @@ where the information about the collections is maintained. The default is .Pa sup . +.It Fl d Ar delLimit +Specifies the maximum number of files that may be deleted in a +single update run. +Any attempt to exceed the limit results in a fatal error. +This can provide some protection against temporary configuration +mistakes on the server. +The default limit is infinity. .It Fl h Ar host Specifies the server host to contact, overriding any .Cm host @@ -148,6 +156,17 @@ It is interpreted relative to the collection's prefix directory. Slash characters are matched only by explicit slashes in the pattern. Leading periods in file name are not treated specially. +.It Fl k +Causes +.Nm +to keep the temporary copies of any incorrectly edited files, in the +event of checksum mismatches. +This option is for debugging, to help determine why the files were +edited incorrectly. +Regardless of whether this option is specified, the permanent versions +of faulty files are replaced with correct versions obtained by +transferring the files in their entirety. +Such transfers are called fixups. .It Fl l Ar lockfile Creates and locks the .Ar lockfile ==== //depot/projects/hammer/contrib/csup/fattr.c#2 (text) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/fattr.c,v 1.1.1.1 2006/03/03 04:11:26 mux Exp $ + * $FreeBSD: src/contrib/csup/fattr.c,v 1.1.1.2 2006/03/14 03:51:12 mux Exp $ */ #include <sys/time.h> @@ -32,14 +32,13 @@ #include <assert.h> #include <errno.h> -#include <grp.h> -#include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "fattr.h" +#include "idcache.h" #include "misc.h" /* @@ -126,6 +125,8 @@ fa->mask |= FA_MODE; defaults[i] = fa; } + /* Initialize the uid/gid lookup cache. */ + idcache_init(); } void @@ -133,6 +134,7 @@ { int i; + idcache_fini(); for (i = 0; i < FT_NUMBER; i++) fattr_free(defaults[i]); } @@ -336,29 +338,26 @@ int extval; char *ext; } pieces[FA_NUMBER], *piece; - struct passwd *pw; - struct group *gr; - char *cp, *s; + char *cp, *s, *username, *groupname; size_t len, vallen; mode_t mode, modemask; int mask, n, i; - pw = NULL; - gr = NULL; + username = NULL; + groupname = NULL; if (support == NULL) mask = fa->mask; else mask = fa->mask & support[fa->type]; mask &= ~ignore; - /* XXX - Use getpwuid_r() and getgrgid_r(). */ if (fa->mask & FA_OWNER) { - pw = getpwuid(fa->uid); - if (pw == NULL) + username = getuserbyid(fa->uid); + if (username == NULL) mask &= ~FA_OWNER; } if (fa->mask & FA_GROUP) { - gr = getgrgid(fa->gid); - if (gr == NULL) + groupname = getgroupbyid(fa->gid); + if (groupname == NULL) mask &= ~FA_GROUP; } if (fa->mask & FA_LINKCOUNT && fa->linkcount == 1) @@ -408,17 +407,17 @@ piece++; } if (mask & FA_OWNER) { - vallen = strlen(pw->pw_name); + vallen = strlen(username); piece->extval = 1; - piece->ext = pw->pw_name; + piece->ext = username; len += snprintf(piece->len, sizeof(piece->len), "%lld", (long long)vallen) + vallen + 1; piece++; } if (mask & FA_GROUP) { - vallen = strlen(gr->gr_name); + vallen = strlen(groupname); piece->extval = 1; - piece->ext = gr->gr_name; + piece->ext = groupname; len += snprintf(piece->len, sizeof(piece->len), "%lld", (long long)vallen) + vallen + 1; piece++; @@ -551,11 +550,10 @@ static char * fattr_scanattr(struct fattr *fa, int type, const char *attr) { - struct passwd *pw; - struct group *gr; char *attrend, *attrstart, *end; size_t len; unsigned long attrlen; + int error; mode_t modemask; char tmp; @@ -606,21 +604,13 @@ goto bad; break; case FA_OWNER: - /* - * XXX - We need to use getpwnam_r() since getpwnam() - * is not thread-safe, and we also need to use a cache. - */ - pw = getpwnam(attrstart); - if (pw != NULL) - fa->uid = pw->pw_uid; - else + error = getuidbyname(attrstart, &fa->uid); + if (error) fa->mask &= ~FA_OWNER; break; case FA_GROUP: - gr = getgrnam(attrstart); - if (gr != NULL) - fa->gid = gr->gr_gid; - else + error = getgidbyname(attrstart, &fa->gid); + if (error) fa->mask &= ~FA_GROUP; break; case FA_MODE: @@ -770,11 +760,13 @@ return (-1); } +#ifdef HAVE_FFLAGS /* Clear flags. */ if (fa->mask & FA_FLAGS && fa->flags != 0) { fa->flags = 0; (void)chflags(path, fa->flags); } +#endif if (fa->type == FT_DIRECTORY) error = rmdir(path); @@ -812,35 +804,35 @@ inplace = 1; } old = fattr_frompath(topath, FATTR_NOFOLLOW); - if (old == NULL) - return (-1); - if (inplace && fattr_equal(fa, old)) { - fattr_free(old); - return (0); - } + if (old != NULL) { + if (inplace && fattr_equal(fa, old)) { + fattr_free(old); + return (0); + } #ifdef HAVE_FFLAGS - /* - * Determine whether we need to clear the flags of the target. - * This is bogus in that it assumes a value of 0 is safe and - * that non-zero is unsafe. I'm not really worried by that - * since as far as I know that's the way things are. - */ - if ((old->mask & FA_FLAGS) && old->flags > 0) { - (void)chflags(topath, 0); - old->flags = 0; - } + /* + * Determine whether we need to clear the flags of the target. + * This is bogus in that it assumes a value of 0 is safe and + * that non-zero is unsafe. I'm not really worried by that + * since as far as I know that's the way things are. + */ + if ((old->mask & FA_FLAGS) && old->flags > 0) { + (void)chflags(topath, 0); + old->flags = 0; + } #endif - /* Determine whether we need to remove the target first. */ - if (!inplace && (fa->type == FT_DIRECTORY) != - (old->type == FT_DIRECTORY)) { - if (old->type == FT_DIRECTORY) - error = rmdir(topath); - else - error = unlink(topath); - if (error) - goto bad; + /* Determine whether we need to remove the target first. */ + if (!inplace && (fa->type == FT_DIRECTORY) != + (old->type == FT_DIRECTORY)) { + if (old->type == FT_DIRECTORY) + error = rmdir(topath); + else + error = unlink(topath); + if (error) + goto bad; + } } /* Change those attributes that we can before moving the file @@ -866,8 +858,8 @@ } if (mask & FA_MODE) { newmode = fa->mode & modemask; - /* Merge in set*id bits from the old attribute. XXX - Why? */ - if (old->mask & FA_MODE) { + /* Merge in set*id bits from the old attribute. */ + if (old != NULL && old->mask & FA_MODE) { newmode |= (old->mode & ~modemask); newmode &= (FA_SETIDMASK | FA_PERMMASK); } ==== //depot/projects/hammer/contrib/csup/globtree.c#2 (text) ==== @@ -23,16 +23,16 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/globtree.c,v 1.1.1.1 2006/03/03 04:11:27 mux Exp $ + * $FreeBSD: src/contrib/csup/globtree.c,v 1.1.1.2 2006/03/14 03:51:12 mux Exp $ */ #include <sys/types.h> #include <assert.h> -#include <fnmatch.h> #include <regex.h> #include <stdlib.h> +#include "fnmatch.h" #include "globtree.h" #include "misc.h" ==== //depot/projects/hammer/contrib/csup/lister.c#2 (text) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/lister.c,v 1.1.1.1 2006/03/03 04:11:27 mux Exp $ + * $FreeBSD: src/contrib/csup/lister.c,v 1.1.1.2 2006/03/14 03:51:12 mux Exp $ */ #include <assert.h> @@ -145,6 +145,7 @@ struct attrstack *as; struct statusrec *sr; struct fattr *fa; + size_t i; int depth, error, ret, prunedepth; wr = l->wr; @@ -203,7 +204,7 @@ return (LISTER_ERR_WRITE); return (0); bad: - while (depth-- > 0) { + for (i = 0; i < attrstack_size(as); i++) { fa = attrstack_pop(as); fattr_free(fa); } ==== //depot/projects/hammer/contrib/csup/main.c#2 (text) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/main.c,v 1.1.1.1 2006/03/03 04:11:28 mux Exp $ + * $FreeBSD: src/contrib/csup/main.c,v 1.1.1.2 2006/03/14 03:51:11 mux Exp $ */ #include <sys/file.h> @@ -66,6 +66,8 @@ "Override supfile's \"base\" directory"); lprintf(-1, USAGE_OPTFMT, "-c collDir", "Subdirectory of \"base\" for collections (default \"sup\")"); + lprintf(-1, USAGE_OPTFMT, "-d delLimit", + "Allow at most \"delLimit\" file deletions (default unlimited)"); lprintf(-1, USAGE_OPTFMT, "-h host", "Override supfile's \"host\" name"); lprintf(-1, USAGE_OPTFMT, "-i pattern", @@ -73,6 +75,8 @@ lprintf(-1, USAGE_OPTFMTSUB, "May be repeated for an OR operation. Default is"); lprintf(-1, USAGE_OPTFMTSUB, "to include each entire collection."); + lprintf(-1, USAGE_OPTFMT, "-k", + "Keep bad temporary files when fixups are required"); lprintf(-1, USAGE_OPTFMT, "-l lockfile", "Lock file during update; fail if already locked"); lprintf(-1, USAGE_OPTFMT, "-L n", @@ -102,13 +106,13 @@ socklen_t laddrlen; struct stream *lock; char *argv0, *file, *lockfile; - uint16_t port; int family, error, lockfd, lflag, overridemask; - int c, i, retries, status; + int c, i, deletelim, port, retries, status; time_t nexttry; error = 0; family = PF_UNSPEC; + deletelim = -1; port = 0; lflag = 0; lockfd = 0; @@ -121,7 +125,8 @@ override = coll_new(NULL); overridemask = 0; - while ((c = getopt(argc, argv, "146A:b:c:gh:i:l:L:p:P:r:svzZ")) != -1) { + while ((c = getopt(argc, argv, + "146A:b:c:d:gh:i:kl:L:p:P:r:svzZ")) != -1) { switch (c) { case '1': retries = 0; @@ -152,6 +157,14 @@ case 'c': override->co_colldir = optarg; break; + case 'd': + error = asciitoint(optarg, &deletelim, 0); + if (error || deletelim < 0) { + lprintf(-1, "Invalid deletion limit\n"); + usage(argv0); + return (1); + } + break; case 'g': /* For compatibility. */ break; @@ -163,6 +176,10 @@ case 'i': pattlist_add(override->co_accepts, optarg); break; + case 'k': + override->co_options |= CO_KEEPBADFILES; + overridemask |= CO_KEEPBADFILES; + break; case 'l': lockfile = optarg; lflag = 1; @@ -191,9 +208,8 @@ stream_close(lock); break; case 'L': - errno = 0; - verbose = strtol(optarg, NULL, 0); - if (errno == EINVAL) { + error = asciitoint(optarg, &verbose, 0); + if (error) { lprintf(-1, "Invalid verbosity\n"); usage(argv0); return (1); @@ -201,13 +217,21 @@ break; case 'p': /* Use specified server port. */ - errno = 0; - port = strtol(optarg, NULL, 0); - if (errno == EINVAL) { + error = asciitoint(optarg, &port, 0); + if (error) { lprintf(-1, "Invalid server port\n"); usage(argv0); return (1); } + if (port <= 0 || port >= 65536) { + lprintf(-1, "Invalid port %d\n", port); + return (1); + } + if (port < 1024) { + lprintf(-1, "Reserved port %d not permitted\n", + port); + return (1); + } break; case 'P': /* For compatibility. */ @@ -218,9 +242,8 @@ } break; case 'r': - errno = 0; - retries = strtol(optarg, NULL, 0); - if (errno == EINVAL || retries < 0) { + error = asciitoint(optarg, &retries, 0); + if (error || retries < 0) { lprintf(-1, "Invalid retry limit\n"); usage(argv0); return (1); @@ -270,15 +293,16 @@ if (config == NULL) return (1); - if (laddr != NULL) { - config->laddr = laddr; - config->laddrlen = laddrlen; - } if (config_checkcolls(config) == 0) { lprintf(-1, "No collections selected\n"); return (1); } + if (laddr != NULL) { + config->laddr = laddr; + config->laddrlen = laddrlen; + } + config->deletelim = deletelim; lprintf(2, "Connecting to %s\n", config->host); i = 0; ==== //depot/projects/hammer/contrib/csup/misc.c#2 (text) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/misc.c,v 1.1.1.2 2006/03/03 18:45:08 mux Exp $ + * $FreeBSD: src/contrib/csup/misc.c,v 1.1.1.3 2006/03/14 03:51:11 mux Exp $ */ #include <sys/types.h> @@ -34,6 +34,7 @@ #include <err.h> #include <errno.h> #include <fcntl.h> +#include <limits.h> #include <pthread.h> #include <stdarg.h> #include <stdio.h> @@ -64,6 +65,24 @@ static void bt_addjitter(struct backoff_timer *); int +asciitoint(const char *s, int *val, int base) +{ + char *end; + long longval; + + errno = 0; + longval = strtol(s, &end, base); + if (errno || *end != '\0') + return (-1); + if (longval > INT_MAX || longval < INT_MIN) { + errno = ERANGE; + return (-1); + } + *val = longval; + return (0); +} + +int lprintf(int level, const char *fmt, ...) { FILE *to; ==== //depot/projects/hammer/contrib/csup/misc.h#2 (text) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/misc.h,v 1.1.1.1 2006/03/03 04:11:28 mux Exp $ + * $FreeBSD: src/contrib/csup/misc.h,v 1.1.1.2 2006/03/14 03:51:11 mux Exp $ */ #ifndef _MISC_H_ #define _MISC_H_ @@ -99,6 +99,7 @@ struct pattlist; struct tm; +int asciitoint(const char *, int *, int); int lprintf(int, const char *, ...) __printflike(2, 3); int MD5_File(char *, char *); void MD5_End(char *, MD5_CTX *); @@ -125,4 +126,5 @@ time_t bt_get(struct backoff_timer *); void bt_pause(struct backoff_timer *); void bt_free(struct backoff_timer *); + #endif /* !_MISC_H_ */ ==== //depot/projects/hammer/contrib/csup/proto.c#2 (text) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/contrib/csup/proto.c,v 1.1.1.1 2006/03/03 04:11:28 mux Exp $ + * $FreeBSD: src/contrib/csup/proto.c,v 1.1.1.2 2006/03/14 03:51:11 mux Exp $ */ #include <sys/param.h> @@ -35,7 +35,6 @@ #include <assert.h> #include <err.h> #include <errno.h> -#include <limits.h> #include <netdb.h> #include <pthread.h> #include <signal.h> @@ -228,7 +227,7 @@ stream_flush(s); line = stream_getln(s, NULL); cmd = proto_get_ascii(&line); - if (line == NULL) + if (cmd == NULL || line == NULL) goto bad; if (strcmp(cmd, "!") == 0) { msg = proto_get_rest(&line); @@ -256,13 +255,20 @@ proto_login(struct config *config) { struct stream *s; - char host[MAXHOSTNAMELEN]; - char *line, *cmd, *realm, *challenge, *msg; + char hostbuf[MAXHOSTNAMELEN]; + char *line, *login, *host, *cmd, *realm, *challenge, *msg; + int error; s = config->server; - gethostname(host, sizeof(host)); - host[sizeof(host) - 1] = '\0'; - proto_printf(s, "USER %s %s\n", getlogin(), host); + error = gethostname(hostbuf, sizeof(hostbuf)); + hostbuf[sizeof(hostbuf) - 1] = '\0'; + if (error) + host = NULL; + else + host = hostbuf; + login = getlogin(); + proto_printf(s, "USER %s %s\n", login != NULL ? login : "?", + host != NULL ? host : "?"); stream_flush(s); line = stream_getln(s, NULL); cmd = proto_get_ascii(&line); @@ -279,6 +285,8 @@ stream_flush(s); line = stream_getln(s, NULL); cmd = proto_get_ascii(&line); + if (cmd == NULL || line == NULL) + goto bad; if (strcmp(cmd, "OK") == 0) return (STATUS_SUCCESS); if (strcmp(cmd, "!") == 0) { @@ -371,9 +379,11 @@ } proto_printf(s, ".\n"); stream_flush(s); + STAILQ_FOREACH(coll, &config->colls, co_next) { if (coll->co_options & CO_SKIP) continue; + coll->co_norsync = globtree_false(); line = stream_getln(s, NULL); if (line == NULL) goto bad; @@ -430,7 +440,21 @@ ident); if (error) goto bad; - } + } else if (strcmp(cmd, "NORS") == 0) { + pat = proto_get_ascii(&line); + if (pat == NULL || line != NULL) + goto bad; + coll->co_norsync = globtree_or(coll->co_norsync, + globtree_match(pat, FNM_PATHNAME)); + } else if (strcmp(cmd, "RNORS") == 0) { + pat = proto_get_ascii(&line); + if (pat == NULL || line != NULL) + goto bad; + coll->co_norsync = globtree_or(coll->co_norsync, + globtree_match(pat, FNM_PATHNAME | + FNM_LEADING_DIR)); + } else + goto bad; } if (line == NULL) goto bad; @@ -904,22 +928,14 @@ int proto_get_int(char **s, int *val, int base) { - char *cp, *end; - long longval; + char *cp; + int error; cp = proto_get_ascii(s); if (cp == NULL) return (-1); - errno = 0; - longval = strtol(cp, &end, base); - if (errno || *end != '\0') - return (-1); - if (longval > INT_MAX || longval < INT_MIN) { - errno = ERANGE; - return (-1); - } - *val = longval; - return (0); + error = asciitoint(cp, val, base); + return (error); } /* >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200603142158.k2ELwRgg091156>