*
* Copyright (C) 1996 Andrew Tridgell
* Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2004-2007 Wayne Davison
+ * Copyright (C) 2004-2008 Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3 as
- * published by the Free Software Foundation.
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
#include "rsync.h"
#include "io.h"
-extern int verbose;
extern int am_root;
extern int preserve_uid;
extern int preserve_gid;
struct idlist {
struct idlist *next;
- char *name;
+ const char *name;
id_t id, id2;
uint16 flags;
};
static struct idlist *uidlist;
static struct idlist *gidlist;
-static struct idlist *add_to_list(struct idlist **root, id_t id, char *name,
+static struct idlist *add_to_list(struct idlist **root, id_t id, const char *name,
id_t id2, uint16 flags)
{
struct idlist *node = new(struct idlist);
}
/* turn a uid into a user name */
-static char *uid_to_name(uid_t uid)
+static const char *uid_to_name(uid_t uid)
{
struct passwd *pass = getpwuid(uid);
if (pass)
}
/* turn a gid into a group name */
-static char *gid_to_name(gid_t gid)
+static const char *gid_to_name(gid_t gid)
{
struct group *grp = getgrgid(gid);
if (grp)
return NULL;
}
-static uid_t map_uid(uid_t id, char *name)
+static uid_t map_uid(uid_t id, const char *name)
{
uid_t uid;
if (id != 0 && name_to_uid(name, &uid))
return id;
}
-static gid_t map_gid(gid_t id, char *name)
+static gid_t map_gid(gid_t id, const char *name)
{
gid_t gid;
if (id != 0 && name_to_gid(name, &gid))
}
if (n == ngroups)
gidset[ngroups++] = mygid;
- if (verbose > 3) {
+ if (DEBUG_GTE(OWN, 2)) {
int pos;
char *gidbuf = new_array(char, ngroups*21+32);
if (!gidbuf)
static gid_t mygid = GID_NONE;
if (mygid == GID_NONE) {
mygid = MY_GID();
- if (verbose > 3)
+ if (DEBUG_GTE(OWN, 2))
rprintf(FINFO, "process has gid %u\n", (unsigned)mygid);
}
return gid == mygid;
}
/* Add a uid to the list of uids. Only called on receiving side. */
-static struct idlist *recv_add_uid(uid_t id, char *name)
+static struct idlist *recv_add_uid(uid_t id, const char *name)
{
uid_t id2 = name ? map_uid(id, name) : id;
struct idlist *node;
node = add_to_list(&uidlist, id, name, id2, 0);
- if (verbose > 3) {
+ if (DEBUG_GTE(OWN, 2)) {
rprintf(FINFO, "uid %u(%s) maps to %u\n",
(unsigned)id, name ? name : "", (unsigned)id2);
}
}
/* Add a gid to the list of gids. Only called on receiving side. */
-static struct idlist *recv_add_gid(gid_t id, char *name)
+static struct idlist *recv_add_gid(gid_t id, const char *name)
{
gid_t id2 = name ? map_gid(id, name) : id;
struct idlist *node;
node = add_to_list(&gidlist, id, name, id2,
!am_root && !is_in_group(id2) ? FLAG_SKIP_GROUP : 0);
- if (verbose > 3) {
+ if (DEBUG_GTE(OWN, 2)) {
rprintf(FINFO, "gid %u(%s) maps to %u\n",
(unsigned)id, name ? name : "", (unsigned)id2);
}
}
/* Add a uid to the list of uids. Only called on sending side. */
-char *add_uid(uid_t uid)
+const char *add_uid(uid_t uid)
{
struct idlist *list;
struct idlist *node;
}
/* Add a gid to the list of gids. Only called on sending side. */
-char *add_gid(gid_t gid)
+const char *add_gid(gid_t gid)
{
struct idlist *list;
struct idlist *node;
if (!name)
out_of_memory("recv_user_name");
read_sbuf(f, name, len);
+ if (numeric_ids < 0) {
+ free(name);
+ name = NULL;
+ }
node = recv_add_uid(uid, name); /* node keeps name's memory */
return node->id2;
}
if (!name)
out_of_memory("recv_group_name");
read_sbuf(f, name, len);
+ if (numeric_ids < 0) {
+ free(name);
+ name = NULL;
+ }
node = recv_add_gid(gid, name); /* node keeps name's memory */
if (flags_ptr && node->flags & FLAG_SKIP_GROUP)
*flags_ptr |= FLAG_SKIP_GROUP;
id_t id;
int i;
- if ((preserve_uid || preserve_acls) && !numeric_ids) {
+ if ((preserve_uid || preserve_acls) && numeric_ids <= 0) {
/* read the uid list */
while ((id = read_varint30(f)) != 0)
recv_user_name(f, id);
}
- if ((preserve_gid || preserve_acls) && !numeric_ids) {
+ if ((preserve_gid || preserve_acls) && numeric_ids <= 0) {
/* read the gid list */
while ((id = read_varint30(f)) != 0)
recv_group_name(f, id, NULL);
match_acl_ids();
#endif
if (am_root && preserve_uid && !numeric_ids) {
- for (i = 0; i < flist->count; i++)
+ for (i = 0; i < flist->used; i++)
F_OWNER(flist->files[i]) = match_uid(F_OWNER(flist->files[i]));
}
if (preserve_gid && (!am_root || !numeric_ids)) {
- for (i = 0; i < flist->count; i++) {
+ for (i = 0; i < flist->used; i++) {
F_GROUP(flist->files[i]) = match_gid(F_GROUP(flist->files[i]),
&flist->files[i]->flags);
}