idedit.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include <sys/types.h>
       
     2 #include <pwd.h>
       
     3 #include <grp.h>
       
     4 #include "readwrite.h"
       
     5 #include "exit.h"
       
     6 #include "scan.h"
       
     7 #include "fmt.h"
       
     8 #include "strerr.h"
       
     9 #include "open.h"
       
    10 #include "seek.h"
       
    11 #include "fork.h"
       
    12 
       
    13 #define FATAL "idedit: fatal: "
       
    14 #define WARNING "idedit: warning: "
       
    15 
       
    16 int fd;
       
    17 
       
    18 void byte(pos,value)
       
    19 char *pos;
       
    20 unsigned int value;
       
    21 {
       
    22   unsigned long u;
       
    23   unsigned char ch;
       
    24 
       
    25   if (pos[scan_ulong(pos,&u)]) return;
       
    26 
       
    27   if (seek_set(fd,(seek_pos) u) == -1)
       
    28     strerr_die2sys(111,FATAL,"unable to seek: ");
       
    29 
       
    30   ch = value;
       
    31   if (write(fd,&ch,1) != 1)
       
    32     strerr_die2sys(111,FATAL,"unable to write: ");
       
    33 }
       
    34 
       
    35 char *args[10];
       
    36 
       
    37 void run()
       
    38 {
       
    39   int pid;
       
    40   int wstat;
       
    41 
       
    42   pid = fork();
       
    43   if (pid == -1)
       
    44     strerr_die2sys(111,FATAL,"unable to fork: ");
       
    45 
       
    46   if (pid == 0) {
       
    47     execv(*args,args);
       
    48     strerr_die4sys(111,WARNING,"unable to run ",*args,": ");
       
    49   }
       
    50 
       
    51   if (wait_pid(&wstat,pid) != pid)
       
    52     strerr_die2sys(111,FATAL,"waitpid surprise");
       
    53 }
       
    54 
       
    55 void u(account,group,home,pos0,pos1,pos2,pos3)
       
    56 char *account;
       
    57 char *group;
       
    58 char *home;
       
    59 char *pos0;
       
    60 char *pos1;
       
    61 char *pos2;
       
    62 char *pos3;
       
    63 {
       
    64   struct passwd *pw;
       
    65   unsigned int value;
       
    66 
       
    67   pw = getpwnam(account);
       
    68 
       
    69   if (!pw && group) {
       
    70     args[0] = "add-account";
       
    71     args[1] = account;
       
    72     args[2] = group;
       
    73     args[3] = home;
       
    74     args[4] = 0;
       
    75     run();
       
    76     pw = getpwnam(account);
       
    77   }
       
    78 
       
    79   if (!pw)
       
    80     strerr_die3x(111,FATAL,"unable to find uid for ",account);
       
    81 
       
    82   value = pw->pw_uid;
       
    83   byte(pos0,value); value >>= 8;
       
    84   byte(pos1,value); value >>= 8;
       
    85   byte(pos2,value); value >>= 8;
       
    86   byte(pos3,value); value >>= 8;
       
    87   if (value)
       
    88     strerr_die3x(111,FATAL,"excessively large uid for ",account);
       
    89 }
       
    90 
       
    91 void g(group,pos0,pos1,pos2,pos3)
       
    92 char *group;
       
    93 char *pos0;
       
    94 char *pos1;
       
    95 char *pos2;
       
    96 char *pos3;
       
    97 {
       
    98   struct group *gr;
       
    99   unsigned int value;
       
   100 
       
   101   gr = getgrnam(group);
       
   102 
       
   103   if (!gr) {
       
   104     args[0] = "add-group";
       
   105     args[1] = group;
       
   106     args[2] = 0;
       
   107     run();
       
   108     gr = getgrnam(group);
       
   109   }
       
   110 
       
   111   if (!gr)
       
   112     strerr_die3x(111,FATAL,"unable to find gid for ",group);
       
   113 
       
   114   value = gr->gr_gid;
       
   115   byte(pos0,value); value >>= 8;
       
   116   byte(pos1,value); value >>= 8;
       
   117   byte(pos2,value); value >>= 8;
       
   118   byte(pos3,value); value >>= 8;
       
   119   if (value)
       
   120     strerr_die3x(111,FATAL,"excessively large gid for ",group);
       
   121 }
       
   122 
       
   123 void main(argc,argv)
       
   124 int argc;
       
   125 char **argv;
       
   126 {
       
   127   if (argc < 42) _exit(100);
       
   128 
       
   129   fd = open_write(argv[1]);
       
   130   if (fd == -1) strerr_die4sys(111,FATAL,"unable to open ",argv[1],": ");
       
   131 
       
   132   g("qmail",argv[34],argv[35],argv[36],argv[37]);
       
   133   g("nofiles",argv[38],argv[39],argv[40],argv[41]);
       
   134 
       
   135   u("root",(char *) 0,"/",argv[14],argv[15],argv[16],argv[17]);
       
   136 
       
   137   u("qmaild","nofiles","/var/qmail",argv[6],argv[7],argv[8],argv[9]);
       
   138   u("qmaill","nofiles","/var/qmail",argv[10],argv[11],argv[12],argv[13]);
       
   139   u("qmailp","nofiles","/var/qmail",argv[18],argv[19],argv[20],argv[21]);
       
   140   u("alias","nofiles","/var/qmail/alias",argv[2],argv[3],argv[4],argv[5]);
       
   141 
       
   142   u("qmailq","qmail","/var/qmail",argv[22],argv[23],argv[24],argv[25]);
       
   143   u("qmailr","qmail","/var/qmail",argv[26],argv[27],argv[28],argv[29]);
       
   144   u("qmails","qmail","/var/qmail",argv[30],argv[31],argv[32],argv[33]);
       
   145 
       
   146   _exit(0);
       
   147 }