diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..eafe9ce --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.6) +project(magidoor) + +set(SOURCE_FILES 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 new file mode 100644 index 0000000..184750d --- /dev/null +++ b/MD_Getc.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include "MagiDoor.h" + +char md_getc() { + char c; + ssize_t ret; + while (1) { + if (mdcontrol.socket == -1) { + ret = read(STDIN_FILENO, &c, 1); + } else { + ret = recv(mdcontrol.socket, &c, 1, 0); + } + if (ret == 0) { + md_exit(0); + } + if (ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { + sleep(1); + continue; + } + md_putchar(c); + return c; + } +} \ No newline at end of file diff --git a/MD_Init.c b/MD_Init.c index c089794..3c15a40 100644 --- a/MD_Init.c +++ b/MD_Init.c @@ -1,4 +1,8 @@ #include +#include +#include +#include +#include #include "MagiDoor.h" @@ -11,7 +15,7 @@ MDDoorControl_t mdcontrol; - +struct termios ttysave; int read_door32(const char *dropfile) { FILE *fptr; @@ -32,7 +36,7 @@ int read_door32(const char *dropfile) { fgets(buffer, 256, fptr); // User's real name ptr1 = strrchr(buffer, ' '); if (ptr1 != NULL) { - *ptr1 = '\0' + *ptr1 = '\0'; ptr1++; strncpy(mdcontrol.user_firstname, buffer, 32); strncpy(mdcontrol.user_lastname, ptr1, 32); @@ -87,7 +91,7 @@ int read_doorsys(const char *dropfile) { fgets(buffer, 256, fptr); // User Name ptr1 = strrchr(buffer, ' '); if (ptr1 != NULL) { - *ptr1 = '\0' + *ptr1 = '\0'; ptr1++; strncpy(mdcontrol.user_firstname, buffer, 32); strncpy(mdcontrol.user_lastname, ptr1, 32); @@ -96,7 +100,7 @@ int read_doorsys(const char *dropfile) { memset(mdcontrol.user_lastname, '\0', 32); } fgets(buffer, 256, fptr); // Location - strncpy(mdcontrol.user_location, 32); + strncpy(mdcontrol.user_location, buffer, 32); fgets(buffer, 256, fptr); // voice phone fgets(buffer, 256, fptr); // data phone @@ -155,18 +159,42 @@ int read_doorsys(const char *dropfile) { return 0; } +void md_exit(int exitcode) { + if (mdcontrol.socket == -1) { + tcsetattr(STDIN_FILENO, TCSANOW, &ttysave); + } else { +#if defined(WIN32) || defined (_MSC_VER) + WSACleanup(); +#endif + } + exit(exitcode); +} + int md_init(const char *dropfile) { char *filename = strrchr(dropfile, PATH_SEP); + struct termios ttystate; + int ret; if (filename == NULL) { - filename = dropfile; + filename = (char *)dropfile; } else { filename++; } if (strcasecmp(dropfile, "door.sys") == 0) { - return read_doorsys(dropfile); + ret = read_doorsys(dropfile); } else if (strcasecmp(dropfile, "door32.sys") == 0) { - return read_door32(dropfile); + ret = read_door32(dropfile); } + + if (mdcontrol.socket == -1) { + tcgetattr(STDIN_FILENO, &ttystate); + ttysave = ttystate; + + ttystate.c_lflag &= ~(ICANON | ECHO); + ttystate.c_cc[VMIN] = 1; + tcsetattr(STDIN_FILENO, TCSANOW, &ttystate); + } + + return ret; } diff --git a/MD_Printf.c b/MD_Printf.c index cb94732..0af66c3 100644 --- a/MD_Printf.c +++ b/MD_Printf.c @@ -1,5 +1,8 @@ #include #include +#include +#include +#include "MagiDoor.h" void md_putchar(char c) { if (mdcontrol.socket == -1) { @@ -15,8 +18,9 @@ void md_printcode(char *code) { int colour = 0; int bgcolour = 0; char codebuffer[10]; + int i; - part = strtok(code, ' '); + part = strtok(code, " "); if (part != NULL) { if (strcmp(part, "bright") == 0) { bright = 1; @@ -37,7 +41,7 @@ void md_printcode(char *code) { } else if (strcmp(part, "white") == 0) { colour = 7; } - part = strtok(NULL, ' '); + part = strtok(NULL, " "); if (part != NULL) { if (bright == 0) { bgcolour = colour; @@ -45,7 +49,7 @@ void md_printcode(char *code) { } if (strcmp(part, "bright") == 0) { bright = 1; - part = strtok(NULL, ' '); + part = strtok(NULL, " "); } if (part != NULL) { @@ -84,7 +88,7 @@ void md_printf(const char *fmt, ...) { va_start(ap, fmt); vsnprintf(buffer, sizeof buffer, fmt, ap); - va_end(ap) + va_end(ap); char *ptr; char *cbptr; diff --git a/MagiDoor.h b/MagiDoor.h index e100e9d..f9c5645 100644 --- a/MagiDoor.h +++ b/MagiDoor.h @@ -17,5 +17,8 @@ typedef struct MDDoorControl { extern MDDoorControl_t mdcontrol; extern int md_init(const char *dropfile); - +extern void md_exit(int exitcode); +extern void md_putchar(char c); +extern void md_printf(const char *fmt, ...); +extern char md_getc(); #endif \ No newline at end of file