~ubuntu-branches/ubuntu/intrepid/djbdns/intrepid-updates

« back to all changes in this revision

Viewing changes to generic-conf.c

  • Committer: Bazaar Package Importer
  • Author(s): Gerrit Pape
  • Date: 2008-03-02 23:22:04 UTC
  • Revision ID: james.westby@ubuntu.com-20080302232204-wa3owprcpeiyu8kj
Tags: upstream-1.05
ImportĀ upstreamĀ versionĀ 1.05

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <unistd.h>
 
2
#include <sys/types.h>
 
3
#include <sys/stat.h>
 
4
#include "strerr.h"
 
5
#include "buffer.h"
 
6
#include "open.h"
 
7
#include "generic-conf.h"
 
8
 
 
9
static const char *fatal;
 
10
static const char *dir;
 
11
static const char *fn;
 
12
 
 
13
static int fd;
 
14
static char buf[1024];
 
15
static buffer ss;
 
16
 
 
17
void init(const char *d,const char *f)
 
18
{
 
19
  dir = d;
 
20
  fatal = f;
 
21
  umask(022);
 
22
  if (mkdir(dir,0700) == -1)
 
23
    strerr_die4sys(111,fatal,"unable to create ",dir,": ");
 
24
  if (chmod(dir,03755) == -1)
 
25
    strerr_die4sys(111,fatal,"unable to set mode of ",dir,": ");
 
26
  if (chdir(dir) == -1)
 
27
    strerr_die4sys(111,fatal,"unable to switch to ",dir,": ");
 
28
}
 
29
 
 
30
void fail(void)
 
31
{
 
32
  strerr_die6sys(111,fatal,"unable to create ",dir,"/",fn,": ");
 
33
}
 
34
 
 
35
void makedir(const char *s)
 
36
{
 
37
  fn = s;
 
38
  if (mkdir(fn,0700) == -1) fail();
 
39
}
 
40
 
 
41
void start(const char *s)
 
42
{
 
43
  fn = s;
 
44
  fd = open_trunc(fn);
 
45
  if (fd == -1) fail();
 
46
  buffer_init(&ss,buffer_unixwrite,fd,buf,sizeof buf);
 
47
}
 
48
 
 
49
void outs(const char *s)
 
50
{
 
51
  if (buffer_puts(&ss,s) == -1) fail();
 
52
}
 
53
 
 
54
void out(const char *s,unsigned int len)
 
55
{
 
56
  if (buffer_put(&ss,s,len) == -1) fail();
 
57
}
 
58
 
 
59
void copyfrom(buffer *b)
 
60
{
 
61
  if (buffer_copy(&ss,b) < 0) fail();
 
62
}
 
63
 
 
64
void finish(void)
 
65
{
 
66
  if (buffer_flush(&ss) == -1) fail();
 
67
  if (fsync(fd) == -1) fail();
 
68
  close(fd);
 
69
}
 
70
 
 
71
void perm(int mode)
 
72
{
 
73
  if (chmod(fn,mode) == -1) fail();
 
74
}
 
75
 
 
76
void owner(int uid,int gid)
 
77
{
 
78
  if (chown(fn,uid,gid) == -1) fail();
 
79
}
 
80
 
 
81
void makelog(const char *user,int uid,int gid)
 
82
{
 
83
  makedir("log");
 
84
  perm(02755);
 
85
  makedir("log/main");
 
86
  owner(uid,gid);
 
87
  perm(02755);
 
88
  start("log/status");
 
89
  finish();
 
90
  owner(uid,gid);
 
91
  perm(0644);
 
92
 
 
93
  start("log/run");
 
94
  outs("#!/bin/sh\nexec");
 
95
  outs(" setuidgid "); outs(user);
 
96
  outs(" multilog t ./main\n");
 
97
  finish();
 
98
  perm(0755);
 
99
}