-rw-r--r-- 2875 cdb-20251021/instcopy.c raw
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include "inbuf.h"
#include "outbuf.h"
#include "strerr.h"
#include "open.h"
#include "hier.h"
static num copy(outbuf *bout,inbuf *bin)
{
num n;
char *x;
for (;;) {
n = inbuf_feed(bin);
if (n < 0) return -2;
if (!n) return 0;
x = inbuf_PEEK(bin);
if (outbuf_put(bout,x,n) == -1) return -3;
inbuf_SEEK(bin,n);
}
}
#define FATAL "instcopy: fatal: "
static num fdsourcedir = -1;
void hier_h(const char *home,num mode)
{
if (mkdir(home,0700) == -1)
if (errno != EEXIST)
strerr_die4sys(111,FATAL,"unable to mkdir ",home,": ");
if (chmod(home,mode) == -1)
strerr_die4sys(111,FATAL,"unable to chmod ",home,": ");
}
void hier_d(const char *home,const char *subdir,num mode)
{
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
if (mkdir(subdir,0700) == -1)
if (errno != EEXIST)
strerr_die6sys(111,FATAL,"unable to mkdir ",home,"/",subdir,": ");
if (chmod(subdir,mode) == -1)
strerr_die6sys(111,FATAL,"unable to chmod ",home,"/",subdir,": ");
}
static char inbuf_space[INBUF_SIZE];
static char outbuf_space[OUTBUF_SIZE];
static inbuf ssin;
static outbuf ssout;
void hier_c(const char *home,const char *subdir,const char *file,num mode)
{
num fdin;
num fdout;
if (fchdir(fdsourcedir) == -1)
strerr_die2sys(111,FATAL,"unable to switch back to source directory: ");
fdin = open_read(file);
if (fdin == -1)
strerr_die4sys(111,FATAL,"unable to read ",file,": ");
inbuf_init(&ssin,inbuf_unixread,fdin,inbuf_space,sizeof inbuf_space);
if (chdir(home) == -1)
strerr_die4sys(111,FATAL,"unable to switch to ",home,": ");
if (chdir(subdir) == -1)
strerr_die6sys(111,FATAL,"unable to switch to ",home,"/",subdir,": ");
fdout = open_trunc(file);
if (fdout == -1)
strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
outbuf_init(&ssout,outbuf_unixwrite,fdout,outbuf_space,sizeof outbuf_space);
switch(copy(&ssout,&ssin)) {
case -2:
strerr_die4sys(111,FATAL,"unable to read ",file,": ");
case -3:
strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
}
close(fdin);
if (outbuf_flush(&ssout) == -1)
strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
if (fsync(fdout) == -1)
strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
if (close(fdout) == -1) /* NFS silliness */
strerr_die6sys(111,FATAL,"unable to write .../",subdir,"/",file,": ");
if (chmod(file,mode) == -1)
strerr_die6sys(111,FATAL,"unable to chmod .../",subdir,"/",file,": ");
}
int main(int argc,char **argv)
{
fdsourcedir = open_read(".");
if (fdsourcedir == -1)
strerr_die2sys(111,FATAL,"unable to open current directory: ");
umask(077);
hier();
_exit(0);
return 0;
}