diff options
Diffstat (limited to 'src/install.c')
-rw-r--r-- | src/install.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/install.c b/src/install.c new file mode 100644 index 0000000..c738fb7 --- /dev/null +++ b/src/install.c @@ -0,0 +1,139 @@ +#include <unistd.h> +#include <sys/stat.h> +#include "buffer.h" +#include "logmsg.h" +#include "open.h" +#include "exit.h" +#include "fifo.h" + +extern void hier(); + +#define WHO "install" + +int fdsourcedir = -1; + +void h(char *home,int uid,int gid,int mode) +{ + if (mkdir(home,0700) == -1) + if (errno != EEXIST) + logmsg(WHO,111,FATAL,B("unable to mkdir: ",home)); + if (chown(home,uid,gid) == -1) + logmsg(WHO,111,FATAL,B("unable to chown: ",home)); + if (chmod(home,mode) == -1) + logmsg(WHO,111,FATAL,B("unable to chmod: ",home)); +} + +void d(char *home,char *subdir,int uid,int gid,int mode) +{ + if (chdir(home) == -1) + logmsg(WHO,110,FATAL,B("unable to switch to: ",home)); + if (mkdir(subdir,0700) == -1) + if (errno != EEXIST) + logmsg(WHO,111,FATAL,B("unable to mkdir: ",home,"/",subdir)); + if (chown(subdir,uid,gid) == -1) + logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",subdir)); + if (chmod(subdir,mode) == -1) + logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",subdir)); +} + +void p(char *home,char *fifo,int uid,int gid,int mode) +{ + if (chdir(home) == -1) + logmsg(WHO,110,FATAL,B("unable to switch to: ",home)); + if (fifo_make(fifo,0700) == -1) + if (errno != EEXIST) + logmsg(WHO,111,FATAL,B("unable to mkfifo: ",home,"/",fifo)); + if (chown(fifo,uid,gid) == -1) + logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",fifo)); + if (chmod(fifo,mode) == -1) + logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",fifo)); +} + +char inbuf[BUFFER_INSIZE]; +buffer bi; +char outbuf[BUFFER_OUTSIZE]; +buffer bo; + +void c(char *home,char *subdir,char *file,int uid,int gid,int mode) +{ + int fdin; + int fdout; + + if (fchdir(fdsourcedir) == -1) + logmsg(WHO,110,FATAL,"unable to switch back to source directory: "); + + fdin = open_read(file); + if (fdin == -1) + logmsg(WHO,111,FATAL,B("unable to read: ",file)); + buffer_init(&bi,read,fdin,inbuf,sizeof(inbuf)); + + if (chdir(home) == -1) + logmsg(WHO,110,FATAL,B("unable to switch to: ",home)); + if (chdir(subdir) == -1) + logmsg(WHO,110,FATAL,B("unable to switch to: ",home,"/",subdir)); + + fdout = open_trunc(file); + if (fdout == -1) + logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file)); + buffer_init(&bo,write,fdout,outbuf,sizeof(outbuf)); + + switch (buffer_copy(&bo,&bi)) { + case -2: + logmsg(WHO,111,FATAL,B("unable to read: ",file)); + case -3: + logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file)); + } + + close(fdin); + if (buffer_flush(&bo) == -1) + logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file)); + if (fsync(fdout) == -1) + logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file)); + if (close(fdout) == -1) /* NFS silliness */ + logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file)); + + if (chown(file,uid,gid) == -1) + logmsg(WHO,111,FATAL,B("unable to chown .../",subdir,"/",file)); + if (chmod(file,mode) == -1) + logmsg(WHO,111,FATAL,B("unable to chmod .../",subdir,"/",file)); +} + +void z(char *home,char *file,int len,int uid,int gid,int mode) +{ + int fdout; + + if (chdir(home) == -1) + logmsg(WHO,110,FATAL,B("unable to switch to: ",home)); + + fdout = open_trunc(file); + if (fdout == -1) + logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file)); + buffer_init(&bo,write,fdout,outbuf,sizeof(outbuf)); + + while (len-- > 0) + if (buffer_put(&bo,"",1) == -1) + logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file)); + + if (buffer_flush(&bo) == -1) + logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file)); + if (fsync(fdout) == -1) + logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file)); + if (close(fdout) == -1) /* NFS silliness */ + logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file)); + + if (chown(file,uid,gid) == -1) + logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",file)); + if (chmod(file,mode) == -1) + logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",file)); +} + +int main() +{ + fdsourcedir = open_read("."); + if (fdsourcedir == -1) + logmsg(WHO,110,FATAL,"unable to open current directory: "); + + umask(077); + hier(); + _exit(0); +} |