diff options
Diffstat (limited to 'unix.c')
-rw-r--r-- | unix.c | 64 |
1 files changed, 64 insertions, 0 deletions
@@ -0,0 +1,64 @@ +#include "unix.h" + +#include "conf.h" + +static int +sock_perms(int fd) +{ + // first get group by name + struct group *group; + if ((group = getgrnam(SOCKETGROUP)) == NULL) { + fprintf(stderr,"no such group: %s\n",SOCKETGROUP); + return -1; + } + // set group on socket + if (fchown(fd, -1, group.gr_gid) == -1) { + perror("chown"); + return -1; + } + + // get current permissions, so we can modify them. + struct stat sb; + if (fstat(fd, &sb) == -1) { + perror("stat"); + return -1; + } + if (fchmod(fd, sb.st_mode|S_IWGRP) == -1) { + perror("chmod"); + return -1; + } + + return 0; +} + +// takes filename, returns socket fd +// or -1 or whatever +int +unix_setup(char sockname[]) +{ + unlink(sockname); + + int sock = socket(AF_UNIX, SOCK_DGRAM, 0); + if (sock == -1) { + perror("(unix) socket"); + return -1; + } + + struct sockaddr_un name; + memset(&name, 0, sizeof name); + name.sun_family = AF_UNIX; + strncpy(name.sun_path, SOCKETNAME, (sizeof name.sun_path)-1); + if (bind(sock, (struct sockaddr *)&name, sizeof name) == -1) { + perror("(unix) bind"); + return -1; + } + + if (sock_perms(sock) == -1) { + fprintf(stderr,"warning: couldn't correctly set up permissions on %s\n",sockname); + } + + return sock; +} + + + |