Replace usage of getgrouplist() with

getgrent() and friends.  getgrouplist is not posix and not
on several platforms including cygwin.
merge-requests/1/head
Chris Bagwell 2009-01-31 02:18:41 +00:00
rodzic b52b0c0c14
commit 907cbe7ac6
2 zmienionych plików z 48 dodań i 21 usunięć

Wyświetl plik

@ -1,4 +1,9 @@
2009-01-26 Chris Bagwell <cbagwell-guest at users.alioth.debian.org> 2009-01-30 Chris Bagwell <cbagwell-guest at users.alioth.debian.org>
* frontend/saned.c: Replace usage of getgrouplist() with
getgrent() and friends. getgrouplist is not posix and not
on several platforms including cygwin.
2009-01-29 Chris Bagwell <cbagwell-guest at users.alioth.debian.org>
* backend/epson2.c backend/pixma_bjnp.c, include/sane/sanei_backend.h, * backend/epson2.c backend/pixma_bjnp.c, include/sane/sanei_backend.h,
sanei/sanei_tcp.c, sanie/sanei_udp.c: Improve portablity by sanei/sanei_tcp.c, sanie/sanei_udp.c: Improve portablity by
removing usage of MSG_WAITALL since not all platforms support removing usage of MSG_WAITALL since not all platforms support
@ -6,7 +11,7 @@
usage of MSG_NOTWAIT to use fcntl() function as needed as well. usage of MSG_NOTWAIT to use fcntl() function as needed as well.
* configure.in, lib/Makefile.in, lib/strcasestr.c: Add internal * configure.in, lib/Makefile.in, lib/strcasestr.c: Add internal
strcasestr() for platforms missing it (cygwin). strcasestr() for platforms missing it (cygwin).
* pixma_common.c: My source match header prototype for picky * pixma_common.c: Make source match header prototype for picky
compilers (cygwin). compilers (cygwin).
* backend/umax_pp_mid.c: Allow BACKEND_NAME to be filename * backend/umax_pp_mid.c: Allow BACKEND_NAME to be filename
yet debug to be SANE_DEBUG_UMAX_PP to match man page. yet debug to be SANE_DEBUG_UMAX_PP to match man page.

Wyświetl plik

@ -1656,8 +1656,8 @@ do_scan (Wire * w, int h, int data_fd)
if (be_fd >= 0 && errno == EBADF) if (be_fd >= 0 && errno == EBADF)
{ {
/* This normally happens when a backend closes a select /* This normally happens when a backend closes a select
filedescriptor when reaching the end of file. So filedescriptor when reaching the end of file. So
pass back this status to the client: */ pass back this status to the client: */
FD_CLR (be_fd, &rd_mask); FD_CLR (be_fd, &rd_mask);
be_fd = -1; be_fd = -1;
/* only set status_dirty if EOF hasn't been already detected */ /* only set status_dirty if EOF hasn't been already detected */
@ -2866,7 +2866,8 @@ run_standalone (int argc, char **argv)
uid_t runas_uid = 0; uid_t runas_uid = 0;
gid_t runas_gid = 0; gid_t runas_gid = 0;
struct passwd *pwent; struct passwd *pwent;
gid_t *grplist; gid_t *grplist = NULL;
struct group *grp;
int ngroups = 0; int ngroups = 0;
FILE *pidfile; FILE *pidfile;
@ -2888,8 +2889,7 @@ run_standalone (int argc, char **argv)
runas_gid = pwent->pw_gid; runas_gid = pwent->pw_gid;
/* Get group list for runas_uid */ /* Get group list for runas_uid */
ngroups = 10; grplist = (gid_t *)malloc(sizeof(gid_t));
grplist = (gid_t *) malloc (ngroups * sizeof(gid_t));
if (grplist == NULL) if (grplist == NULL)
{ {
@ -2898,25 +2898,47 @@ run_standalone (int argc, char **argv)
exit (1); exit (1);
} }
ret = getgrouplist (argv[2], runas_gid, grplist, &ngroups); ngroups = 1;
if (ret < 0) grplist[0] = runas_gid;
setgrent();
while ((grp = getgrent()) != NULL)
{ {
grplist = (gid_t *) realloc (grplist, ngroups * sizeof(gid_t)); int i = 0;
if (grplist == NULL)
/* Already added current group */
if (grp->gr_gid == runas_gid)
continue;
while (grp->gr_mem[i])
{ {
DBG (DBG_ERR, "FATAL ERROR: cannot reallocate memory for group list\n"); if (strcmp(grp->gr_mem[i], argv[2]) == 0)
{
int need_to_add = 1, j;
exit (1); /* Make sure its not already in list */
} for (j = 0; j < ngroups; j++)
{
if (grp->gr_gid == grplist[i])
need_to_add = 0;
}
if (need_to_add)
{
grplist = (gid_t *)realloc(grplist,
sizeof(gid_t)*ngroups+1);
if (grplist == NULL)
{
DBG (DBG_ERR, "FATAL ERROR: cannot reallocate memory for group list\n");
ret = getgrouplist (argv[2], runas_gid, grplist, &ngroups); exit (1);
if (ret < 0) }
{ grplist[ngroups++] = grp->gr_gid;
DBG (DBG_ERR, "FATAL ERROR: getgrouplist() failed again\n"); }
}
exit (1); i++;
} }
} }
endgrent();
} }
DBG (DBG_MSG, "run_standalone: daemonizing now\n"); DBG (DBG_MSG, "run_standalone: daemonizing now\n");