X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=cpmcp.c;h=590e702aa887177c06e7d39599a2b05dd7335162;hb=edf600144998d1a1e09898548938cc11b95c10bc;hp=f94e98754628fd7b7af9aaece2b9272ad7a1ae43;hpb=224b4e6d27a3af235500d9d8028ddbd3a60af7ed;p=debian%2Fcpmtools diff --git a/cpmcp.c b/cpmcp.c index f94e987..590e702 100644 --- a/cpmcp.c +++ b/cpmcp.c @@ -2,6 +2,7 @@ #include "config.h" #include +#include #include #include #include @@ -9,8 +10,9 @@ #include #include #include +#include -#include "getopt.h" +#include "getopt_.h" #include "cpmfs.h" #ifdef USE_DMALLOC @@ -20,6 +22,7 @@ const char cmd[]="cpmcp"; static int text=0; +static int preserve=0; /** * Return the user number. @@ -29,7 +32,7 @@ static int text=0; static int userNumber(const char *s) /*{{{*/ { if (isdigit(*s) && *(s+1)==':') return (*s-'0'); - if (isdigit(*s) && isdigit(*(s+1)) && *(s+2)==':') return (10*(*s-'0')+(*(s+1))); + if (isdigit(*s) && isdigit(*(s+1)) && *(s+2)==':') return (10*(*s-'0')+(*(s+1)-'0')); return -1; } /*}}}*/ @@ -46,64 +49,72 @@ static int cpmToUnix(const struct cpmInode *root, const char *src, const char *d struct cpmInode ino; int exitcode=0; - if (cpmNamei(root,src,&ino)==-1) { fprintf(stderr,"%s: can not open %s: %s\n",cmd,src,boo); exitcode=1; } - else + if (cpmNamei(root,src,&ino)==-1) { fprintf(stderr,"%s: can not open `%s': %s\n",cmd,src,boo); exitcode=1; } + else + { + struct cpmFile file; + FILE *ufp; + + cpmOpen(&ino,&file,O_RDONLY); + if ((ufp=fopen(dest,text ? "w" : "wb"))==(FILE*)0) { fprintf(stderr,"%s: can not create %s: %s\n",cmd,dest,strerror(errno)); exitcode=1; } + else + { + int crpending=0; + int ohno=0; + int res; + char buf[4096]; + + while ((res=cpmRead(&file,buf,sizeof(buf)))!=0) { - struct cpmFile file; - FILE *ufp; + int j; - cpmOpen(&ino,&file,O_RDONLY); - if ((ufp=fopen(dest,text ? "w" : "wb"))==(FILE*)0) { fprintf(stderr,"%s: can not create %s: %s\n",cmd,dest,strerror(errno)); exitcode=1; } - else + for (j=0; j=argc) usage(); - image=argv[optind]; + image=argv[optind++]; - if (userNumber(argv[optind+1])>=0) /* cpm -> unix? */ /*{{{*/ + if (userNumber(argv[optind])>=0) /* cpm -> unix? */ /*{{{*/ { int i; struct stat statbuf; - for (i=optind+1; i<(argc-1); ++i) if (userNumber(argv[i])==-1) usage(); - todir=((argc-optind-1)>2); + for (i=optind; i<(argc-1); ++i) if (userNumber(argv[i])==-1) usage(); + todir=((argc-optind)>2); if (stat(argv[argc-1],&statbuf)==-1) { if (todir) usage(); } else if (S_ISDIR(statbuf.st_mode)) todir=1; else if (todir) usage(); readcpm=1; @@ -152,8 +167,8 @@ int main(int argc, char *argv[]) int i; todir=0; - for (i=optind+1; i<(argc-1); ++i) if (userNumber(argv[i])>=0) usage(); - if ((argc-optind-1)>2 && *(strchr(argv[argc-1],':')+1)!='\0') usage(); + for (i=optind; i<(argc-1); ++i) if (userNumber(argv[i])>=0) usage(); + if ((argc-optind)>2 && *(strchr(argv[argc-1],':')+1)!='\0') usage(); if (*(strchr(argv[argc-1],':')+1)=='\0') todir=1; readcpm=0; } @@ -170,57 +185,24 @@ int main(int argc, char *argv[]) /*}}}*/ if (readcpm) /* copy from CP/M to UNIX */ /*{{{*/ { - int i,count,total=0; - char src[2+8+1+3+1]; - struct cpmFile dir; - struct cpmDirent dirent; - - /* expand pattern and check if we try to copy multiple files to a file */ /*{{{*/ - for (i=optind+1,total=0; i<(argc-1); ++i) - { - cpmOpendir(&root,&dir); - count=0; - while (cpmReaddir(&dir,&dirent)) if (match(dirent.name,argv[i])) ++count; - if (count==0) ++total; else total+=count; - cpmClose(&dir); - } - if (total>1 && !todir) usage(); - /*}}}*/ - - for (i=optind+1; i<(argc-1); ++i) + int i; + char *last=argv[argc-1]; + + cpmglob(optind,argc-1,argv,&root,&gargc,&gargv); + /* trying to copy multiple files to a file? */ + if (gargc>1 && !todir) usage(); + for (i=0; i