aboutsummaryrefslogtreecommitdiff
path: root/unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'unix.c')
-rw-r--r--unix.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/unix.c b/unix.c
new file mode 100644
index 0000000..bbb663d
--- /dev/null
+++ b/unix.c
@@ -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;
+}
+
+
+