diff --git a/CMakeLists.txt b/CMakeLists.txt index eafe9ce..92c2318 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.6) project(magidoor) -set(SOURCE_FILES MD_Getc.c MD_Printf.c MD_Init.c MagiDoor.h) +set(SOURCE_FILES MD_Sendfile.c MD_Getc.c MD_Printf.c MD_Init.c MagiDoor.h) add_library(mdoor STATIC ${SOURCE_FILES}) \ No newline at end of file diff --git a/MD_Getc.c b/MD_Getc.c index 3e8550a..c0715c7 100644 --- a/MD_Getc.c +++ b/MD_Getc.c @@ -17,34 +17,47 @@ char md_getc() { md_exit(0); } if (ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { - sleep(1); + usleep(1); continue; } return c; } } -int md_getstring(char *ptr, int maxlen) { +int md_getstring(char *ptr, int maxlen, char minchar, char maxchar) { char c; int len = 0; + static char lastc = 'x'; + while (len < maxlen) { c = md_getc(); if (c == '\n' || c == '\0') { - continue; + lastc = c; + if (lastc == '\r') { + continue; + } else { + return len; + } } if (c == '\r') { + lastc = c; return len; - } else if (c == '\b' || c == 127) { + } + if (c == '\b' || c == 127) { if (len > 0) { - md_printf("\027[D \027[D"); + md_printf("\x1b[D \x1b[D"); len--; ptr[len] = '\0'; } + lastc = c; continue; } - ptr[len++] = c; - ptr[len] = '\0'; - md_putchar(c); + if (c >= minchar && c <= maxchar) { + ptr[len++] = c; + ptr[len] = '\0'; + md_putchar(c); + } + lastc = c; } return len; diff --git a/MD_Init.c b/MD_Init.c index 3c15a40..1b523a1 100644 --- a/MD_Init.c +++ b/MD_Init.c @@ -17,6 +17,16 @@ MDDoorControl_t mdcontrol; struct termios ttysave; +static void md_cfg_read_line(char *buffer, int len, FILE *fptr) { + fgets(buffer, len, fptr); + if (buffer[strlen(buffer) - 1] == '\n') { + buffer[strlen(buffer) - 1] = '\0'; + } + if (buffer[strlen(buffer) - 1] == '\r') { + buffer[strlen(buffer) - 1] = '\0'; + } +} + int read_door32(const char *dropfile) { FILE *fptr; char buffer[256]; @@ -27,13 +37,13 @@ int read_door32(const char *dropfile) { return -1; } - fgets(buffer, 256, fptr); // com type - fgets(buffer, 256, fptr); // socket handle + md_cfg_read_line(buffer, 256, fptr); // com type + md_cfg_read_line(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 + md_cfg_read_line(buffer, 256, fptr); // baud rate + md_cfg_read_line(buffer, 256, fptr); // BBS ID + md_cfg_read_line(buffer, 256, fptr); // User record pos (1 based) + md_cfg_read_line(buffer, 256, fptr); // User's real name ptr1 = strrchr(buffer, ' '); if (ptr1 != NULL) { *ptr1 = '\0'; @@ -44,17 +54,17 @@ int read_door32(const char *dropfile) { strncpy(mdcontrol.user_firstname, buffer, 32); memset(mdcontrol.user_lastname, '\0', 32); } - fgets(buffer, 256, fptr); // User's handle + md_cfg_read_line(buffer, 256, fptr); // User's handle strncpy(mdcontrol.user_alias, buffer, 32); - fgets(buffer, 256, fptr); // User's sec level + md_cfg_read_line(buffer, 256, fptr); // User's sec level mdcontrol.user_seclevel = strtol(buffer, NULL, 10); - fgets(buffer, 256, fptr); // time left (minutes) + md_cfg_read_line(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 + md_cfg_read_line(buffer, 256, fptr); // emulation + md_cfg_read_line(buffer, 256, fptr); // node no mdcontrol.node = strtol(buffer, NULL, 10); #if defined(WIN32) || defined(_MSC_VER) @@ -77,18 +87,18 @@ int read_doorsys(const char *dropfile) { return -1; } - fgets(buffer, 256, fptr); // Comport - fgets(buffer, 256, fptr); // Ebaud - fgets(buffer, 256, fptr); // data bits - fgets(buffer, 256, fptr); // node number + md_cfg_read_line(buffer, 256, fptr); // Comport + md_cfg_read_line(buffer, 256, fptr); // Ebaud + md_cfg_read_line(buffer, 256, fptr); // data bits + md_cfg_read_line(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 + md_cfg_read_line(buffer, 256, fptr); // Lbaud + md_cfg_read_line(buffer, 256, fptr); // Screen Display + md_cfg_read_line(buffer, 256, fptr); // Printer On + md_cfg_read_line(buffer, 256, fptr); // Page Bell + md_cfg_read_line(buffer, 256, fptr); // Caller alarm + md_cfg_read_line(buffer, 256, fptr); // User Name ptr1 = strrchr(buffer, ' '); if (ptr1 != NULL) { *ptr1 = '\0'; @@ -99,58 +109,58 @@ int read_doorsys(const char *dropfile) { strncpy(mdcontrol.user_firstname, buffer, 32); memset(mdcontrol.user_lastname, '\0', 32); } - fgets(buffer, 256, fptr); // Location + md_cfg_read_line(buffer, 256, fptr); // Location strncpy(mdcontrol.user_location, buffer, 32); - fgets(buffer, 256, fptr); // voice phone - fgets(buffer, 256, fptr); // data phone - fgets(buffer, 256, fptr); // password - fgets(buffer, 256, fptr); // sec level + md_cfg_read_line(buffer, 256, fptr); // voice phone + md_cfg_read_line(buffer, 256, fptr); // data phone + md_cfg_read_line(buffer, 256, fptr); // password + md_cfg_read_line(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) + md_cfg_read_line(buffer, 256, fptr); // calls + md_cfg_read_line(buffer, 256, fptr); // last login + md_cfg_read_line(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 + md_cfg_read_line(buffer, 256, fptr); // time left (minutes) + md_cfg_read_line(buffer, 256, fptr); // graphics + md_cfg_read_line(buffer, 256, fptr); // screen len + md_cfg_read_line(buffer, 256, fptr); // usermode + md_cfg_read_line(buffer, 256, fptr); // extra 1 + md_cfg_read_line(buffer, 256, fptr); // extra 2 + md_cfg_read_line(buffer, 256, fptr); // expiry date + md_cfg_read_line(buffer, 256, fptr); // rec num + md_cfg_read_line(buffer, 256, fptr); // protocol + md_cfg_read_line(buffer, 256, fptr); // uploads + md_cfg_read_line(buffer, 256, fptr); // downloads + md_cfg_read_line(buffer, 256, fptr); // Lim down k + md_cfg_read_line(buffer, 256, fptr); // Lim down k2 + md_cfg_read_line(buffer, 256, fptr); // DOB + md_cfg_read_line(buffer, 256, fptr); // User Base + md_cfg_read_line(buffer, 256, fptr); // Message Base + md_cfg_read_line(buffer, 256, fptr); // Sysop Name strncpy(mdcontrol.sysop_name, buffer, 32); - fgets(buffer, 256, fptr); // Handle + md_cfg_read_line(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 + md_cfg_read_line(buffer, 256, fptr); // Next Event + md_cfg_read_line(buffer, 256, fptr); // Error Free + md_cfg_read_line(buffer, 256, fptr); // Always N + md_cfg_read_line(buffer, 256, fptr); // Always Y + md_cfg_read_line(buffer, 256, fptr); // Def Colour + md_cfg_read_line(buffer, 256, fptr); // Always 0 + md_cfg_read_line(buffer, 256, fptr); // Last Login 2 + md_cfg_read_line(buffer, 256, fptr); // Time Login + md_cfg_read_line(buffer, 256, fptr); // Last Login Time + md_cfg_read_line(buffer, 256, fptr); // Max Integer + md_cfg_read_line(buffer, 256, fptr); // Downs today + md_cfg_read_line(buffer, 256, fptr); // Upload K + md_cfg_read_line(buffer, 256, fptr); // Download K + md_cfg_read_line(buffer, 256, fptr); // Comment + md_cfg_read_line(buffer, 256, fptr); // Always 0 + md_cfg_read_line(buffer, 256, fptr); // posted fclose(fptr); @@ -181,9 +191,9 @@ int md_init(const char *dropfile) { filename++; } - if (strcasecmp(dropfile, "door.sys") == 0) { + if (strcasecmp(filename, "door.sys") == 0) { ret = read_doorsys(dropfile); - } else if (strcasecmp(dropfile, "door32.sys") == 0) { + } else if (strcasecmp(filename, "door32.sys") == 0) { ret = read_door32(dropfile); } @@ -191,8 +201,12 @@ int md_init(const char *dropfile) { tcgetattr(STDIN_FILENO, &ttystate); ttysave = ttystate; - ttystate.c_lflag &= ~(ICANON | ECHO); - ttystate.c_cc[VMIN] = 1; + ttystate.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO); + ttystate.c_iflag &= ~(BRKINT | ICRNL | IGNBRK | IGNCR | INLCR | INPCK | ISTRIP | IXON | PARMRK); + ttystate.c_oflag &= ~OPOST; + ttystate.c_cc[VMIN] = 1; + ttystate.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSANOW, &ttystate); } diff --git a/MD_Printf.c b/MD_Printf.c index 0af66c3..28cfa35 100644 --- a/MD_Printf.c +++ b/MD_Printf.c @@ -1,23 +1,32 @@ #include #include #include +#include #include #include "MagiDoor.h" void md_putchar(char c) { if (mdcontrol.socket == -1) { - putchar(c); + write(STDOUT_FILENO, &c, 1); } else { send(mdcontrol.socket, &c, 1, 0); } } +void md_set_cursor(int y, int x) { + md_printf("\x1b[%d;%dH", y, x); +} + +void md_clr_scr() { + md_printf("\x1b[2J\x1b[1;1H"); +} + void md_printcode(char *code) { char *part; int bright = 0; int colour = 0; int bgcolour = 0; - char codebuffer[10]; + char codebuffer[11]; int i; part = strtok(code, " "); @@ -74,9 +83,9 @@ void md_printcode(char *code) { } } - snprintf(codebuffer, 10, "\027[%d;4%d;3%dm", bright, bgcolour, colour); + snprintf(codebuffer, 11, "\x1b[%d;4%d;3%dm", bright, bgcolour, colour); - for (i=0;i<10;i++) { + for (i=0;i<11;i++) { md_putchar(codebuffer[i]); } } diff --git a/MD_Sendfile.c b/MD_Sendfile.c new file mode 100644 index 0000000..cb4a746 --- /dev/null +++ b/MD_Sendfile.c @@ -0,0 +1,36 @@ +#include +#include +#include "MagiDoor.h" + +void md_sendfile(const char *filename, int pause) { + FILE *fptr; + char c; + int lines = 0; + fptr = fopen(filename, "r"); + if (fptr != NULL) { + c = fgetc(fptr); + while (!feof(fptr) && c != 0x1a) { + if (c == '\n') { + lines++; + md_printf("\r\n"); + if (lines == 22 && pause == TRUE) { + md_printf("More (Y/N)"); + c = md_getc(); + if (tolower(c) == 'n') { + fclose(fptr); + return; + } + md_printf("\r\n"); + lines = 0; + + } + } else { + md_putchar(c); + } + c = fgetc(fptr); + } + fclose(fptr); + return; + } + return; +} diff --git a/MagiDoor.h b/MagiDoor.h index 4b8381b..dd12ddd 100644 --- a/MagiDoor.h +++ b/MagiDoor.h @@ -1,6 +1,8 @@ #ifndef __MAGIDOOR_H__ #define __MAGIDOOR_H__ +#define TRUE 1 +#define FALSE 0 typedef struct MDDoorControl { char user_alias[32]; @@ -21,5 +23,8 @@ extern void md_exit(int exitcode); extern void md_putchar(char c); extern void md_printf(const char *fmt, ...); extern char md_getc(); -extern int md_getstring(char *ptr, int maxlen); +extern int md_getstring(char *ptr, int maxlen, char minchar, char maxchar); +extern void md_sendfile(const char *filename, int pause); +extern void md_clr_scr(); +extern void md_set_cursor(int y, int x); #endif \ No newline at end of file