commit 6d635299dbc5fa693506c568879a4d8be6688777 Author: Andrew Pamment Date: Sat Nov 30 15:51:53 2019 +1000 Initial commit diff --git a/MD_Init.c b/MD_Init.c new file mode 100644 index 0000000..c089794 --- /dev/null +++ b/MD_Init.c @@ -0,0 +1,172 @@ +#include +#include "MagiDoor.h" + + +#if defined(WIN32) || defined(_MSC_VER) +#define PATH_SEP '\\' +#else +#define PATH_SEP '/' +#endif + + +MDDoorControl_t mdcontrol; + + + +int read_door32(const char *dropfile) { + FILE *fptr; + char buffer[256]; + char *ptr1; + + fptr = fopen(dropfile, "r"); + if (!fptr) { + return -1; + } + + fgets(buffer, 256, fptr); // com type + fgets(buffer, 256, fptr); // socket handle + mdcontrol.socket = strtol(buffer, NULL, 10); + fgets(buffer, 256, fptr); // baud rate + fgets(buffer, 256, fptr); // BBS ID + fgets(buffer, 256, fptr); // User record pos (1 based) + fgets(buffer, 256, fptr); // User's real name + ptr1 = strrchr(buffer, ' '); + if (ptr1 != NULL) { + *ptr1 = '\0' + ptr1++; + strncpy(mdcontrol.user_firstname, buffer, 32); + strncpy(mdcontrol.user_lastname, ptr1, 32); + } else { + strncpy(mdcontrol.user_firstname, buffer, 32); + memset(mdcontrol.user_lastname, '\0', 32); + } + fgets(buffer, 256, fptr); // User's handle + strncpy(mdcontrol.user_alias, buffer, 32); + + fgets(buffer, 256, fptr); // User's sec level + mdcontrol.user_seclevel = strtol(buffer, NULL, 10); + + fgets(buffer, 256, fptr); // time left (minutes) + mdcontrol.user_timeleft = strtol(buffer, NULL, 10) * 60; + + fgets(buffer, 256, fptr); // emulation + fgets(buffer, 256, fptr); // node no + + mdcontrol.node = strtol(buffer, NULL, 10); +#if defined(WIN32) || defined(_MSC_VER) + WSADATA wsa; + + WSAStartup(WINSOCK_VERSION, &wsa); +#else + mdcontrol.socket = -1; +#endif + return 0; +} + +int read_doorsys(const char *dropfile) { + FILE *fptr; + char buffer[256]; + char *ptr1; + + fptr = fopen(dropfile, "r"); + if (!fptr) { + return -1; + } + + fgets(buffer, 256, fptr); // Comport + fgets(buffer, 256, fptr); // Ebaud + fgets(buffer, 256, fptr); // data bits + fgets(buffer, 256, fptr); // node number + mdcontrol.node = strtol(buffer, NULL, 10); + + fgets(buffer, 256, fptr); // Lbaud + fgets(buffer, 256, fptr); // Screen Display + fgets(buffer, 256, fptr); // Printer On + fgets(buffer, 256, fptr); // Page Bell + fgets(buffer, 256, fptr); // Caller alarm + fgets(buffer, 256, fptr); // User Name + ptr1 = strrchr(buffer, ' '); + if (ptr1 != NULL) { + *ptr1 = '\0' + ptr1++; + strncpy(mdcontrol.user_firstname, buffer, 32); + strncpy(mdcontrol.user_lastname, ptr1, 32); + } else { + strncpy(mdcontrol.user_firstname, buffer, 32); + memset(mdcontrol.user_lastname, '\0', 32); + } + fgets(buffer, 256, fptr); // Location + strncpy(mdcontrol.user_location, 32); + + fgets(buffer, 256, fptr); // voice phone + fgets(buffer, 256, fptr); // data phone + fgets(buffer, 256, fptr); // password + fgets(buffer, 256, fptr); // sec level + mdcontrol.user_seclevel = strtol(buffer, NULL, 10); + + fgets(buffer, 256, fptr); // calls + fgets(buffer, 256, fptr); // last login + fgets(buffer, 256, fptr); // time left (seconds) + mdcontrol.user_timeleft = strtol(buffer, NULL, 10); + + fgets(buffer, 256, fptr); // time left (minutes) + fgets(buffer, 256, fptr); // graphics + fgets(buffer, 256, fptr); // screen len + fgets(buffer, 256, fptr); // usermode + fgets(buffer, 256, fptr); // extra 1 + fgets(buffer, 256, fptr); // extra 2 + fgets(buffer, 256, fptr); // expiry date + fgets(buffer, 256, fptr); // rec num + fgets(buffer, 256, fptr); // protocol + fgets(buffer, 256, fptr); // uploads + fgets(buffer, 256, fptr); // downloads + fgets(buffer, 256, fptr); // Lim down k + fgets(buffer, 256, fptr); // Lim down k2 + fgets(buffer, 256, fptr); // DOB + fgets(buffer, 256, fptr); // User Base + fgets(buffer, 256, fptr); // Message Base + fgets(buffer, 256, fptr); // Sysop Name + strncpy(mdcontrol.sysop_name, buffer, 32); + + fgets(buffer, 256, fptr); // Handle + strncpy(mdcontrol.user_alias, buffer, 32); + + fgets(buffer, 256, fptr); // Next Event + fgets(buffer, 256, fptr); // Error Free + fgets(buffer, 256, fptr); // Always N + fgets(buffer, 256, fptr); // Always Y + fgets(buffer, 256, fptr); // Def Colour + fgets(buffer, 256, fptr); // Always 0 + fgets(buffer, 256, fptr); // Last Login 2 + fgets(buffer, 256, fptr); // Time Login + fgets(buffer, 256, fptr); // Last Login Time + fgets(buffer, 256, fptr); // Max Integer + fgets(buffer, 256, fptr); // Downs today + fgets(buffer, 256, fptr); // Upload K + fgets(buffer, 256, fptr); // Download K + fgets(buffer, 256, fptr); // Comment + fgets(buffer, 256, fptr); // Always 0 + fgets(buffer, 256, fptr); // posted + + fclose(fptr); + + mdcontrol.socket = -1; + + return 0; +} + +int md_init(const char *dropfile) { + char *filename = strrchr(dropfile, PATH_SEP); + + if (filename == NULL) { + filename = dropfile; + } else { + filename++; + } + + if (strcasecmp(dropfile, "door.sys") == 0) { + return read_doorsys(dropfile); + } else if (strcasecmp(dropfile, "door32.sys") == 0) { + return read_door32(dropfile); + } +} diff --git a/MD_Printf.c b/MD_Printf.c new file mode 100644 index 0000000..cb94732 --- /dev/null +++ b/MD_Printf.c @@ -0,0 +1,121 @@ +#include +#include + +void md_putchar(char c) { + if (mdcontrol.socket == -1) { + putchar(c); + } else { + send(mdcontrol.socket, &c, 1, 0); + } +} + +void md_printcode(char *code) { + char *part; + int bright = 0; + int colour = 0; + int bgcolour = 0; + char codebuffer[10]; + + part = strtok(code, ' '); + if (part != NULL) { + if (strcmp(part, "bright") == 0) { + bright = 1; + } else if (strcmp(part, "black") == 0) { + colour = 0; + } else if (strcmp(part, "red") == 0) { + colour = 1; + } else if (strcmp(part, "green") == 0) { + colour = 2; + } else if (strcmp(part, "yellow") == 0) { + colour = 3; + } else if (strcmp(part, "blue") == 0) { + colour = 4; + } else if (strcmp(part, "magenta") == 0) { + colour = 5; + } else if (strcmp(part, "cyan") == 0) { + colour = 6; + } else if (strcmp(part, "white") == 0) { + colour = 7; + } + part = strtok(NULL, ' '); + if (part != NULL) { + if (bright == 0) { + bgcolour = colour; + colour = 0; + } + if (strcmp(part, "bright") == 0) { + bright = 1; + part = strtok(NULL, ' '); + } + if (part != NULL) { + + if (strcmp(part, "black") == 0) { + colour = 0; + } else if (strcmp(part, "red") == 0) { + colour = 1; + } else if (strcmp(part, "green") == 0) { + colour = 2; + } else if (strcmp(part, "yellow") == 0) { + colour = 3; + } else if (strcmp(part, "blue") == 0) { + colour = 4; + } else if (strcmp(part, "magenta") == 0) { + colour = 5; + } else if (strcmp(part, "cyan") == 0) { + colour = 6; + } else if (strcmp(part, "white") == 0) { + colour = 7; + } + } + } + } + + snprintf(codebuffer, 10, "\027[%d;4%d;3%dm", bright, bgcolour, colour); + + for (i=0;i<10;i++) { + md_putchar(codebuffer[i]); + } +} + +void md_printf(const char *fmt, ...) { + char buffer[4096]; + char codebuf[128]; + va_list ap; + + va_start(ap, fmt); + vsnprintf(buffer, sizeof buffer, fmt, ap); + va_end(ap) + + char *ptr; + char *cbptr; + ptr = buffer; + while (*ptr != '\0') { + if (*ptr == '`') { + ptr++; + if (*ptr == '`') { + md_putchar('`'); + ptr++; + continue; + } else if (*ptr == '\0') { + break; + } + cbptr = codebuf; + while(*ptr != '`' && *ptr != '\0' && cbptr - codebuf < 127) { + *cbptr = *ptr; + ptr++; + cbptr++; + *cbptr = '\0'; + } + + md_printcode(codebuf); + + if (*ptr == '\0') { + break; + } + ptr++; + continue; + } + md_putchar(*ptr); + ptr++; + } +} diff --git a/MagiDoor.h b/MagiDoor.h new file mode 100644 index 0000000..e100e9d --- /dev/null +++ b/MagiDoor.h @@ -0,0 +1,21 @@ +#ifndef __MAGIDOOR_H__ +#define __MAGIDOOR_H__ + + +typedef struct MDDoorControl { + char user_alias[32]; + char user_firstname[32]; + char user_lastname[32]; + int user_timeleft; + char sysop_name[32]; + int node; + char user_location[32]; + int user_seclevel; + int socket; +} MDDoorControl_t; + +extern MDDoorControl_t mdcontrol; + +extern int md_init(const char *dropfile); + +#endif \ No newline at end of file