index 57cdacb60f7462c41422369610d5d03c5ef82628..455d5213d27ee41f60fc5afc285a28f520d17fe7 100644 (file)
int fd;
} sock_data_t;
-int check_and_create_path (char *path)
+int check_and_create_path(char *path, int group_valid, gid_t group_id)
{
- char *d = path;
+ char *d = path;
+
if (!d)
return -1;
if (mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0) {
if (errno != EEXIST) {
*d = '/';
- error_msg("can't create path %s (error: %s)",
+ error_msg("can't create path %s (error: %s)\n",
path, strerror(errno));
return -1;
}
+ } else if (group_valid) {
+ /* Set group ownership if dir did not previously exist */
+ if (chown(path, -1, group_id) < 0) {
+ error_msg("couldn't set group ownership for path %s "
+ "(error: %s)\n", path, strerror(errno));
+ }
}
*d = '/';
}
+
return 0;
}
-sock_h sock_open (sock_name_t *sock_name)
+sock_h sock_open(sock_name_t *sock_name, int group_valid, gid_t group_id)
{
sock_data_t *sd = 0;
- int retval = 0;
+ int retval = 0;
+ mode_t old_mask;
if (!sock_name) {
return 0;
}
+ if (group_valid) {
+ /* Allow group permissions to be set */
+ old_mask = umask(0002);
+ }
+
sd = calloc (1, sizeof(sock_data_t));
if (sock_name->type == sock_addr_e) {
memcpy (&sd->addr, sock_name->s.addr, sizeof(struct sockaddr_un));
} else {
- if (check_and_create_path(sock_name->s.name) < 0) {
+ if (check_and_create_path(sock_name->s.name, group_valid,
+ group_id) < 0) {
goto check_n_return;
}
sd->addr.sun_family = AF_UNIX;
FD_ZERO(&sd->readfds);
FD_SET(sd->fd, &sd->readfds);
+ if (group_valid) {
+ if (chown(sock_name->s.name, -1, group_id) < 0) {
+ error_msg("Can't assign socket %s to specified group (error: %s)",
+ sock_name->s.name, strerror(errno));
+ goto check_n_return;
+ }
+ }
+
retval = (int) sd;
check_n_return:
sock_close ((sock_h) &sd);
}
+ if (group_valid) {
+ umask(old_mask);
+ }
+
return ((sock_h) retval);
}