X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/670d8abf801d534578751876c796ef893ec2075a..ade7292aeea55eb7e9d59fe36cdba85ae020782f:/uidlist.c diff --git a/uidlist.c b/uidlist.c index 170b9e62..27e7046e 100644 --- a/uidlist.c +++ b/uidlist.c @@ -1,17 +1,17 @@ -/* +/* Copyright (C) Andrew Tridgell 1996 Copyright (C) Paul Mackerras 1996 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 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 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -25,7 +25,10 @@ #include "rsync.h" -#ifdef GETGROUPS_T +#ifdef HAVE_GETGROUPS +# if !defined(GETGROUPS_T) +# define GETGROUPS_T gid_t +# endif # ifndef NGROUPS_MAX /* It ought to be defined, but just in case. */ # define NGROUPS_MAX 32 @@ -92,32 +95,9 @@ static int map_gid(int id, char *name) return id; } -/* this function is a definate candidate for a faster algorithm */ -static uid_t match_uid(uid_t uid) -{ - static uid_t last_in, last_out; - struct idlist *list = uidlist; - - if (uid == last_in) - return last_out; - - last_in = uid; - - while (list) { - if (list->id == (int)uid) { - last_out = (uid_t)list->id2; - return last_out; - } - list = list->next; - } - - last_out = uid; - return last_out; -} - static int is_in_group(gid_t gid) { -#ifdef GETGROUPS_T +#ifdef HAVE_GETGROUPS static gid_t last_in = GID_NONE, last_out; static int ngroups = -2; static GETGROUPS_T *gidset; @@ -127,10 +107,8 @@ static int is_in_group(gid_t gid) return last_out; if (ngroups < -1) { gid_t mygid = MY_GID(); - ngroups = getgroups(0, 0); - /* If that didn't work, perhaps 0 isn't treated specially? */ - if (ngroups <= 0) - ngroups = NGROUPS_MAX; + if ((ngroups = getgroups(0, 0)) < 0) + ngroups = 0; gidset = new_array(GETGROUPS_T, ngroups+1); if (ngroups > 0) ngroups = getgroups(ngroups, gidset); @@ -173,6 +151,29 @@ static int is_in_group(gid_t gid) #endif } +/* this function is a definate candidate for a faster algorithm */ +static uid_t match_uid(uid_t uid) +{ + static uid_t last_in, last_out; + struct idlist *list = uidlist; + + if (uid == last_in) + return last_out; + + last_in = uid; + + while (list) { + if (list->id == (int)uid) { + last_out = (uid_t)list->id2; + return last_out; + } + list = list->next; + } + + last_out = uid; + return last_out; +} + static gid_t match_gid(gid_t gid) { static gid_t last_in = GID_NONE, last_out = GID_NONE; @@ -191,7 +192,7 @@ static gid_t match_gid(gid_t gid) list = list->next; } - if (am_root) + if (am_root || is_in_group(gid)) last_out = gid; else last_out = GID_NONE;