From 0e5b2871ca6456b01d4bf037a6e68badf1ff1a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henryk=20Pl=C3=B6tz?= Date: Fri, 3 Oct 2014 19:58:52 +0200 Subject: Initial commit of djbdns-1.05.tar.gz Source was http://cr.yp.to/djbdns/djbdns-1.05.tar.gz, SHA1 2efdb3a039d0c548f40936aa9cb30829e0ce8c3d --- generic-conf.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 generic-conf.c (limited to 'generic-conf.c') diff --git a/generic-conf.c b/generic-conf.c new file mode 100644 index 0000000..db4aa1d --- /dev/null +++ b/generic-conf.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include "strerr.h" +#include "buffer.h" +#include "open.h" +#include "generic-conf.h" + +static const char *fatal; +static const char *dir; +static const char *fn; + +static int fd; +static char buf[1024]; +static buffer ss; + +void init(const char *d,const char *f) +{ + dir = d; + fatal = f; + umask(022); + if (mkdir(dir,0700) == -1) + strerr_die4sys(111,fatal,"unable to create ",dir,": "); + if (chmod(dir,03755) == -1) + strerr_die4sys(111,fatal,"unable to set mode of ",dir,": "); + if (chdir(dir) == -1) + strerr_die4sys(111,fatal,"unable to switch to ",dir,": "); +} + +void fail(void) +{ + strerr_die6sys(111,fatal,"unable to create ",dir,"/",fn,": "); +} + +void makedir(const char *s) +{ + fn = s; + if (mkdir(fn,0700) == -1) fail(); +} + +void start(const char *s) +{ + fn = s; + fd = open_trunc(fn); + if (fd == -1) fail(); + buffer_init(&ss,buffer_unixwrite,fd,buf,sizeof buf); +} + +void outs(const char *s) +{ + if (buffer_puts(&ss,s) == -1) fail(); +} + +void out(const char *s,unsigned int len) +{ + if (buffer_put(&ss,s,len) == -1) fail(); +} + +void copyfrom(buffer *b) +{ + if (buffer_copy(&ss,b) < 0) fail(); +} + +void finish(void) +{ + if (buffer_flush(&ss) == -1) fail(); + if (fsync(fd) == -1) fail(); + close(fd); +} + +void perm(int mode) +{ + if (chmod(fn,mode) == -1) fail(); +} + +void owner(int uid,int gid) +{ + if (chown(fn,uid,gid) == -1) fail(); +} + +void makelog(const char *user,int uid,int gid) +{ + makedir("log"); + perm(02755); + makedir("log/main"); + owner(uid,gid); + perm(02755); + start("log/status"); + finish(); + owner(uid,gid); + perm(0644); + + start("log/run"); + outs("#!/bin/sh\nexec"); + outs(" setuidgid "); outs(user); + outs(" multilog t ./main\n"); + finish(); + perm(0755); +} -- cgit v1.2.3