/*
* libudev - interface to udev device information
*
- * Copyright (C) 2004-2009 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2003-2009 Kay Sievers <kay.sievers@vrfy.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
gid_t util_lookup_group(struct udev *udev, const char *group)
{
char *endptr;
- int buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
- char buf[buflen];
+ int buflen;
+ char *buf;
struct group grbuf;
struct group *gr;
gid_t gid = 0;
if (endptr[0] == '\0')
return gid;
- errno = 0;
- getgrnam_r(group, &grbuf, buf, buflen, &gr);
- if (gr != NULL)
- return gr->gr_gid;
- if (errno == 0 || errno == ENOENT || errno == ESRCH)
- err(udev, "specified group '%s' unknown\n", group);
- else
- err(udev, "error resolving group '%s': %m\n", group);
- return 0;
+ buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
+ if (buflen < 0)
+ buflen = 1000;
+ buf = NULL;
+ gid = 0;
+ for (;;) {
+ buf = realloc(buf, buflen);
+ if (!buf)
+ break;
+ errno = 0;
+ getgrnam_r(group, &grbuf, buf, buflen, &gr);
+ if (gr != NULL)
+ gid = gr->gr_gid;
+ else if (errno == ERANGE) {
+ buflen *= 2;
+ continue;
+ }
+ else if (errno == 0 || errno == ENOENT || errno == ESRCH)
+ err(udev, "specified group '%s' unknown\n", group);
+ else
+ err(udev, "error resolving group '%s': %m\n", group);
+ break;
+ }
+ free(buf);
+ return gid;
}
/* handle "[<SUBSYSTEM>/<KERNEL>]<attribute>" format */
int i;
int err = 0;
+ info(udev, "'%s' started\n", command);
+
/* build argv from command */
util_strscpy(arg, sizeof(arg), command);
i = 0;
argv[0] = arg;
argv[1] = NULL;
}
- info(udev, "'%s'\n", command);
/* prepare pipes from child to parent */
if (result != NULL || udev_get_log_priority(udev) >= LOG_INFO) {