]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/rm-lld.git/blobdiff - test/armv7/linux/sockutils.c
RM Server can be initialized with a group ID for non-root user access to server's...
[keystone-rtos/rm-lld.git] / test / armv7 / linux / sockutils.c
index 57cdacb60f7462c41422369610d5d03c5ef82628..455d5213d27ee41f60fc5afc285a28f520d17fe7 100644 (file)
@@ -50,9 +50,10 @@ typedef struct sock_data {
        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;
 
@@ -61,31 +62,45 @@ int check_and_create_path (char *path)
                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;
@@ -109,6 +124,14 @@ sock_h sock_open (sock_name_t *sock_name)
        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:
@@ -116,6 +139,10 @@ check_n_return:
                sock_close ((sock_h) &sd);
        }
 
+       if (group_valid) {
+               umask(old_mask);
+       }
+
        return ((sock_h) retval);
 }