X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=cpmcp.c;h=f840f598bbb7bdfd3f0581a116cd19bcf90ce6ad;hb=749b004e4bb5830a6246a30ebe0a158e448327c5;hp=61dc65b6fd69621dc79ddf3e9277747ee5308aa8;hpb=32087c67d53a8f8058b359388f23e2dbc9436d54;p=debian%2Fcpmtools diff --git a/cpmcp.c b/cpmcp.c index 61dc65b..f840f59 100644 --- a/cpmcp.c +++ b/cpmcp.c @@ -1,14 +1,8 @@ /* #includes */ /*{{{C}}}*//*{{{*/ -#undef _POSIX_SOURCE -#define _POSIX_SOURCE 1 -#undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 2 - -#ifdef DMALLOC -#include "dmalloc.h" -#endif +#include "config.h" #include +#include #include #include #include @@ -16,14 +10,19 @@ #include #include #include -#include "config.h" +#include -#include "getopt.h" +#include "getopt_.h" #include "cpmfs.h" + +#ifdef USE_DMALLOC +#include +#endif /*}}}*/ const char cmd[]="cpmcp"; static int text=0; +static int preserve=0; /** * Return the user number. @@ -50,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; @@ -156,8 +166,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; } @@ -174,57 +184,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