Fix bugs!
This commit is contained in:
parent
099abdcbf1
commit
301c2e9700
@ -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})
|
29
MD_Getc.c
29
MD_Getc.c
@ -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
148
MD_Init.c
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
17
MD_Printf.c
17
MD_Printf.c
@ -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
36
MD_Sendfile.c
Normal 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;
|
||||||
|
}
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user