summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2006-11-09 21:47:53 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2006-11-09 21:47:53 +0000
commit00607485a32dc10751be769dd226f96c51d1c587 (patch)
tree9f120b18761aefd026c9be1ee0d6f40c6a8d57e9 /usr.bin
parent944dbc8ce0241ebc542b6a5cea01de250904fbf1 (diff)
Simplify stripping of write bits from file mode.
Add support for reusing the checkin message for multiple files, ala GNU Fix the message when you abort a checkout and the file was not writable. OK joris@ niallo@
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/rcs/ci.c30
-rw-r--r--usr.bin/rcs/co.c25
-rw-r--r--usr.bin/rcs/rcsutil.c23
-rw-r--r--usr.bin/rcs/rcsutil.h4
4 files changed, 40 insertions, 42 deletions
diff --git a/usr.bin/rcs/ci.c b/usr.bin/rcs/ci.c
index 17106f3062b..143d6061476 100644
--- a/usr.bin/rcs/ci.c
+++ b/usr.bin/rcs/ci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ci.c,v 1.188 2006/09/27 06:26:35 ray Exp $ */
+/* $OpenBSD: ci.c,v 1.189 2006/11/09 21:47:52 millert Exp $ */
/*
* Copyright (c) 2005, 2006 Niall O'Higgins <niallo@openbsd.org>
* All rights reserved.
@@ -499,9 +499,19 @@ checkin_update(struct checkin_params *pb)
}
/* If no log message specified, get it interactively. */
- if (pb->flags & INTERACTIVE)
- pb->rcs_msg = checkin_getlogmsg(pb->frev, pb->newrev,
- pb->flags);
+ if (pb->flags & INTERACTIVE) {
+ if (pb->rcs_msg != NULL) {
+ fprintf(stderr,
+ "reuse log message of previous file? [yn](y): ");
+ if (rcs_yesno('y') != 'y') {
+ xfree(pb->rcs_msg);
+ pb->rcs_msg = NULL;
+ }
+ }
+ if (pb->rcs_msg == NULL)
+ pb->rcs_msg = checkin_getlogmsg(pb->frev, pb->newrev,
+ pb->flags);
+ }
if (rcs_lock_remove(pb->file, pb->username, pb->frev) < 0) {
if (rcs_errno != RCS_ERR_NOENT)
@@ -551,8 +561,7 @@ checkin_update(struct checkin_params *pb)
err(1, "%s", pb->filename);
/* Strip all the write bits */
- pb->file->rf_mode = st.st_mode &
- (S_IXUSR|S_IXGRP|S_IXOTH|S_IRUSR|S_IRGRP|S_IROTH);
+ pb->file->rf_mode = st.st_mode & ~(S_IWUSR|S_IWGRP|S_IWOTH);
(void)close(workfile_fd);
(void)unlink(pb->filename);
@@ -565,12 +574,6 @@ checkin_update(struct checkin_params *pb)
!(pb->flags & CI_DEFAULT))
checkout_rev(pb->file, pb->newrev, pb->filename, pb->flags,
pb->username, pb->author, NULL, NULL);
-
- if (pb->flags & INTERACTIVE) {
- xfree(pb->rcs_msg);
- pb->rcs_msg = NULL;
- }
-
out:
return (0);
@@ -676,8 +679,7 @@ skipdesc:
err(1, "%s", pb->filename);
/* Strip all the write bits */
- pb->file->rf_mode = st.st_mode &
- (S_IXUSR|S_IXGRP|S_IXOTH|S_IRUSR|S_IRGRP|S_IROTH);
+ pb->file->rf_mode = st.st_mode & ~(S_IWUSR|S_IWGRP|S_IWOTH);
(void)close(workfile_fd);
(void)unlink(pb->filename);
diff --git a/usr.bin/rcs/co.c b/usr.bin/rcs/co.c
index ec44738c35f..9e9e07caf31 100644
--- a/usr.bin/rcs/co.c
+++ b/usr.bin/rcs/co.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: co.c,v 1.98 2006/10/12 17:20:12 niallo Exp $ */
+/* $OpenBSD: co.c,v 1.99 2006/11/09 21:47:52 millert Exp $ */
/*
* Copyright (c) 2005 Joris Vink <joris@openbsd.org>
* All rights reserved.
@@ -235,7 +235,7 @@ checkout_rev(RCSFILE *file, RCSNUM *frev, const char *dst, int flags,
u_int i;
int fd, lcount;
char buf[16];
- mode_t mode = 0444;
+ mode_t mode = DEFFILEMODE;
struct stat st;
struct rcs_delta *rdp;
struct rcs_lock *lkp;
@@ -363,12 +363,8 @@ checkout_rev(RCSFILE *file, RCSNUM *frev, const char *dst, int flags,
}
}
- /* Strip all write bits from mode */
- if (file->rf_fd != -1) {
- mode = st.st_mode &
- (S_IXUSR|S_IXGRP|S_IXOTH|S_IRUSR|S_IRGRP|S_IROTH);
- }
-
+ /* File should only be writable by owner. */
+ mode &= ~(S_IWGRP|S_IWOTH);
mode |= S_IWUSR;
if (file->rf_ndelta != 0) {
@@ -385,10 +381,7 @@ checkout_rev(RCSFILE *file, RCSNUM *frev, const char *dst, int flags,
}
/* Strip all write bits from mode */
- if (file->rf_fd != -1) {
- mode = st.st_mode &
- (S_IXUSR|S_IXGRP|S_IXOTH|S_IRUSR|S_IRGRP|S_IROTH);
- }
+ mode &= ~(S_IWUSR|S_IWGRP|S_IWOTH);
if (file->rf_ndelta != 0) {
if (!(flags & QUIET) && !(flags & NEWFILE) &&
@@ -435,11 +428,11 @@ checkout_rev(RCSFILE *file, RCSNUM *frev, const char *dst, int flags,
(getuid() == st.st_uid) ? "" :
", and you do not own it");
(void)fprintf(stderr, "remove it? [ny](n): ");
- /* default is n */
- if (rcs_yesno() == -1) {
+ if (rcs_yesno('n') == 'n') {
if (!(flags & QUIET) && isatty(STDIN_FILENO))
- warnx("writable %s exists; "
- "checkout aborted", dst);
+ warnx("%s%s exists; checkout aborted",
+ (st.st_mode & (S_IWUSR|S_IWGRP|S_IWOTH)) ?
+ "writable " : "", dst);
else
warnx("checkout aborted");
return (-1);
diff --git a/usr.bin/rcs/rcsutil.c b/usr.bin/rcs/rcsutil.c
index 403b5abad55..98b7c8741f2 100644
--- a/usr.bin/rcs/rcsutil.c
+++ b/usr.bin/rcs/rcsutil.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rcsutil.c,v 1.22 2006/10/12 17:20:12 niallo Exp $ */
+/* $OpenBSD: rcsutil.c,v 1.23 2006/11/09 21:47:52 millert Exp $ */
/*
* Copyright (c) 2005, 2006 Joris Vink <joris@openbsd.org>
* Copyright (c) 2006 Xavier Santolaria <xsa@openbsd.org>
@@ -562,24 +562,27 @@ rcs_patchfile(BUF *data, BUF *patch,
/*
* rcs_yesno()
*
- * Read from standart input for `y' or `Y' character.
- * Returns 0 on success, or -1 on failure.
+ * Read a char from standard input, returns defc if the
+ * user enters an equivalent to defc, else whatever char
+ * was entered. Converts input to lower case.
*/
int
-rcs_yesno(void)
+rcs_yesno(int defc)
{
int c, ret;
- ret = 0;
-
fflush(stderr);
fflush(stdout);
- if ((c = getchar()) != 'y' && c != 'Y')
- ret = -1;
+ if (isalpha(c = getchar()))
+ c = tolower(c);
+ if (c == defc || c == '\n' || (c == EOF && feof(stdin)))
+ ret = defc;
else
- while (c != EOF && c != '\n')
- c = getchar();
+ ret = c;
+
+ while (c != EOF && c != '\n')
+ c = getchar();
return (ret);
}
diff --git a/usr.bin/rcs/rcsutil.h b/usr.bin/rcs/rcsutil.h
index d65e8a4f319..647bafd9917 100644
--- a/usr.bin/rcs/rcsutil.h
+++ b/usr.bin/rcs/rcsutil.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: rcsutil.h,v 1.8 2006/08/16 07:39:15 ray Exp $ */
+/* $OpenBSD: rcsutil.h,v 1.9 2006/11/09 21:47:52 millert Exp $ */
/*
* Copyright (c) 2006 Xavier Santolaria <xsa@openbsd.org>
* All rights reserved.
@@ -64,7 +64,7 @@ BUF *rcs_patchfile(BUF *, BUF *,
int (*p)(struct rcs_lines *, struct rcs_lines *));
struct rcs_lines *rcs_splitlines(BUF *);
void rcs_freelines(struct rcs_lines *);
-int rcs_yesno(void);
+int rcs_yesno(int);
struct rcs_argvector *rcs_strsplit(const char *, const char *);
void rcs_argv_destroy(struct rcs_argvector *);