From 47686fbb09fce19a5b035220b70e9ab899495ae1 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Fri, 1 Dec 1989 07:37:01 +0000 Subject: [PATCH] new --- WEGA/src/cmd/doscopy/doscp.c | 271 ++++++++++++++++++++++++++++++++++ WEGA/src/cmd/doscopy/dosout.c | 81 ++++++++++ 2 files changed, 352 insertions(+) create mode 100644 WEGA/src/cmd/doscopy/doscp.c create mode 100644 WEGA/src/cmd/doscopy/dosout.c diff --git a/WEGA/src/cmd/doscopy/doscp.c b/WEGA/src/cmd/doscopy/doscp.c new file mode 100644 index 0000000..7aac1dd --- /dev/null +++ b/WEGA/src/cmd/doscopy/doscp.c @@ -0,0 +1,271 @@ +/************************************************************************** +*************************************************************************** + + W E G A - Quelle (C) TU KMSt / ZFT/KEAW Abt. WAE - 1988 + Programm: doscp.c + + Bearbeiter : P. Hoge + Datum : 24.11.89 + Version : 1.3 + +*************************************************************************** + + Kopieren von DCP-Dateien in WEGA-Files und umgekehrt + +*************************************************************************** +**************************************************************************/ + +#include +#include +#include +#include +#include "dos.h" + +main(argc, argv) +register char **argv; +{ + register char *arg0 = argv[0]; + char *argl; /* letztes Argumentes */ + register int status = 0, res; + int conv = 1; /* Newlinekonvertierung */ + int fd; /* WEGA-Filedeskriptor */ + char upath[LMAX], dpath[LMAX]; + char *p, t[2*LMAX]; + char *strrchr(), *strcat(); + struct dosdisc dos; + struct dostat dstat; + struct stat mstat; + int dtm = 1; /* DCP -> WEGA */ + int dir = 0; /* letztes Argument ist Verzeichnis */ + + argc--; + argl = argv[argc]; + for (; argc > 0 && argv[1][0] == '-'; argc--, argv++) { + switch (argv[1][1]) { + case '\0': + break; + case 'r': + --conv; /* keine Newlinekonv. */ + break; + default: + fprintf(stderr,"%s: falsche Option %c\n",arg0,argv[1][1]); + exit(1); + } + } + if (argc < 2) + usage(); + if ((p = strrchr(argl, ':')) != 0) { + dtm--; /* WEGA -> DCP */ + if (dosplit(argl, upath, dpath) < 0) + exit(1); + if (dosdev(upath, 2, &dos) < 0) { + fprintf(stderr, "%s: Fehler in %s\n", arg0, upath); + exit(1); + } + if (*dpath == '\0') + dir++; + else { + res = dosopn(dpath, &dos, &dstat); + if (res == 0 && argc > 2) { + fprintf(stderr, "%s: %s nicht gefunden\n", arg0, dpath); + exit(1); + } + if (res < 0) { + fprintf(stderr, "%s: %s - Lesefehler\n", arg0, upath); + exit(1); + } + if (dstat.mode == _SDIR) + dir++; + } + } + else { /* letztes Argument ist kein DCP-Pfad */ + if (stat(argl, &mstat) < 0) { + if (argc > 2) { + fprintf(stderr, "%s: %s nicht gefunden\n", arg0, argl); + exit(1); + } + } + else + if ((mstat.st_mode & S_IFMT) == S_IFDIR) + dir++; + } + if (!dir) { + if (argc != 2) + usage(); + argv++; + if (dtm) { + if ((fd = creat(argl, 0664)) < 0) { + fprintf(stderr, "%s: %s nicht erstellbar\n", arg0, argl); + exit(1); + } + if ((res = dosplit(*argv, upath, dpath)) < 0) + exit(1); + if (res == 2) { + strcpy(t, "/bin/cp "); + strcat(t, *argv); + strcat(t, " "), + strcat(t, argl); + exit(system(t)); + } + if (*dpath == '\0') { + fprintf(stderr, "%s: keine DCP-Datei\n", arg0); + exit(1); + } + if ((dosdev(upath, 0, &dos)) < 0) { + fprintf(stderr, "%s: Fehler in %s\n", arg0, upath); + exit(1); + } + res = dosopn(dpath, &dos, &dstat); + if (res == 0) { + fprintf(stderr, "%s: %s nicht gefunden\n", arg0, dpath); + exit(1); + } + if (res < 0) { + fprintf(stderr, "%s: %s Lesefehler\n", arg0, upath); + exit(1); + } + switch (dosout(&dstat, fd, &dos, conv)) { + case -1: + fprintf(stderr, "%s: %s - Lesefehler\n", arg0, upath); + exit(1); + case -2: + fprintf(stderr, "%s: Schreibfehler in %s\n", arg0,argl); + exit(1); + } + } + else { /* WEGA -> DCP */ + if (strrchr(*argv, ':') != 0) + usage(); + switch (dosin(*argv, dpath, &dos, conv)) { + case 0: + fprintf(stderr,"%s: Verzeichnis nicht gefunden\n",arg0); + exit(1); + case -1: + fprintf(stderr,"%s: Lesefehler in %s\n",arg0,upath); + exit(1); + case -2: + fprintf(stderr,"%s: Schreibfehler in %s\n",arg0,upath); + exit(1); + case -3: + fprintf(stderr,"%s: %s ist Verzeichnis oder schreibgeschuetzt\n",arg0,dpath); + exit(1); + case -4: + fprintf(stderr,"%s: Lesefehler in %s\n",arg0,*argv); + exit(1); + } + } + } + else { /* Kopieren in ein Verzeichnis */ + if (dtm) { + while (--argc) { + argv++; + strcpy(t, argl); /* Zielverzeichnis */ + strcat(t, "/"); + if ((res = dosplit(*argv, upath, dpath)) < 0) + exit(1); + if (res == 2) { + strcpy(t, "cp "); + strcat(t, *argv); + strcat(t, " "), + strcat(t, argl); + system(t); + continue; + } + if (*dpath == '\0') { + fprintf(stderr, "%s: kein DCP Pfad\n", arg0); + status = 2; + continue; + } + if (dosdev(upath, 0, &dos) < 0) { + fprintf(stderr,"%s: Fehler in %s\n",arg0,upath); + status = 2; + continue; + } + res = dosopn(dpath, &dos, &dstat); + if (res == 0) { + fprintf(stderr, "%s: %s nicht gefunden\n", arg0, dpath); + status = 2; + continue; + } + if (res < 0) { + fprintf(stderr, "%s: %s - Lesefehler\n", arg0, upath); + status = 2; + continue; + } + if ((p = strrchr(dpath, '/')) != 0) /* letzter Teil DCP-Pfad */ + p++; + else + p = dpath; + p = strcat(t, p); + while (*p != '\0') + *p++ = isupper(*p) ? tolower(*p) : *p; + if ((fd = creat(t, 0664)) < 0) { + fprintf(stderr, "%s: %s nicht erzeugbar\n", arg0, t); + status = 2; + continue; + } + switch (dosout(&dstat, fd, &dos, conv)) { + case -1: + fprintf(stderr,"%s: %s Lesefehler\n",arg0,upath); + status = 2; + break; + case -2: + fprintf(stderr,"%s: %s Schreibfehler\n",arg0,t); + status = 2; + break; + } + close(fd); + } /* while */ + } + else { /* WEGA -> DCP */ + while (--argc) { + argv++; + strcpy(t, dpath); + if (*t != '\0') + strcat(t, "/"); + if (strrchr(*argv, ':') != 0) + usage(); + if ((p = strrchr(*argv, '/')) != 0) + p++; + else + p = *argv; + p = strcat(t, p); + while (*p != '\0') + *p++ = islower(*p) ? toupper(*p) : *p; + + switch (dosin(*argv, t, &dos, conv)) { + case 0: + fprintf(stderr,"%s: Verzeichnis nicht gefunden\n",arg0); + status = 2; + break; + case -1: + fprintf(stderr, "%s: Lesefehler in %s\n", arg0,upath); + status = 2; + break; + case -2: + fprintf(stderr,"%s: Schreibfehler in %s\n",arg0,upath); + status = 2; + break; + case -3: + fprintf(stderr,"%s: %s ist schreibgeschuetzt\n",arg0,t); + status = 2; + break; + case -4: + fprintf(stderr, "%s: Lesefehler in %s\n", arg0, *argv); + status = 2; + break; + } + } /* while */ + } + } + exit(status); +} + +usage() +{ + fprintf(stderr,"usage: doscp [-r] dosdev:filename wegafilename\n"); + fprintf(stderr," doscp [-r] dosdev:filename [dosdev:filename] [...] wegadirname\n"); + fprintf(stderr," doscp [-r] wegafilename dosdev:filename\n"); + fprintf(stderr," doscp [-r] wegafilename [wegafilename] [...] dosdev:dirname\n"); + exit(1); +} diff --git a/WEGA/src/cmd/doscopy/dosout.c b/WEGA/src/cmd/doscopy/dosout.c new file mode 100644 index 0000000..4d29fb3 --- /dev/null +++ b/WEGA/src/cmd/doscopy/dosout.c @@ -0,0 +1,81 @@ +/************************************************************************** +*************************************************************************** + + W E G A - Quelle (C) TU KMSt / ZFT/KEAW Abt. WAE - 1988 + Programm: dosout.c + + Bearbeiter : P. Hoge + Datum : 24.11.89 + Version : 1.3 + +*************************************************************************** +**************************************************************************/ + +#include "dos.h" + +/* dosout + * Gibt die Datei, welche durch 'file' + * gekennzeichnet wird, in das File 'out' aus. + * 'conv' zeigt Newlinekonvertierung an. + * dosout liefert -1 bei Lesefehler und + * -2 bei Schreibfehler + */ +dosout(file,out,dp,conv) +struct dostat *file; +int out; +register struct dosdisc *dp; +int conv; +{ + register clustsiz = dp->clustsiz; + register i, j, len; + long adr, z; + unsigned next = file->first; + char last = 0; + char *buf, *outbuf, *malloc(); + + outbuf = malloc(clustsiz+1); + buf = &outbuf[1]; + adr = DOSADR(next,clustsiz) + dp->data; + lseek(dp->fd,adr,0); + z = 0; + + while (next) { + len = clustsiz; + if ((long)len > file->dim - z) + len = file->dim - z; + if (len == 0) + break; + + if (read(dp->fd,buf,clustsiz) != clustsiz) + return(-1); + + if (conv) { /* CR LF -> LF */ + for (i=0, j=0; i= file->dim) + break; + + next = dosnxt(dp->fd,next,dp->fat1,dp->fatlen); + adr = DOSADR(next,clustsiz) + dp->data; + lseek(dp->fd,adr,0); + } + return(1); +}