=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/rsync/flist.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- src/usr.bin/rsync/flist.c 2019/02/12 19:02:06 1.7 +++ src/usr.bin/rsync/flist.c 2019/02/12 19:04:52 1.8 @@ -1,4 +1,4 @@ -/* $Id: flist.c,v 1.7 2019/02/12 19:02:06 benno Exp $ */ +/* $Id: flist.c,v 1.8 2019/02/12 19:04:52 benno Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -50,110 +49,6 @@ #define FLIST_TIME_SAME 0x0080 /* time is repeat */ /* - * Combination of name and numeric id for groups and users. - */ -struct ident { - int32_t id; /* the gid_t or uid_t */ - int32_t mapped; /* if receiving, the mapped gid */ - char *name; /* resolved name */ -}; - -/* - * Free a list of struct ident previously allocated with flist_gid_add(). - * Does nothing if the pointer is NULL. - */ -static void -flist_ident_free(struct ident *p, size_t sz) -{ - size_t i; - - if (NULL == p) - return; - for (i = 0; i < sz; i++) - free(p[i].name); - free(p); -} - -/* - * Given a list of groups from the remote host, fill in our local - * identifiers of the same names. - * Use the remote numeric identifier if we can't find the group OR the - * group has identifier zero. - */ -static void -flist_gid_remap(struct sess *sess, struct ident *gids, size_t gidsz) -{ - size_t i; - struct group *grp; - - for (i = 0; i < gidsz; i++) { - if (NULL == (grp = getgrnam(gids[i].name))) - gids[i].mapped = gids[i].id; - else if (0 == grp->gr_gid) - gids[i].mapped = gids[i].id; - else - gids[i].mapped = grp->gr_gid; - LOG4(sess, "remapped group %s: %" PRId32 " -> %" PRId32, - gids[i].name, gids[i].id, gids[i].mapped); - } -} - -/* - * If "gid" is not part of the list of known groups, add it. - * This also verifies that the group name isn't too long. - * Return zero on failure, non-zero on success. - */ -static int -flist_gid_add(struct sess *sess, struct ident **gids, size_t *gidsz, gid_t gid) -{ - struct group *grp; - size_t i, sz; - void *pp; - - for (i = 0; i < *gidsz; i++) - if ((*gids)[i].id == (int32_t)gid) - return 1; - - /* - * Look us up in /etc/group. - * Make sure that the group name length is sane: we transmit it - * using a single byte. - */ - - assert(i == *gidsz); - if (NULL == (grp = getgrgid(gid))) { - ERR(sess, "%u: unknown gid", gid); - return 0; - } else if ((sz = strlen(grp->gr_name)) > UINT8_MAX) { - ERRX(sess, "%u: group name too long: %s", gid, grp->gr_name); - return 0; - } else if (0 == sz) { - ERRX(sess, "%u: group name zero-length", gid); - return 0; - } - - /* Add the group to the array. */ - - pp = reallocarray(*gids, *gidsz + 1, sizeof(struct ident)); - if (NULL == pp) { - ERR(sess, "reallocarray"); - return 0; - } - *gids = pp; - (*gids)[*gidsz].id = gid; - (*gids)[*gidsz].name = strdup(grp->gr_name); - if (NULL == (*gids)[*gidsz].name) { - ERR(sess, "strdup"); - return 0; - } - - LOG4(sess, "adding group to list: %s (%u)", - (*gids)[*gidsz].name, (*gids)[*gidsz].id); - (*gidsz)++; - return 1; -} - -/* * Requied way to sort a filename list. */ static int @@ -337,42 +232,6 @@ } /* - * Send a list of struct ident. - * See flist_recv_ident(). - * We should only do this if we're preserving gids/uids. - * Return zero on failure, non-zero on success. - */ -static int -flist_send_ident(struct sess *sess, - int fd, const struct ident *ids, size_t idsz) -{ - size_t i, sz; - - for (i = 0; i < idsz; i++) { - assert(NULL != ids[i].name); - sz = strlen(ids[i].name); - assert(sz > 0 && sz <= UINT8_MAX); - if (!io_write_int(sess, fd, ids[i].id)) { - ERRX1(sess, "io_write_int"); - return 0; - } else if (!io_write_byte(sess, fd, sz)) { - ERRX1(sess, "io_write_byte"); - return 0; - } else if (!io_write_buf(sess, fd, ids[i].name, sz)) { - ERRX1(sess, "io_write_byte"); - return 0; - } - } - - if (!io_write_int(sess, fd, 0)) { - ERRX1(sess, "io_write_int"); - return 0; - } - - return 1; -} - -/* * Serialise our file list (which may be zero-length) to the wire. * Makes sure that the receiver isn't going to block on sending us * return messages on the log channel. @@ -457,8 +316,8 @@ ERRX1(sess, "io_write_int"); goto out; } - if (!flist_gid_add(sess, &gids, &gidsz, f->st.gid)) { - ERRX1(sess, "flist_gid_add"); + if (!idents_gid_add(sess, &gids, &gidsz, f->st.gid)) { + ERRX1(sess, "idents_gid_add"); goto out; } } @@ -494,15 +353,15 @@ if (sess->opts->preserve_gids) { LOG2(sess, "sending gid list: %zu", gidsz); - if (!flist_send_ident(sess, fdout, gids, gidsz)) { - ERRX1(sess, "flist_send_ident"); + if (!idents_send(sess, fdout, gids, gidsz)) { + ERRX1(sess, "idents_send"); goto out; } } rc = 1; out: - flist_ident_free(gids, gidsz); + idents_free(gids, gidsz); return rc; } @@ -671,55 +530,6 @@ } /* - * Receive a list of struct ident. - * See flist_send_ident(). - * We should only do this if we're preserving gids/uids. - * Return zero on failure, non-zero on success. - */ -static int -flist_recv_ident(struct sess *sess, - int fd, struct ident **ids, size_t *idsz) -{ - int32_t id; - uint8_t sz; - void *pp; - - for (;;) { - if (!io_read_int(sess, fd, &id)) { - ERRX1(sess, "io_read_int"); - return 0; - } else if (0 == id) - break; - - pp = reallocarray(*ids, - *idsz + 1, sizeof(struct ident)); - if (NULL == pp) { - ERR(sess, "reallocarray"); - return 0; - } - *ids = pp; - memset(&(*ids)[*idsz], 0, sizeof(struct ident)); - if (!io_read_byte(sess, fd, &sz)) { - ERRX1(sess, "io_read_byte"); - return 0; - } - (*ids)[*idsz].id = id; - (*ids)[*idsz].name = calloc(sz + 1, 1); - if (NULL == (*ids)[*idsz].name) { - ERR(sess, "calloc"); - return 0; - } - if (!io_read_buf(sess, fd, (*ids)[*idsz].name, sz)) { - ERRX1(sess, "io_read_buf"); - return 0; - } - (*idsz)++; - } - - return 1; -} - -/* * Receive a file list from the wire, filling in length "sz" (which may * possibly be zero) and list "flp" on success. * Return zero on failure, non-zero on success. @@ -851,12 +661,12 @@ */ if (sess->opts->preserve_gids) { - if (!flist_recv_ident(sess, fd, &gids, &gidsz)) { - ERRX1(sess, "flist_recv_ident"); + if (!idents_recv(sess, fd, &gids, &gidsz)) { + ERRX1(sess, "idents_recv"); goto out; } LOG2(sess, "received gid list: %zu", gidsz); - flist_gid_remap(sess, gids, gidsz); + idents_gid_remap(sess, gids, gidsz); } /* Remember to order the received list. */ @@ -879,11 +689,11 @@ } } - flist_ident_free(gids, gidsz); + idents_free(gids, gidsz); return 1; out: flist_free(fl, flsz); - flist_ident_free(gids, gidsz); + idents_free(gids, gidsz); *sz = 0; *flp = NULL; return 0;