diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2005-04-15 15:46:22 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2005-04-15 15:46:22 +0000 |
commit | 19b75a1a690e40a7a022d348bb1329485a220608 (patch) | |
tree | 93872155e539765be66b471a54dce51563b52b71 /usr.bin/rcs/rcsprog.c | |
parent | cadd396a1affc48e3b21b474cc67cdbae1da3fbd (diff) |
move rcs (and later on, clones of all the other rcs commands) out of the
cvs subdirectory; ok jfb joris
Diffstat (limited to 'usr.bin/rcs/rcsprog.c')
-rw-r--r-- | usr.bin/rcs/rcsprog.c | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/usr.bin/rcs/rcsprog.c b/usr.bin/rcs/rcsprog.c new file mode 100644 index 00000000000..7aa48643d30 --- /dev/null +++ b/usr.bin/rcs/rcsprog.c @@ -0,0 +1,220 @@ +/* $OpenBSD: rcsprog.c,v 1.1 2005/04/15 15:46:21 deraadt Exp $ */ +/* + * Copyright (c) 2005 Jean-Francois Brousseau <jfb@openbsd.org> + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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 <sys/wait.h> + +#include <err.h> +#include <pwd.h> +#include <errno.h> +#include <stdio.h> +#include <ctype.h> +#include <stdlib.h> +#include <unistd.h> +#include <signal.h> +#include <string.h> + +#include "log.h" +#include "rcs.h" +#include "strtab.h" + +extern char *__progname; + + +const char rcs_version[] = "OpenCVS RCS version 3.6"; + +void rcs_usage (void); +int rcs_main (int, char **); + + + +struct rcs_prog { + char *prog_name; + int (*prog_hdlr)(int, char **); +} programs[] = { + { "rcs", rcs_main }, + { "ci", NULL }, + { "co", NULL }, + { "rcsclean", NULL }, + { "rcsdiff", NULL }, +}; + + +int +main(int argc, char **argv) +{ + u_int i; + int ret; + + ret = -1; + cvs_strtab_init(); + + for (i = 0; i < (sizeof(programs)/sizeof(programs[0])); i++) + if (strcmp(__progname, programs[i].prog_name) == 0) + ret = programs[i].prog_hdlr(argc, argv); + + cvs_strtab_cleanup(); + + return (ret); +} + + +void +rcs_usage(void) +{ + fprintf(stderr, + "Usage: %s [-hiLMUV] [-a users] [-b [rev]] [-c string] " + "[-e users] [-k opt] file ...\n" + "\t-a users\tAdd the login names in the comma-separated <users>\n" + "\t-b rev\t\tSet the head revision to <rev>\n" + "\t-c string\tSet the comment leader to <string>\n" + "\t-e users\tRemove the login names in the comma-separated <users>\n" + "\t-h\t\tPrint the program's usage and exit\n" + "\t-i\t\tCreate a new empty RCS file\n" + "\t-k opt\t\tSet the keyword expansion mode to <opt>\n" + "\t-L\t\tEnable strict locking on the specified files\n" + "\t-M\t\tDisable mail warning about lock breaks\n" + "\t-U\t\tDisable strict locking on the specified files\n" + "\t-V\t\tPrint the program's version string and exit\n", + __progname); +} + + +/* + * rcs_main() + * + * Handler for the `rcs' program. + * Returns 0 on success, or >0 on error. + */ +int +rcs_main(int argc, char **argv) +{ + int i, ch, flags, kflag, lkmode; + char *oldfile, *alist, *comment, *elist, *unp, *sp; + mode_t fmode; + RCSFILE *file; + + kflag = lkmode = -1; + fmode = 0; + flags = RCS_RDWR; + oldfile = alist = comment = elist = NULL; + + cvs_log_init(LD_STD, 0); + + while ((ch = getopt(argc, argv, "A:a:b::c:e::hik:LMUV")) != -1) { + switch (ch) { + case 'A': + oldfile = optarg; + break; + case 'a': + alist = optarg; + break; + case 'c': + comment = optarg; + break; + case 'e': + elist = optarg; + break; + case 'h': + rcs_usage(); + exit(0); + case 'i': + flags |= RCS_CREATE; + break; + case 'k': + kflag = rcs_kflag_get(optarg); + if (RCS_KWEXP_INVAL(kflag)) { + cvs_log(LP_ERR, + "invalid keyword substitution mode `%s'", + optarg); + exit(1); + } + break; + case 'L': + if (lkmode == RCS_LOCK_LOOSE) + cvs_log(LP_WARN, "-U overriden by -L"); + lkmode = RCS_LOCK_STRICT; + break; + case 'M': + /* ignore for the moment */ + break; + case 'U': + if (lkmode == RCS_LOCK_STRICT) + cvs_log(LP_WARN, "-L overriden by -U"); + lkmode = RCS_LOCK_LOOSE; + break; + case 'V': + printf("%s\n", rcs_version); + exit(0); + default: + rcs_usage(); + exit(1); + } + } + + argc -= optind; + argv += optind; + if (argc == 0) { + cvs_log(LP_ERR, "no input file"); + exit(1); + } + + for (i = 0; i < argc; i++) { + printf("RCS file: %s\n", argv[0]); + file = rcs_open(argv[0], flags, fmode); + if (file == NULL) { + return (1); + } + + /* entries to add to the access list */ + if (alist != NULL) { + unp = alist; + do { + sp = strchr(unp, ','); + if (sp != NULL) + *(sp++) = '\0'; + + rcs_access_add(file, unp); + + unp = sp; + } while (sp != NULL); + } + + if (comment != NULL) + rcs_comment_set(file, comment); + + if (kflag != -1) + rcs_kwexp_set(file, kflag); + + if (lkmode != -1) + rcs_lock_setmode(file, lkmode); + + rcs_close(file); + printf("done\n"); + } + + return (0); +} |