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