+ /* set socket group permissions */
+ case 's':
+ {
+ gid_t group_gid;
+ struct group *grp;
+
+ group_gid = strtoul(optarg, NULL, 10);
+ if (errno != EINVAL && group_gid>0)
+ {
+ /* we were passed a number */
+ grp = getgrgid(group_gid);
+ }
+ else
+ {
+ grp = getgrnam(optarg);
+ }
+
+ if (grp)
+ {
+ socket_group = grp->gr_gid;
+ }
+ else
+ {
+ /* no idea what the user wanted... */
+ fprintf (stderr, "read_options: couldn't map \"%s\" to a group, Sorry\n", optarg);
+ return (5);
+ }
+ }
+ break;
+
+ /* set socket file permissions */
+ case 'm':
+ {
+ long tmp;
+ char *endptr = NULL;
+
+ tmp = strtol (optarg, &endptr, 8);
+ if ((endptr == optarg) || (! endptr) || (*endptr != '\0')
+ || (tmp > 07777) || (tmp < 0)) {
+ fprintf (stderr, "read_options: Invalid file mode \"%s\".\n",
+ optarg);
+ return (5);
+ }
+
+ socket_permissions = (mode_t)tmp;
+ }
+ break;
+
+ case 'P':
+ {
+ char *optcopy;
+ char *saveptr;
+ char *dummy;
+ char *ptr;
+
+ rrd_free_ptrs ((void *) &permissions, &permissions_len);
+
+ optcopy = strdup (optarg);
+ dummy = optcopy;
+ saveptr = NULL;
+ while ((ptr = strtok_r (dummy, ", ", &saveptr)) != NULL)
+ {
+ dummy = NULL;
+ rrd_add_strdup ((void *) &permissions, &permissions_len, ptr);
+ }
+
+ free (optcopy);
+ }
+ break;
+