summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2004-04-06 22:23:05 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2004-04-06 22:23:05 +0000
commit3051e6f40d68f41eaf1225fdc1e5ac2847cccc4d (patch)
treeaf2079537d8f61299eafb58abc7621edc18cc2d2
parentfed70a1e8620c489408713eaa8402cd6dd1f54d2 (diff)
Set mode and ownership when renaming file -> file.0 like we do when
moving the file across filesystems or renaming from file.0 -> file.1. Problem noticed by mpech@
-rw-r--r--usr.bin/newsyslog/newsyslog.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/usr.bin/newsyslog/newsyslog.c b/usr.bin/newsyslog/newsyslog.c
index 92004d1f9bc..ded21b1e6c6 100644
--- a/usr.bin/newsyslog/newsyslog.c
+++ b/usr.bin/newsyslog/newsyslog.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: newsyslog.c,v 1.77 2004/04/05 19:41:50 millert Exp $ */
+/* $OpenBSD: newsyslog.c,v 1.78 2004/04/06 22:23:04 millert Exp $ */
/*
* Copyright (c) 1999, 2002, 2003 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -14,6 +14,7 @@
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
* Sponsored in part by the Defense Advanced Research Projects
* Agency (DARPA) and Air Force Research Laboratory, Air Force
* Materiel Command, USAF, under agreement number F39502-99-1-0512.
@@ -71,7 +72,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$OpenBSD: newsyslog.c,v 1.77 2004/04/05 19:41:50 millert Exp $";
+static const char rcsid[] = "$OpenBSD: newsyslog.c,v 1.78 2004/04/06 22:23:04 millert Exp $";
#endif /* not lint */
#ifndef CONF
@@ -829,9 +830,13 @@ dotrim(struct conf_entry *ent)
warn("can't rm %s", ent->log);
} else {
(void)snprintf(file1, sizeof(file1), "%s.0", oldlog);
- if (noaction)
+ if (noaction) {
printf("\tmv %s to %s\n", ent->log, file1);
- else if (movefile(ent->log, file1, ent->uid, ent->gid,
+ printf("\tchmod %o %s\n", ent->permissions, file1);
+ if (ent->uid != (uid_t)-1 || ent->gid != (gid_t)-1)
+ printf("\tchown %u:%u %s\n",
+ ent->uid, ent->gid, file1);
+ } else if (movefile(ent->log, file1, ent->uid, ent->gid,
ent->permissions))
warn("can't mv %s to %s", ent->log, file1);
}
@@ -1335,9 +1340,15 @@ movefile(char *from, char *to, uid_t owner_uid, gid_t group_gid, mode_t perm)
int i;
/* try rename(2) first */
- i = rename(from, to);
- if (i == 0 || errno != EXDEV)
- return (i);
+ if (rename(from, to) == 0) {
+ if (chmod(to, perm))
+ warn("can't chmod %s", to);
+ if (owner_uid != (uid_t)-1 || group_gid != (gid_t)-1)
+ if (chown(to, owner_uid, group_gid))
+ warn("can't chown %s", to);
+ return (0);
+ } else if (errno != EXDEV)
+ return (-1);
/* different filesystem, have to copy the file */
if ((src = fopen(from, "r")) == NULL)