summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2005-04-15 15:46:22 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2005-04-15 15:46:22 +0000
commit19b75a1a690e40a7a022d348bb1329485a220608 (patch)
tree93872155e539765be66b471a54dce51563b52b71
parentcadd396a1affc48e3b21b474cc67cdbae1da3fbd (diff)
move rcs (and later on, clones of all the other rcs commands) out of the
cvs subdirectory; ok jfb joris
-rw-r--r--usr.bin/rcs/Makefile22
-rw-r--r--usr.bin/rcs/rcs.196
-rw-r--r--usr.bin/rcs/rcsprog.c220
3 files changed, 338 insertions, 0 deletions
diff --git a/usr.bin/rcs/Makefile b/usr.bin/rcs/Makefile
new file mode 100644
index 00000000000..dd617f41686
--- /dev/null
+++ b/usr.bin/rcs/Makefile
@@ -0,0 +1,22 @@
+# $OpenBSD: Makefile,v 1.1 2005/04/15 15:46:21 deraadt Exp $
+
+.PATH: ${.CURDIR}/../cvs
+
+PROG= rcs
+MAN= rcs.1
+
+SRCS= rcsprog.c buf.c log.c rcs.c rcsnum.c strtab.c
+CFLAGS+=-I${.CURDIR}/../cvs
+
+BINDIR= /usr/bin
+
+# Don't build the links until we actually support those commands
+#LINKS= ${BINDIR}/ci ${BINDIR}/co ${BINDIR}/rcsclean ${BINDIR}/rcsdiff
+
+CFLAGS+= -Wall
+CFLAGS+= -Wstrict-prototypes -Wmissing-prototypes
+CFLAGS+= -Wmissing-declarations
+CFLAGS+= -Wshadow -Wpointer-arith -Wcast-qual
+CFLAGS+= -Wsign-compare
+
+.include <bsd.prog.mk>
diff --git a/usr.bin/rcs/rcs.1 b/usr.bin/rcs/rcs.1
new file mode 100644
index 00000000000..42fbe4d092a
--- /dev/null
+++ b/usr.bin/rcs/rcs.1
@@ -0,0 +1,96 @@
+.\" $OpenBSD: rcs.1,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.
+.\"
+.Dd May 16, 2004
+.Dt RCS 1
+.Os
+.Sh NAME
+.Nm rcs
+.Nd RCS file management program
+.Sh SYNOPSIS
+.Nm
+.Op Fl hiLMUV
+.Op Fl a Ar users
+.Op Fl b Op Ar rev
+.Op Fl e Op Ar users
+.Ar file Op Ar ...
+.Sh DESCRIPTION
+The
+.Nm
+program is used to create RCS files or manipulate the contents of existing
+files.
+.Pp
+The following options are supported:
+.Bl -tag -width "-e usersXX"
+.It Fl a Ar users
+Add the usernames specified in the comma-separated list
+.Ar users
+to the access list of the RCS files.
+.It Fl e Op Ar users
+Remove the usernames specified in the comma-separated list
+.Ar users
+from the access list of the RCS files.
+If
+.Ar users
+is not specified, all users are removed from the access list.
+.It Fl h
+Display the program's usage and exit.
+.It Fl i
+Create the RCS files specified as arguments.
+Files created this way contain no revision.
+.It Fl L
+Enable strict locking on the RCS files.
+See
+.Xr rcsfile 5
+for more details on locking.
+.It Fl M
+Disable mail warnings when breaking a user's lock.
+Normally,
+.Nm
+will send a mail to the lock owner when his lock is removed by a call
+to
+.Nm
+.Fl u .
+This option is currently ignored.
+.It Fl U
+Disable strict locking on the RCS files.
+See
+.Xr rcsfile 5
+for more details on locking.
+.It Fl V
+Print the program's version string and exit.
+.El
+.Sh ENVIRONMENT
+.Bl -tag -width RCSINIT
+.It Ev RCSINIT
+If set, this variable should contain a list of space-delimited options that
+are prepended to the argument list.
+.El
+.Sh SEE ALSO
+.Xr ci 1 ,
+.Xr co 1 ,
+.Xr rcsclean 1 ,
+.Xr rcsdiff 1 ,
+.Xr rcsfile 5
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);
+}