</variablelist>
<para>
- Since a user can be be specified both by username as well as one or
- more usergroups, it is possible that several configuration lines
- enable that user to create network interfaces. In such cases, any
- interfaces create are counted towards the quotas of the user or group
- in the order in which they appear in the file. If the quota of one
- line is full, the rest will be parsed until one is found or the end of
+ Since a user can be be specified both by username as well as one or
+ more usergroups, it is possible that several configuration lines
+ enable that user to create network interfaces. In such cases, any
+ interfaces create are counted towards the quotas of the user or group
+ in the order in which they appear in the file. If the quota of one
+ line is full, the rest will be parsed until one is found or the end of
the file.
</para>
</refsect2>
return pwd->pw_name;
}
+static void free_groupnames(char **groupnames)
+{
+ char **group;
+ for (group=groupnames; group != NULL; group++)
+ free(*group);
+ free(groupnames);
+}
+
static char **get_groupnames(void)
{
int ngroups;
gid_t *group_ids;
- int ret, i, j;
+ int ret, i;
char **groupnames;
struct group *gr;
ngroups = getgroups(0, NULL);
if (ngroups == -1) {
- fprintf(stderr, "Failed to get number of groups user belongs to\n");
+ fprintf(stderr, "Failed to get number of groups user belongs to: %s\n", strerror(errno));
return NULL;
}
+ if (ngroups == 0)
+ return NULL;
group_ids = (gid_t *)malloc(sizeof(gid_t)*ngroups);
+
+ if (group_ids == NULL) {
+ fprintf(stderr, "Out of memory while getting groups the user belongs to\n");
+ return NULL;
+ }
+
ret = getgroups(ngroups, group_ids);
if (ret < 0) {
free(group_ids);
- fprintf(stderr, "Failed to get process groups\n");
+ fprintf(stderr, "Failed to get process groups: %s\n", strerror(errno));
return NULL;
}
groupnames = (char **)malloc(sizeof(char *)*(ngroups+1));
+ if (groupnames == NULL) {
+ free(group_ids);
+ fprintf(stderr, "Out of memory while getting group names\n");
+ return NULL;
+ }
+
+ memset(groupnames, 0, sizeof(char *)*(ngroups+1));
+
for (i=0; i<ngroups; i++ ) {
gr = getgrgid(group_ids[i]);
if (gr == NULL) {
fprintf(stderr, "Failed to get group name\n");
free(group_ids);
- for (j=0; j<i; j++) {
- free(groupnames[j]);
- }
- free(groupnames);
+ free_groupnames(groupnames);
return NULL;
}
if (groupnames[i] == NULL) {
fprintf(stderr, "Failed to copy group name: %s", gr->gr_name);
free(group_ids);
- for (j=0; j<i; j++) {
- free(groupnames[j]);
- }
- free(groupnames);
+ free_groupnames(groupnames);
return NULL;
}
}
- groupnames[ngroups] = NULL;
-
free(group_ids);
return groupnames;
}
-static void free_groupnames(char **groupnames)
-{
- char **group;
- for (group=groupnames; group != NULL; group++)
- free(*group);
- free(groupnames);
-}
-
static bool name_is_in_groupnames(char *name, char **groupnames)
{
while (groupnames != NULL) {
}
al->name = strdup(name);
+
+ if (al->name == NULL) {
+ free(al);
+ return NULL;
+ }
+
al->allowed = n;
al->next = NULL;
*/
append_alloted(alloted, name, n);
count += n;
- break;
}
free_groupnames(groups);
fclose(fin);
free(line);
+
+ // now return the total number of nics that this user can create
return count;
}