- 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;