diff --git a/WEGA/contrib/wdos/src/wm.c b/WEGA/contrib/wdos/src/wm.c new file mode 100644 index 0000000..fe17e53 --- /dev/null +++ b/WEGA/contrib/wdos/src/wm.c @@ -0,0 +1,666 @@ +/************************************************************************** +*************************************************************************** + + W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1989 + Programm: wm.c + + Bearbeiter : P. Hoge + Datum : 11.12.89 + Version : 1.2 + +*************************************************************************** + + WDOS - Menue-System + +*************************************************************************** +**************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +extern errno; +extern char *getenv(); +extern char *mktemp(); +extern char *strchr(); + +char *home; +char *disks; +char *lp; + +WINDOW *win1, *win2; + +char buf[80]; +char buf1[80]; +char buf2[80]; +char buf3[80]; + +char mbuf[6][50]; + +char idos[] = {"A=\nB=\nC=\nD=\nE=\nF=\n"}; + +main() +{ + register i; + register fd; + register FILE *fp; + + home = getenv("HOME"); + disks = getenv("WDOS_DISKS"); + lp = getenv("WDOS_LP"); + strcpy(buf, home); + strcat(buf, "/.dos"); + if ((fd = open(buf, O_WRONLY|O_CREAT|O_EXCL, 0666)) != -1) + write(fd, idos, sizeof(idos)); /* $HOME/.dos anlegen */ + close(fd); + fp = fopen(buf, "r"); + for (i = 0; i < 6; i++) + fgets(&mbuf[i][0], 50, fp); + fclose(fp); + init(); + + printw("WDOS-Menue Vers. 1.2"); + refresh(); + menu1(); + while (1) { + input("Kommando eingeben:\n"); + switch(buf[0]) { + case 0x0d: + case 0x0a: + mountout(); + continue; + case 0x1a: + wrefresh(curscr); + continue; + case 'h': + case '?': + helping(); + continue; + case '1': + menu1(); + continue; + case '2': + menu2(); + continue; + case 's': + exec3("wdos", 0); + continue; + case 'f': + format(); + continue; + case 'n': + new(); + continue; + case 'u': + unmount(); + continue; + case 'x': + rm(); + continue; + case 'q': + done(); + case '!': /* WEGA Kommando ausfuehren */ + exec3(&buf1[1], 1); + continue; + } + if (strncmp(buf1, "dir", 3) == 0) { + exec1("dosdir "); + continue; + } + if (strncmp(buf1, "ls", 2) == 0) { + exec1("dosls "); + continue; + } + if (strcmp(buf1, "cp") == 0) { + exec2("doscp "); + continue; + } + if (strncmp(buf1, "cpb", 3) == 0) { + exec2("doscp -r "); + continue; + } + if (strcmp(buf1, "r") == 0) { + exec3("wdos -r", 0); + continue; + } + if (strcmp(buf1, "rm") == 0) { + exec2("dosrm "); + continue; + } + if (strncmp(buf1, "mkdir", 5) == 0) { + exec2("dosmkdir "); + continue; + } + if (strncmp(buf1, "rmdir", 5) == 0) { + exec2("dosrmdir "); + continue; + } + if (strncmp(buf1, "cat", 3) == 0) { + exec3("doscat", 1); + continue; + } + if (strncmp(buf1, "ed", 2) == 0) { + edit(); + continue; + } + if (strncmp(buf1, "mf", 2) == 0) { + mounta("/dev"); + continue; + } + if (strncmp(buf1, "mg", 2) == 0) { + mounta("/z/wdoslib/disks"); + continue; + } + if (strncmp(buf1, "ml", 2) == 0) { + mounta(disks); + continue; + } + leaveok(stdscr, TRUE); + mesg("\007Ungueltiges Kommando\n", NULL); + sleep(1); + } +} + +/* + * Initialisierung Menue + */ +init() +{ + int done(); + int i; + + signal(SIGINT, done); + initscr(); + SO = (char *)0; /* Standout-Mode funktioniert nicht korrekt */ + SE = (char *)0; + US = (char *)0; + UE = (char *)0; + goraw(); + win1 = subwin(stdscr,4,80,2,0); + win2 = subwin(stdscr,stdscr->_maxy-7,80,7,0); +} + +/* + * Menue verlassen + */ +done() +{ + signal(SIGINT, done); + highlight(FALSE); + clear(); + refresh(); + gonormal(); + endwin(); + exit(0); +} + +/* + * Eingabe von der Tastatur + */ +input(s) +char *s; +{ + register char *b = buf; + + leaveok(stdscr, TRUE); + mesg(s, NULL); + leaveok(stdscr, FALSE); + buf1[0] = 0; + buf2[0] = 0; + while (1) { + *b = getch(); + if (*b == 0x08) { + if (b > buf) { + b--; + addch(0x08); + addch(0x20); + addch(0x08); + refresh(); + } + continue; + } + if (*b < 0x20) { + *(++b) = 0; + break; + } + addch(*b++); + refresh(); + } + sscanf(buf,"%s %[^\n]", buf1, buf2); +} + +/* + * Menue 1 ausgeben + */ +menu1() +{ + wmove(win1,0,0); + waddstr(win1,"s Start von WDOS | mf mount reale Disk | 2 Menue 2\n"); + waddstr(win1,"r Rueckkehr zu WDOS | mg mount globale Disk | n neue lokale Disk\n"); + waddstr(win1,"h Hilfe | ml mount lokale Disk | f Format Floppy\n"); + waddstr(win1,"q Verlassen Menue | u umount Disk | x Disk loeschen\n"); + wrefresh(win1); + mountout(); +} + +/* + * Menue 2 ausgeben + */ +menu2() +{ + wmove(win1,0,0); + waddstr(win1,"dir Directory | cp Kopieren (text) | 1 Menue 1\n"); + waddstr(win1,"ls Directory | cpb Kopieren (bin) | mkdir Subdirectory erstellen\n"); + waddstr(win1,"cat Anzeigen | | rmdir Subdirectory loeschen\n"); + waddstr(win1,"ed Editieren | ! WEGA-Kommando | rm Datei loeschen\n"); + wrefresh(win1); +} + +/* + * gemountete WDOS-Disks ausgeben + */ +mountout() +{ + register i; + + wmove(win2,0,0); + waddstr(win2,"Physische WDOS-Disks:\n\n"); + for (i = 0; i < 6; i++) + waddstr(win2, &mbuf[i][0]); + if (lp) { + waddstr(win2, "\nDrucker: "); + waddstr(win2, lp); + } + wclrtobot(win2); + wrefresh(win2); +} + +/* + * Help-Datei ausgeben + */ +helping() +{ + register FILE *fp; + + wsavescrn(win2); + fp = fopen("/z/wdoslib/help", "r"); + wpage(fp); + fclose(fp); + input("CR eingeben:"); + wresscrn(win2); +} + +/* + * externe Kommandos starten + */ +exec1(s) +register char *s; +{ + register FILE *fin; + + strcpy(buf, s); + strcat(buf, buf2); + wclear(win2); + wrefresh(win2); + wmesg(win2, buf, NULL); + fin = popen(buf, "r"); + wpage(fin); + if (pclose(fin)) { + input("CR eingeben:"); + clearok(curscr, TRUE); + } + wmesg(win2, "\n", NULL); +} + +/* + * externe Kommandos starten + */ +exec2(s) +register char *s; +{ + wsavescrn(win2); + exec21(s); + wresscrn(win2); +} + +exec21(s, flag) +register char *s; +{ + register FILE *fin; + + strcpy(buf, s); + strcat(buf, buf2); + wclear(win2); + wrefresh(win2); + wmesg(win2, buf, NULL); + fin = popen(buf, "r"); + wpage(fin); + if (pclose(fin)) { + input("CR eingeben:"); + clearok(curscr, TRUE); + } +} + +/* + * externe Kommandos starten + */ +exec3(s, flag) +register char *s; +register flag; +{ + register r; + + strcpy(buf, s); + strcat(buf, " "); + strcat(buf, buf2); + savescrn(); + clear(); + refresh(); + mesg(buf, NULL); + gonormal(); + r = csystem(buf); + goraw(); + if (flag || r) + input("CR eingeben:"); + clearok(curscr, TRUE); + resscrn(); +} + +edit() +{ + register char *s; + register char *p; + + savescrn(); + clear(); + refresh(); + buf1[0] = 0; + sscanf(buf2, "%s", buf1); + p = mktemp("/tmp/wdosed.XXXXXX"); + strcpy(buf, "doscp "); + strcat(buf, buf1); + strcat(buf, " "); + strcat(buf,p); + if (system(buf) == 0) { + if ((s = getenv("wdosed")) == NULL) + s = "vi"; + gonormal(); + strcpy(buf, s); + strcat(buf, " "); + strcat(buf, p); + csystem(buf); + goraw(); + strcpy(buf, "doscp "); + strcat(buf, p); + strcat(buf, " "); + strcat(buf, buf1); + if (system(buf) == 0) + unlink(p); + } + /* input("CR eingeben:"); */ + sleep(1); + clearok(curscr, TRUE); + resscrn(); +} + +/* + * Mount real, global oder local floppy + */ +mounta(p) +register char *p; +{ + register i; + + if (p == 0) { + merror1(); + return; + } + if (buf2[0] == 0) { + mout(p); /* nur Disks ausgeben */ + return; + } + if ((i = mtest()) == -1) + return; + buf1[0] = 0; + sscanf(buf2, "%*[^= ]%s%s", buf1, buf1); + if (buf1[0] == '=') + strcpy(buf2, &buf1[1]); + else + strcpy(buf2, buf1); + if (mname(p)) { + strcpy(&mbuf[i][2], buf2); + strcat(mbuf[i], "\n"); + } + mwrite(); + mountout(); +} + +/* + * Unmount Disk + */ +unmount() +{ + register i; + + if ((i = mtest()) == -1) + return; + strcpy(&mbuf[i][2], "\n"); + mountout(); + mwrite(); +} + +/* + * Mount Tabelle zu $HOME/.dos schreiben + */ +mwrite() +{ + register FILE *fp; + register i; + + strcpy(buf, home); + strcat(buf, "/.dos"); + + fp = fopen(buf, "w+"); + for (i = 0; i < 6; i++) + fputs(&mbuf[i][0], fp); + fclose(fp); +} + +/* + * Test Laufwerk + */ +mtest() +{ + register i; + + i = (buf2[0] | 0x20) - 'a'; + if (i < 0 || i > 5) { + merror("Ungueltiges Laufwerk\n"); + return(-1); + } + return(i); +} + +/* + * Fehler ausgeben + */ +merror(s) +register char *s; +{ + wmove(win2,0,0); + waddstr(win2, s); + wclrtobot(win2); + wrefresh(win2); + sleep(2); + mountout(); +} + +merror1() +{ + merror("Kein lokales Disk-Directory vorhanden\n"); +} + +/* + * Disks ausgeben + */ +mout(p) +register char *p; +{ + register char *m; + register FILE *fin; + + wclear(win2); + wrefresh(win2); + m = "s *"; + if (strncmp(p, "/dev", 4) == 0) + m = " wd* fd*ds*"; + strcpy(buf, "cd "); + strcat(buf, p); + strcat(buf, ";/bin/ls -Cx"); + strcat(buf, m); + fin = popen(buf, "r"); + wpage(fin); + pclose(fin); +} + +/* + * Floppy-Namen eingeben + */ +mname(p) +register char *p; +{ + register i; + + if (buf2[0] == 0) { + mout(p); + input("Disk-Namen eingeben:\n"); + strcpy(buf2, buf1); + if (buf2[0] == 0) + return(0); + } + if (buf2[1] == 0 || buf2[1] == ':') { + if ((i = mtest()) == -1) { + buf2[0] = 0; + return(0); + } + if (mbuf[i][2] == '\n') { + buf2[0] = 0; + merror("Laufwerk nicht definiert\n"); + return(0); + } + strcpy(buf2, &mbuf[i][2]); + buf2[strlen(buf2)-1] = 0; + } + if (buf2[0] != '/') { /* kein vollst. Pfadname */ + strcpy(buf1, buf2); + strcpy(buf2, p); + strcat(buf2, "/"); + strcat(buf2, buf1); + } + return(1); +} + +/* + * Pseudo-Floppy loeschen + */ +rm() +{ + register i; + FILE *fin; + + if (disks == 0) { + merror1(); + return; + } + if (mname(disks) == 0) + return; + if (strncmp(disks, buf2, strlen(disks)) != 0) { + merror("Keine lokale Disk\n"); + return; + } + strcpy(buf3, buf2); + input("\007Disk wird vollstaendig geloescht, ok ? (j/n): \n"); + if (buf[0] != 'j') + return; + if (unlink(buf3)) { + merror("Fehler beim Loeschen\n"); + return; + } + for (i = 0; i < 6; i++) { /* Eintrag in Mount Tab suchen */ + if (strncmp(buf3, &mbuf[i][2], strlen(buf3)) == 0) { + strcpy(&mbuf[i][2], "\n"); + mwrite(); + } + } + mout(disks); +} + + +/* + * Pseudo-Floppy anlegen + */ +new() +{ + if (disks == 0) { + merror1(); + return; + } + if (mname(disks) == 0) + return; + if (strncmp(disks, buf2, strlen(disks)) != 0) { + merror("Keine lokale Disk\n"); + return; + } + strcpy(buf3, buf2); + input("\007Pseudoiskette wird angelegt/formatiert, ok ? (j/n): \n"); + if (buf[0] != 'j') + return; + strcpy(buf2, buf3); + exec21("dosformat "); + mout(disks); /* lokale Disks ausgeben */ +} + +/* + * reale Floppy formatieren + */ +format() +{ + if (buf2[0] == 0) + strcpy(buf2, "/dev/rfd1"); + if (mname("/dev") == 0) + return; + if (strncmp(buf2, "/dev", 4) != 0) { + merror("Keine reale Disk\n"); + return; + } + exec3("dosformat "); /* reale Floppy */ +} + +/* + * Page in win2 ausgeben + */ +static char str5[]="++++++++ naechste Seite mit CR | Abbruch mit 'q' +++++++++++"; +wpage(fp) +register FILE *fp; +{ + register i; + while (1) { + wclear(win2); + i = win2->_maxy-1; + while (i--) { + if (fgets(buf, 80, fp) == NULL) { + wrefresh(win2); + return; + } + waddstr(win2, buf); + } + wrefresh(win2); + input("Naechste Seite mit ctrl-F"); + if (buf[0] != 0x06) + return; + } +}