X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/e7c67065c060d500eba8d073da9568db2c658aad..edb977215ba3ac0d64dc7208f67791afe11bb55d:/uidlist.c diff --git a/uidlist.c b/uidlist.c index 13f54d6c..b31b959e 100644 --- a/uidlist.c +++ b/uidlist.c @@ -33,10 +33,10 @@ #endif extern int verbose; +extern int am_root; extern int preserve_uid; extern int preserve_gid; extern int numeric_ids; -extern int am_root; struct idlist { struct idlist *next; @@ -79,7 +79,7 @@ static char *gid_to_name(gid_t gid) return NULL; } -static int map_uid(int id, char *name) +static uid_t map_uid(uid_t id, char *name) { uid_t uid; if (id != 0 && name_to_uid(name, &uid)) @@ -87,7 +87,7 @@ static int map_uid(int id, char *name) return id; } -static int map_gid(int id, char *name) +static gid_t map_gid(gid_t id, char *name) { gid_t gid; if (id != 0 && name_to_gid(name, &gid)) @@ -126,12 +126,10 @@ static int is_in_group(gid_t gid) char *gidbuf = new_array(char, ngroups*21+32); if (!gidbuf) out_of_memory("is_in_group"); - sprintf(gidbuf, "process has %d gid%s: ", - ngroups, ngroups == 1? "" : "s"); - pos = strlen(gidbuf); + pos = snprintf(gidbuf, 32, "process has %d gid%s: ", + ngroups, ngroups == 1? "" : "s"); for (n = 0; n < ngroups; n++) { - sprintf(gidbuf+pos, " %d", (int)gidset[n]); - pos += strlen(gidbuf+pos); + pos += snprintf(gidbuf+pos, 21, " %d", (int)gidset[n]); } rprintf(FINFO, "%s\n", gidbuf); free(gidbuf); @@ -157,37 +155,37 @@ static int is_in_group(gid_t gid) } /* Add a uid to the list of uids. Only called on receiving side. */ -static struct idlist *recv_add_uid(int id, char *name) +static uid_t recv_add_uid(uid_t id, char *name) { - int id2 = name ? map_uid(id, name) : id; + uid_t id2 = name ? map_uid(id, name) : id; struct idlist *node; - node = add_to_list(&uidlist, id, name, id2); + node = add_to_list(&uidlist, (int)id, name, (int)id2); if (verbose > 3) { rprintf(FINFO, "uid %d(%s) maps to %d\n", - id, name ? name : "", id2); + (int)id, name ? name : "", (int)id2); } - return node; + return id2; } /* Add a gid to the list of gids. Only called on receiving side. */ -static struct idlist *recv_add_gid(int id, char *name) +static gid_t recv_add_gid(gid_t id, char *name) { - int id2 = name ? map_gid(id, name) : id; + gid_t id2 = name ? map_gid(id, name) : id; struct idlist *node; if (!am_root && !is_in_group(id2)) id2 = GID_NONE; - node = add_to_list(&gidlist, id, name, id2); + node = add_to_list(&gidlist, (int)id, name, (int)id2); if (verbose > 3) { rprintf(FINFO, "gid %d(%s) maps to %d\n", - id, name ? name : "", id2); + (int)id, name ? name : "", (int)id2); } - return node; + return id2; } /* this function is a definate candidate for a faster algorithm */ @@ -230,8 +228,7 @@ static gid_t match_gid(gid_t gid) return last_out = (gid_t)list->id2; } - list = recv_add_gid(gid, NULL); - return last_out = list->id2; + return last_out = recv_add_gid(gid, NULL); } /* Add a uid to the list of uids. Only called on sending side. */ @@ -266,15 +263,11 @@ void add_gid(gid_t gid) add_to_list(&gidlist, (int)gid, gid_to_name(gid), 0); } - /* send a complete uid/gid mapping to the peer */ void send_uid_list(int f) { struct idlist *list; - if (numeric_ids) - return; - if (preserve_uid) { int len; /* we send sequences of uid/byte-length/name */ @@ -306,44 +299,51 @@ void send_uid_list(int f) } } +static uid_t recv_user_name(int f, uid_t uid) +{ + int len = read_byte(f); + char *name = new_array(char, len+1); + if (!name) + out_of_memory("recv_user_name"); + read_sbuf(f, name, len); + return recv_add_uid(uid, name); /* node keeps name's memory */ +} + +static gid_t recv_group_name(int f, gid_t gid) +{ + int len = read_byte(f); + char *name = new_array(char, len+1); + if (!name) + out_of_memory("recv_group_name"); + read_sbuf(f, name, len); + return recv_add_gid(gid, name); /* node keeps name's memory */ +} + /* recv a complete uid/gid mapping from the peer and map the uid/gid * in the file list to local names */ void recv_uid_list(int f, struct file_list *flist) { int id, i; - char *name; if (preserve_uid && !numeric_ids) { /* read the uid list */ - while ((id = read_int(f)) != 0) { - int len = read_byte(f); - name = new_array(char, len+1); - if (!name) - out_of_memory("recv_uid_list"); - read_sbuf(f, name, len); - recv_add_uid(id, name); /* node keeps name's memory */ - } + while ((id = read_int(f)) != 0) + recv_user_name(f, (uid_t)id); } if (preserve_gid && !numeric_ids) { /* read the gid list */ - while ((id = read_int(f)) != 0) { - int len = read_byte(f); - name = new_array(char, len+1); - if (!name) - out_of_memory("recv_uid_list"); - read_sbuf(f, name, len); - recv_add_gid(id, name); /* node keeps name's memory */ - } + while ((id = read_int(f)) != 0) + recv_group_name(f, (gid_t)id); } /* Now convert all the uids/gids from sender values to our values. */ if (am_root && preserve_uid && !numeric_ids) { for (i = 0; i < flist->count; i++) - flist->files[i]->uid = match_uid(flist->files[i]->uid); + F_UID(flist->files[i]) = match_uid(F_UID(flist->files[i])); } if (preserve_gid && (!am_root || !numeric_ids)) { for (i = 0; i < flist->count; i++) - flist->files[i]->gid = match_gid(flist->files[i]->gid); + F_GID(flist->files[i]) = match_gid(F_GID(flist->files[i])); } }