OSDN Git Service

Initial revision
[uclinux-h8/uClibc.git] / libc / pwd_grp / initgroups.c
1 /*
2  * initgroups.c - This file is part of the libc-8086/grp package for ELKS,
3  * Copyright (C) 1995, 1996 Nat Friedman <ndf@linux.mit.edu>.
4  * 
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Library General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Library General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Library General Public
16  *  License along with this library; if not, write to the Free
17  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  *
19  */
20
21 #include <unistd.h>
22 #include <string.h>
23 #include <fcntl.h>
24 #include <grp.h>
25 #include "config.h"
26
27 int
28 initgroups(__const char * user, gid_t gid)
29 {
30   register struct group * group;
31 #ifndef GR_DYNAMIC_GROUP_LIST
32   gid_t group_list[GR_MAX_GROUPS];
33 #else
34   gid_t * group_list=NULL;
35 #endif
36   register char ** tmp_mem;
37   int num_groups;
38   int grp_fd;
39
40
41   if ((grp_fd=open("/etc/group", O_RDONLY))<0)
42     return -1;
43
44   num_groups=0;
45 #ifdef GR_DYNAMIC_GROUP_LIST
46   group_list=(gid_t *) realloc(group_list, 1);
47 #endif
48   group_list[num_groups]=gid;
49 #ifndef GR_DYNAMIC_GROUP_LIST
50   while (num_groups<GR_MAX_GROUPS &&
51          (group=__getgrent(grp_fd))!=NULL)
52 #else
53   while ((group=__getgrent(grp_fd))!=NULL)
54 #endif      
55     {
56       if (group->gr_gid!=gid);
57         {
58           tmp_mem=group->gr_mem;
59           while(*tmp_mem!=NULL)
60             {
61               if (!strcmp(*tmp_mem, user))
62                 {
63                   num_groups++;
64 #ifdef GR_DYNAMIC_GROUP_LIST  
65                   group_list=(gid_t *)realloc(group_list,
66                                               num_groups*sizeof(gid_t *));
67 #endif            
68                   group_list[num_groups]=group->gr_gid;
69                 }
70               tmp_mem++;
71             }
72         }
73     }
74   close(grp_fd);
75   return setgroups(num_groups, group_list);
76 }
77
78
79
80