201 lines
5.6 KiB
C
201 lines
5.6 KiB
C
#include <stdio.h>
|
|
#include <termios.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include "MagiDoor.h"
|
|
|
|
|
|
#if defined(WIN32) || defined(_MSC_VER)
|
|
#define PATH_SEP '\\'
|
|
#else
|
|
#define PATH_SEP '/'
|
|
#endif
|
|
|
|
|
|
MDDoorControl_t mdcontrol;
|
|
|
|
struct termios ttysave;
|
|
|
|
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, 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
|
|
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;
|
|
}
|
|
|
|
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 = (char *)dropfile;
|
|
} else {
|
|
filename++;
|
|
}
|
|
|
|
if (strcasecmp(dropfile, "door.sys") == 0) {
|
|
ret = read_doorsys(dropfile);
|
|
} else if (strcasecmp(dropfile, "door32.sys") == 0) {
|
|
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;
|
|
}
|