aboutsummaryrefslogtreecommitdiff
path: root/generic-conf.c
blob: db4aa1dcb9ad9a37dc7c0034ba41693f2444cea9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#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);
}