Fix bugs!

This commit is contained in:
Andrew Pamment 2019-12-01 14:07:39 +10:00
parent 099abdcbf1
commit 301c2e9700
6 changed files with 158 additions and 81 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.6) cmake_minimum_required(VERSION 3.6)
project(magidoor) 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}) add_library(mdoor STATIC ${SOURCE_FILES})

View File

@ -17,34 +17,47 @@ char md_getc() {
md_exit(0); md_exit(0);
} }
if (ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { if (ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
sleep(1); usleep(1);
continue; continue;
} }
return c; return c;
} }
} }
int md_getstring(char *ptr, int maxlen) { int md_getstring(char *ptr, int maxlen, char minchar, char maxchar) {
char c; char c;
int len = 0; int len = 0;
static char lastc = 'x';
while (len < maxlen) { while (len < maxlen) {
c = md_getc(); c = md_getc();
if (c == '\n' || c == '\0') { if (c == '\n' || c == '\0') {
continue; lastc = c;
if (lastc == '\r') {
continue;
} else {
return len;
}
} }
if (c == '\r') { if (c == '\r') {
lastc = c;
return len; return len;
} else if (c == '\b' || c == 127) { }
if (c == '\b' || c == 127) {
if (len > 0) { if (len > 0) {
md_printf("\027[D \027[D"); md_printf("\x1b[D \x1b[D");
len--; len--;
ptr[len] = '\0'; ptr[len] = '\0';
} }
lastc = c;
continue; continue;
} }
ptr[len++] = c; if (c >= minchar && c <= maxchar) {
ptr[len] = '\0'; ptr[len++] = c;
md_putchar(c); ptr[len] = '\0';
md_putchar(c);
}
lastc = c;
} }
return len; return len;

148
MD_Init.c
View File

@ -17,6 +17,16 @@ MDDoorControl_t mdcontrol;
struct termios ttysave; 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) { int read_door32(const char *dropfile) {
FILE *fptr; FILE *fptr;
char buffer[256]; char buffer[256];
@ -27,13 +37,13 @@ int read_door32(const char *dropfile) {
return -1; return -1;
} }
fgets(buffer, 256, fptr); // com type md_cfg_read_line(buffer, 256, fptr); // com type
fgets(buffer, 256, fptr); // socket handle md_cfg_read_line(buffer, 256, fptr); // socket handle
mdcontrol.socket = strtol(buffer, NULL, 10); mdcontrol.socket = strtol(buffer, NULL, 10);
fgets(buffer, 256, fptr); // baud rate md_cfg_read_line(buffer, 256, fptr); // baud rate
fgets(buffer, 256, fptr); // BBS ID md_cfg_read_line(buffer, 256, fptr); // BBS ID
fgets(buffer, 256, fptr); // User record pos (1 based) md_cfg_read_line(buffer, 256, fptr); // User record pos (1 based)
fgets(buffer, 256, fptr); // User's real name md_cfg_read_line(buffer, 256, fptr); // User's real name
ptr1 = strrchr(buffer, ' '); ptr1 = strrchr(buffer, ' ');
if (ptr1 != NULL) { if (ptr1 != NULL) {
*ptr1 = '\0'; *ptr1 = '\0';
@ -44,17 +54,17 @@ int read_door32(const char *dropfile) {
strncpy(mdcontrol.user_firstname, buffer, 32); strncpy(mdcontrol.user_firstname, buffer, 32);
memset(mdcontrol.user_lastname, '\0', 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); 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); 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; mdcontrol.user_timeleft = strtol(buffer, NULL, 10) * 60;
fgets(buffer, 256, fptr); // emulation md_cfg_read_line(buffer, 256, fptr); // emulation
fgets(buffer, 256, fptr); // node no md_cfg_read_line(buffer, 256, fptr); // node no
mdcontrol.node = strtol(buffer, NULL, 10); mdcontrol.node = strtol(buffer, NULL, 10);
#if defined(WIN32) || defined(_MSC_VER) #if defined(WIN32) || defined(_MSC_VER)
@ -77,18 +87,18 @@ int read_doorsys(const char *dropfile) {
return -1; return -1;
} }
fgets(buffer, 256, fptr); // Comport md_cfg_read_line(buffer, 256, fptr); // Comport
fgets(buffer, 256, fptr); // Ebaud md_cfg_read_line(buffer, 256, fptr); // Ebaud
fgets(buffer, 256, fptr); // data bits md_cfg_read_line(buffer, 256, fptr); // data bits
fgets(buffer, 256, fptr); // node number md_cfg_read_line(buffer, 256, fptr); // node number
mdcontrol.node = strtol(buffer, NULL, 10); mdcontrol.node = strtol(buffer, NULL, 10);
fgets(buffer, 256, fptr); // Lbaud md_cfg_read_line(buffer, 256, fptr); // Lbaud
fgets(buffer, 256, fptr); // Screen Display md_cfg_read_line(buffer, 256, fptr); // Screen Display
fgets(buffer, 256, fptr); // Printer On md_cfg_read_line(buffer, 256, fptr); // Printer On
fgets(buffer, 256, fptr); // Page Bell md_cfg_read_line(buffer, 256, fptr); // Page Bell
fgets(buffer, 256, fptr); // Caller alarm md_cfg_read_line(buffer, 256, fptr); // Caller alarm
fgets(buffer, 256, fptr); // User Name md_cfg_read_line(buffer, 256, fptr); // User Name
ptr1 = strrchr(buffer, ' '); ptr1 = strrchr(buffer, ' ');
if (ptr1 != NULL) { if (ptr1 != NULL) {
*ptr1 = '\0'; *ptr1 = '\0';
@ -99,58 +109,58 @@ int read_doorsys(const char *dropfile) {
strncpy(mdcontrol.user_firstname, buffer, 32); strncpy(mdcontrol.user_firstname, buffer, 32);
memset(mdcontrol.user_lastname, '\0', 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); strncpy(mdcontrol.user_location, buffer, 32);
fgets(buffer, 256, fptr); // voice phone md_cfg_read_line(buffer, 256, fptr); // voice phone
fgets(buffer, 256, fptr); // data phone md_cfg_read_line(buffer, 256, fptr); // data phone
fgets(buffer, 256, fptr); // password md_cfg_read_line(buffer, 256, fptr); // password
fgets(buffer, 256, fptr); // sec level md_cfg_read_line(buffer, 256, fptr); // sec level
mdcontrol.user_seclevel = strtol(buffer, NULL, 10); mdcontrol.user_seclevel = strtol(buffer, NULL, 10);
fgets(buffer, 256, fptr); // calls md_cfg_read_line(buffer, 256, fptr); // calls
fgets(buffer, 256, fptr); // last login md_cfg_read_line(buffer, 256, fptr); // last login
fgets(buffer, 256, fptr); // time left (seconds) md_cfg_read_line(buffer, 256, fptr); // time left (seconds)
mdcontrol.user_timeleft = strtol(buffer, NULL, 10); mdcontrol.user_timeleft = strtol(buffer, NULL, 10);
fgets(buffer, 256, fptr); // time left (minutes) md_cfg_read_line(buffer, 256, fptr); // time left (minutes)
fgets(buffer, 256, fptr); // graphics md_cfg_read_line(buffer, 256, fptr); // graphics
fgets(buffer, 256, fptr); // screen len md_cfg_read_line(buffer, 256, fptr); // screen len
fgets(buffer, 256, fptr); // usermode md_cfg_read_line(buffer, 256, fptr); // usermode
fgets(buffer, 256, fptr); // extra 1 md_cfg_read_line(buffer, 256, fptr); // extra 1
fgets(buffer, 256, fptr); // extra 2 md_cfg_read_line(buffer, 256, fptr); // extra 2
fgets(buffer, 256, fptr); // expiry date md_cfg_read_line(buffer, 256, fptr); // expiry date
fgets(buffer, 256, fptr); // rec num md_cfg_read_line(buffer, 256, fptr); // rec num
fgets(buffer, 256, fptr); // protocol md_cfg_read_line(buffer, 256, fptr); // protocol
fgets(buffer, 256, fptr); // uploads md_cfg_read_line(buffer, 256, fptr); // uploads
fgets(buffer, 256, fptr); // downloads md_cfg_read_line(buffer, 256, fptr); // downloads
fgets(buffer, 256, fptr); // Lim down k md_cfg_read_line(buffer, 256, fptr); // Lim down k
fgets(buffer, 256, fptr); // Lim down k2 md_cfg_read_line(buffer, 256, fptr); // Lim down k2
fgets(buffer, 256, fptr); // DOB md_cfg_read_line(buffer, 256, fptr); // DOB
fgets(buffer, 256, fptr); // User Base md_cfg_read_line(buffer, 256, fptr); // User Base
fgets(buffer, 256, fptr); // Message Base md_cfg_read_line(buffer, 256, fptr); // Message Base
fgets(buffer, 256, fptr); // Sysop Name md_cfg_read_line(buffer, 256, fptr); // Sysop Name
strncpy(mdcontrol.sysop_name, buffer, 32); 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); strncpy(mdcontrol.user_alias, buffer, 32);
fgets(buffer, 256, fptr); // Next Event md_cfg_read_line(buffer, 256, fptr); // Next Event
fgets(buffer, 256, fptr); // Error Free md_cfg_read_line(buffer, 256, fptr); // Error Free
fgets(buffer, 256, fptr); // Always N md_cfg_read_line(buffer, 256, fptr); // Always N
fgets(buffer, 256, fptr); // Always Y md_cfg_read_line(buffer, 256, fptr); // Always Y
fgets(buffer, 256, fptr); // Def Colour md_cfg_read_line(buffer, 256, fptr); // Def Colour
fgets(buffer, 256, fptr); // Always 0 md_cfg_read_line(buffer, 256, fptr); // Always 0
fgets(buffer, 256, fptr); // Last Login 2 md_cfg_read_line(buffer, 256, fptr); // Last Login 2
fgets(buffer, 256, fptr); // Time Login md_cfg_read_line(buffer, 256, fptr); // Time Login
fgets(buffer, 256, fptr); // Last Login Time md_cfg_read_line(buffer, 256, fptr); // Last Login Time
fgets(buffer, 256, fptr); // Max Integer md_cfg_read_line(buffer, 256, fptr); // Max Integer
fgets(buffer, 256, fptr); // Downs today md_cfg_read_line(buffer, 256, fptr); // Downs today
fgets(buffer, 256, fptr); // Upload K md_cfg_read_line(buffer, 256, fptr); // Upload K
fgets(buffer, 256, fptr); // Download K md_cfg_read_line(buffer, 256, fptr); // Download K
fgets(buffer, 256, fptr); // Comment md_cfg_read_line(buffer, 256, fptr); // Comment
fgets(buffer, 256, fptr); // Always 0 md_cfg_read_line(buffer, 256, fptr); // Always 0
fgets(buffer, 256, fptr); // posted md_cfg_read_line(buffer, 256, fptr); // posted
fclose(fptr); fclose(fptr);
@ -181,9 +191,9 @@ int md_init(const char *dropfile) {
filename++; filename++;
} }
if (strcasecmp(dropfile, "door.sys") == 0) { if (strcasecmp(filename, "door.sys") == 0) {
ret = read_doorsys(dropfile); ret = read_doorsys(dropfile);
} else if (strcasecmp(dropfile, "door32.sys") == 0) { } else if (strcasecmp(filename, "door32.sys") == 0) {
ret = read_door32(dropfile); ret = read_door32(dropfile);
} }
@ -191,8 +201,12 @@ int md_init(const char *dropfile) {
tcgetattr(STDIN_FILENO, &ttystate); tcgetattr(STDIN_FILENO, &ttystate);
ttysave = ttystate; ttysave = ttystate;
ttystate.c_lflag &= ~(ICANON | ECHO); ttystate.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO);
ttystate.c_cc[VMIN] = 1; 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); tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
} }

View File

@ -1,23 +1,32 @@
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <sys/socket.h> #include <sys/socket.h>
#include "MagiDoor.h" #include "MagiDoor.h"
void md_putchar(char c) { void md_putchar(char c) {
if (mdcontrol.socket == -1) { if (mdcontrol.socket == -1) {
putchar(c); write(STDOUT_FILENO, &c, 1);
} else { } else {
send(mdcontrol.socket, &c, 1, 0); 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) { void md_printcode(char *code) {
char *part; char *part;
int bright = 0; int bright = 0;
int colour = 0; int colour = 0;
int bgcolour = 0; int bgcolour = 0;
char codebuffer[10]; char codebuffer[11];
int i; int i;
part = strtok(code, " "); 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]); md_putchar(codebuffer[i]);
} }
} }

36
MD_Sendfile.c Normal file
View File

@ -0,0 +1,36 @@
#include <stdio.h>
#include <ctype.h>
#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;
}

View File

@ -1,6 +1,8 @@
#ifndef __MAGIDOOR_H__ #ifndef __MAGIDOOR_H__
#define __MAGIDOOR_H__ #define __MAGIDOOR_H__
#define TRUE 1
#define FALSE 0
typedef struct MDDoorControl { typedef struct MDDoorControl {
char user_alias[32]; char user_alias[32];
@ -21,5 +23,8 @@ extern void md_exit(int exitcode);
extern void md_putchar(char c); extern void md_putchar(char c);
extern void md_printf(const char *fmt, ...); extern void md_printf(const char *fmt, ...);
extern char md_getc(); 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 #endif