new
This commit is contained in:
parent
9583f06e4d
commit
47686fbb09
|
|
@ -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 <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
|
@ -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<len; i++) {
|
||||||
|
if (last && buf[i] != 0x0a)
|
||||||
|
outbuf[j++] = last;
|
||||||
|
last = 0;
|
||||||
|
if (buf[i] == 0x1a)
|
||||||
|
break; /* Dateiende */
|
||||||
|
if (buf[i] == 0x0d) {
|
||||||
|
last++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
outbuf[j++] = buf[i];
|
||||||
|
}
|
||||||
|
if (write(out, outbuf, j) != j)
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
else { /* Binary-Copy */
|
||||||
|
if (write(out, buf, len) != len)
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
z += len;
|
||||||
|
if (z >= 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);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue