diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | unix.c | 64 | ||||
-rw-r--r-- | unix.h | 17 |
3 files changed, 82 insertions, 1 deletions
@@ -5,7 +5,7 @@ CC=cc debug=-g -DDEBUG -DLOCAL CFLAGS=$(MORE_CFLAGS) -Wall -OBJS=bee.o irc.o util.o +OBJS=bee.o irc.o util.o unix.o all: apiobot apiobot: $(OBJS) @@ -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; +} + + + @@ -0,0 +1,17 @@ +#ifndef unix_h_INCLUDED +#define unix_h_INCLUDED + +#include <sys/types.h> +#include <grp.h> +#include <sys/stat.h> +#include <unistd.h> +#include <sys/socket.h> +#include <sys/un.h> + + +// takes filename, returns socket fd +// or -1 on failure. +int unix_setup(char sockname[]); + +#endif // unix_h_INCLUDED + |