#include #include #include #define INCL_BASE #include #define PROTOCOL_ASCII 0 #define PROTOCOL_XMODEM 1 #define PROTOCOL_XMODEM1K 2 #define PROTOCOL_YMODEM 3 #define PROTOCOL_ZMODEM 4 #define EMULATE_TTY 0 #define EMULATE_ANSI 1 #define EMULATE_XANSI 2 #define EMULATE_VT100 3 #define ORIG_MAXDENTRY 50 #define MAXDENTRY 200 #define TAGLEN 5 #define NAMELEN 25 #define NUMLEN 29 #define SCRIPTLEN 63 #define RDF_BUFSIZ 80 typedef struct _DDENTRY { char tag[TAGLEN+1]; char name[NAMELEN+1]; char number[NUMLEN+1]; USHORT baud; USHORT parity; USHORT wordlen; USHORT stopbits; USHORT duplex; USHORT protocol; USHORT emulate; char script[SCRIPTLEN+1]; } DDENTRY; static DDENTRY *directory[MAXDENTRY]; static char *dirFileSig_v0 = "TE/2 Directory v1.0"; static char *dirFileSig = "TE/2 Directory v1.00à1"; // -------------------------------------------------------------------------- static int freadStrg(char *buf, FILE *fp); static int fwriteStrg(char *buf, FILE *fp); static int ReadV0Directory(FILE *fp); static int ReadCurrentDirectory(FILE *fp); int ReadDirectoryFile(char *fname); int WriteDirectoryFile(char *fname); // -------------------------------------------------------------------------- // Read an ASCIIZ string from a file, expects 'buf' to be large enough // to hold any conceivable number of characters static int freadStrg(char *buf, FILE *fp) { int i = 0, err = FALSE; char c; do { if (fread(&c, sizeof(char), 1, fp) != 1) { err = TRUE; break; } buf[i++] = c; } while (c); return err; } // Write an ASCIIZ string to a file static int fwriteStrg(char *buf, FILE *fp) { int i = 0, err = FALSE; char c; do { c = buf[i++]; if (fwrite(&c, sizeof(char), 1, fp) != 1) { err = TRUE; break; } } while (c); return err; } // Read a "version 0" directory file into memory. This is the file format // created by TE/2 Version 1.00b. Expects the current position in the // file to be pointing past the header information at the first real entry. static int ReadV0Directory(FILE *fp) { int i, j, err; char buf = 0; for (i = 0; i < ORIG_MAXDENTRY; i++) { if (fread(&buf, sizeof(char), 1, fp) == 1) { if (buf) { if (!directory[i]) directory[i] = calloc(1, sizeof(DDENTRY)); else memset(directory[i], 0, sizeof(DDENTRY)); err = freadStrg(directory[i]->tag, fp); err |= freadStrg(directory[i]->name, fp); err |= freadStrg(directory[i]->number, fp); err |= (fread(&(directory[i]->baud), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->parity), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->wordlen), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->stopbits), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->duplex), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->protocol), sizeof(USHORT), 1, fp) != 1); err |= freadStrg(directory[i]->script, fp); if (err) break; directory[i]->emulate = EMULATE_XANSI; } else if (directory[i]) { free(directory[i]); directory[i] = NULL; } } else break; } if (!err) for (j = i; j < MAXDENTRY; j++) if (directory[j]) { free(directory[j]); directory[j] = NULL; } return (i == ORIG_MAXDENTRY); } // Read a "current" version directory file into memory. This is the file // format created by TE/2 starting with Version 1.00c. Expects the current // position in the file to be pointing past the header information at the // first real entry. static int ReadCurrentDirectory(FILE *fp) { int i, err; char buf = 0; for (i = 0; i < MAXDENTRY; i++) { if (fread(&buf, sizeof(char), 1, fp) == 1) { if (buf) { if (!directory[i]) directory[i] = calloc(1, sizeof(DDENTRY)); else memset(directory[i], 0, sizeof(DDENTRY)); err = freadStrg(directory[i]->tag, fp); err |= freadStrg(directory[i]->name, fp); err |= freadStrg(directory[i]->number, fp); err |= (fread(&(directory[i]->baud), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->parity), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->wordlen), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->stopbits), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->duplex), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->protocol), sizeof(USHORT), 1, fp) != 1); err |= (fread(&(directory[i]->emulate), sizeof(USHORT), 1, fp) != 1); err |= freadStrg(directory[i]->script, fp); if (err) break; } else if (directory[i]) { free(directory[i]); directory[i] = NULL; } } else break; } return (i == MAXDENTRY); } // Read any format directory file into memory. int ReadDirectoryFile(char *fname) { FILE *fp; int i, rVal = FALSE; char buf[RDF_BUFSIZ]; if (fp = fopen(fname, "rb")) { i = strlen(dirFileSig); if (fread(buf, sizeof(char), i, fp) == i) { if (strncmp(buf, dirFileSig, i) == 0) { // Current style directory, second alpha, labeled à1 rVal = ReadCurrentDirectory(fp); } else if (strncmp(buf, dirFileSig_v0, strlen(dirFileSig_v0)) == 0) { // Earliest style, first alpha fseek(fp, (long)(strlen(dirFileSig_v0)), SEEK_SET); rVal = ReadV0Directory(fp); } } fclose(fp); } return rVal; } // Write a directory file of the current format. int WriteDirectoryFile(char *fname) { FILE *fp; int i, err, rVal = FALSE; char c; if (fp = fopen(fname, "wb")) { i = strlen(dirFileSig); if (fwrite(dirFileSig, sizeof(char), i, fp) == i) { for (i = 0; i < MAXDENTRY; i++) { if (directory[i]) { c = 1; if (fwrite(&c, sizeof(char), 1, fp) == 1) { err = fwriteStrg(directory[i]->tag, fp); err |= fwriteStrg(directory[i]->name, fp); err |= fwriteStrg(directory[i]->number, fp); err |= (fwrite(&(directory[i]->baud), sizeof(USHORT), 1, fp) != 1); err |= (fwrite(&(directory[i]->parity), sizeof(USHORT), 1, fp) != 1); err |= (fwrite(&(directory[i]->wordlen), sizeof(USHORT), 1, fp) != 1); err |= (fwrite(&(directory[i]->stopbits), sizeof(USHORT), 1, fp) != 1); err |= (fwrite(&(directory[i]->duplex), sizeof(USHORT), 1, fp) != 1); err |= (fwrite(&(directory[i]->protocol), sizeof(USHORT), 1, fp) != 1); err |= (fwrite(&(directory[i]->emulate), sizeof(USHORT), 1, fp) != 1); err |= fwriteStrg(directory[i]->script, fp); if (err) break; } else break; } else { c = 0; if (fwrite(&c, sizeof(char), 1, fp) != 1) break; } } rVal = (i == MAXDENTRY); } fclose(fp); } return rVal; }