some debugging IAC codes in file transfers
This commit is contained in:
parent
4568f58bf1
commit
027c047b42
1
.gitignore
vendored
1
.gitignore
vendored
@ -12,6 +12,7 @@ config/*
|
|||||||
illusion/*
|
illusion/*
|
||||||
scripts/*
|
scripts/*
|
||||||
logs/*
|
logs/*
|
||||||
|
files/*
|
||||||
*.a
|
*.a
|
||||||
deps/lua/lua
|
deps/lua/lua
|
||||||
deps/lua/luac
|
deps/lua/luac
|
||||||
|
65
src/bbs.c
65
src/bbs.c
@ -21,6 +21,8 @@
|
|||||||
#include "lua/lauxlib.h"
|
#include "lua/lauxlib.h"
|
||||||
|
|
||||||
|
|
||||||
|
int telnet_bin_mode = 0;
|
||||||
|
|
||||||
int mynode = 0;
|
int mynode = 0;
|
||||||
struct bbs_config conf;
|
struct bbs_config conf;
|
||||||
|
|
||||||
@ -384,9 +386,15 @@ void s_displayansi(char *file) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char s_getchar() {
|
char s_getchar() {
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
|
unsigned char d;
|
||||||
int len;
|
int len;
|
||||||
|
char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_wont[] = {IAC, IAC_WONT, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_dont[] = {IAC, IAC_DONT, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
@ -401,19 +409,58 @@ char s_getchar() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!sshBBS) {
|
if (!sshBBS) {
|
||||||
while (c == 255) {
|
while (c == IAC) {
|
||||||
len = read(gSocket, &c, 1);
|
len = read(gSocket, &c, 1);
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
disconnect("Socket Closed");
|
disconnect("Socket Closed");
|
||||||
} else if (c == 255) {
|
} else if (c == IAC) {
|
||||||
usertimeout = 10;
|
usertimeout = 10;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
if (c == 254 || c == 253 || c == 252 || c == 251) {
|
if (c == IAC_WILL || c == IAC_WONT || c == IAC_DO || c == IAC_DONT) {
|
||||||
len = read(gSocket, &c, 1);
|
len = read(gSocket, &d, 1);
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
disconnect("Socket Closed");
|
disconnect("Socket Closed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case IAC_WILL:
|
||||||
|
fprintf(stderr, "IAC WILL %d\n", d);
|
||||||
|
if (d == 0) {
|
||||||
|
if (telnet_bin_mode != 1) {
|
||||||
|
telnet_bin_mode = 1;
|
||||||
|
write(gSocket, iac_binary_do, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_WONT:
|
||||||
|
fprintf(stderr, "IAC WONT %d\n", d);
|
||||||
|
if (d == 0) {
|
||||||
|
if (telnet_bin_mode != 0) {
|
||||||
|
telnet_bin_mode = 0;
|
||||||
|
write(gSocket, iac_binary_dont, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_DO:
|
||||||
|
fprintf(stderr, "IAC DO %d\n", d);
|
||||||
|
if (d == 0) {
|
||||||
|
if (telnet_bin_mode != 1) {
|
||||||
|
telnet_bin_mode = 1;
|
||||||
|
write(gSocket, iac_binary_will, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_DONT:
|
||||||
|
fprintf(stderr, "IAC DONT %d\n", d);
|
||||||
|
if (d == 0) {
|
||||||
|
if (telnet_bin_mode != 0) {
|
||||||
|
telnet_bin_mode = 0;
|
||||||
|
write(gSocket, iac_binary_wont, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else if (c == 250) {
|
} else if (c == 250) {
|
||||||
do {
|
do {
|
||||||
len = read(gSocket, &c, 1);
|
len = read(gSocket, &c, 1);
|
||||||
@ -695,9 +742,9 @@ void runbbs_real(int socket, char *ip, int ssh) {
|
|||||||
struct stat s;
|
struct stat s;
|
||||||
FILE *nodefile;
|
FILE *nodefile;
|
||||||
int i;
|
int i;
|
||||||
char iac_echo[] = {255, 251, 1, '\0'};
|
char iac_echo[] = {IAC, IAC_WILL, IAC_ECHO, '\0'};
|
||||||
char iac_sga[] = {255, 251, 3, '\0'};
|
char iac_sga[] = {IAC, IAC_WILL, IAC_SUPPRESS_GO_AHEAD, '\0'};
|
||||||
char iac_binary[] = {255, 251, 0, '\0'};
|
|
||||||
struct user_record *user;
|
struct user_record *user;
|
||||||
struct tm thetime;
|
struct tm thetime;
|
||||||
struct tm oldtime;
|
struct tm oldtime;
|
||||||
@ -725,10 +772,6 @@ void runbbs_real(int socket, char *ip, int ssh) {
|
|||||||
dolog("Failed to send iac_sga");
|
dolog("Failed to send iac_sga");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
if (write(socket, iac_binary, 3) != 3) {
|
|
||||||
dolog("Failed to send iac_binary");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
sshBBS = 1;
|
sshBBS = 1;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,15 @@
|
|||||||
#define TYPE_ECHOMAIL_AREA 2
|
#define TYPE_ECHOMAIL_AREA 2
|
||||||
#define TYPE_NEWSGROUP_AREA 3
|
#define TYPE_NEWSGROUP_AREA 3
|
||||||
|
|
||||||
|
#define IAC 255
|
||||||
|
#define IAC_WILL 251
|
||||||
|
#define IAC_WONT 252
|
||||||
|
#define IAC_DO 253
|
||||||
|
#define IAC_DONT 254
|
||||||
|
#define IAC_TRANSMIT_BINARY 0
|
||||||
|
#define IAC_SUPPRESS_GO_AHEAD 3
|
||||||
|
#define IAC_ECHO 1
|
||||||
|
|
||||||
struct fido_addr {
|
struct fido_addr {
|
||||||
unsigned short zone;
|
unsigned short zone;
|
||||||
unsigned short net;
|
unsigned short net;
|
||||||
|
45
src/doors.c
45
src/doors.c
@ -31,6 +31,7 @@ extern int sshBBS;
|
|||||||
extern int bbs_stderr;
|
extern int bbs_stderr;
|
||||||
int running_door_pid = 0;
|
int running_door_pid = 0;
|
||||||
int running_door = 0;
|
int running_door = 0;
|
||||||
|
extern int telnet_bin_mode;
|
||||||
|
|
||||||
extern int timeoutpaused;
|
extern int timeoutpaused;
|
||||||
|
|
||||||
@ -251,6 +252,11 @@ void runexternal(struct user_record *user, char *cmd, int stdio, char *argv[], c
|
|||||||
size_t ouc;
|
size_t ouc;
|
||||||
size_t inc;
|
size_t inc;
|
||||||
size_t sz;
|
size_t sz;
|
||||||
|
int iac;
|
||||||
|
char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_wont[] = {IAC, IAC_WONT, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_dont[] = {IAC, IAC_DONT, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
|
||||||
timeoutpaused = 1;
|
timeoutpaused = 1;
|
||||||
|
|
||||||
@ -356,12 +362,51 @@ void runexternal(struct user_record *user, char *cmd, int stdio, char *argv[], c
|
|||||||
if (gotiac == 1) {
|
if (gotiac == 1) {
|
||||||
if (c == 254 || c == 253 || c == 252 || c == 251) {
|
if (c == 254 || c == 253 || c == 252 || c == 251) {
|
||||||
gotiac = 2;
|
gotiac = 2;
|
||||||
|
iac = c;
|
||||||
} else if (c == 250) {
|
} else if (c == 250) {
|
||||||
gotiac = 3;
|
gotiac = 3;
|
||||||
} else {
|
} else {
|
||||||
gotiac = 0;
|
gotiac = 0;
|
||||||
}
|
}
|
||||||
} else if (gotiac == 2) {
|
} else if (gotiac == 2) {
|
||||||
|
switch (iac) {
|
||||||
|
case IAC_WILL:
|
||||||
|
fprintf(stderr, "IAC WILL %d\n", c);
|
||||||
|
if (c == 0) {
|
||||||
|
if (telnet_bin_mode != 1) {
|
||||||
|
telnet_bin_mode = 1;
|
||||||
|
write(master, iac_binary_do, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_WONT:
|
||||||
|
fprintf(stderr, "IAC WONT %d\n", c);
|
||||||
|
if (c == 0) {
|
||||||
|
if (telnet_bin_mode != 0) {
|
||||||
|
telnet_bin_mode = 0;
|
||||||
|
write(master, iac_binary_dont, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_DO:
|
||||||
|
fprintf(stderr, "IAC DO %d\n", c);
|
||||||
|
if (c == 0) {
|
||||||
|
if (telnet_bin_mode != 1) {
|
||||||
|
telnet_bin_mode = 1;
|
||||||
|
write(master, iac_binary_will, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_DONT:
|
||||||
|
fprintf(stderr, "IAC DONT %d\n", c);
|
||||||
|
if (c == 0) {
|
||||||
|
if (telnet_bin_mode != 0) {
|
||||||
|
telnet_bin_mode = 0;
|
||||||
|
write(master, iac_binary_wont, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
gotiac = 0;
|
gotiac = 0;
|
||||||
} else if (gotiac == 3) {
|
} else if (gotiac == 3) {
|
||||||
if (c == 240) {
|
if (c == 240) {
|
||||||
|
87
src/files.c
87
src/files.c
@ -25,6 +25,8 @@ extern int bbs_stdout;
|
|||||||
extern int bbs_stderr;
|
extern int bbs_stderr;
|
||||||
extern time_t userlaston;
|
extern time_t userlaston;
|
||||||
extern struct user_record *gUser;
|
extern struct user_record *gUser;
|
||||||
|
extern int telnet_bin_mode;
|
||||||
|
extern int timeoutpaused;
|
||||||
|
|
||||||
struct file_entry {
|
struct file_entry {
|
||||||
int fid;
|
int fid;
|
||||||
@ -156,6 +158,10 @@ int doIO(ZModem *zm) {
|
|||||||
int done = 0;
|
int done = 0;
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_wont[] = {IAC, IAC_WONT, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_dont[] = {IAC, IAC_DONT, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
|
||||||
while(!done) {
|
while(!done) {
|
||||||
FD_ZERO(&readfds);
|
FD_ZERO(&readfds);
|
||||||
@ -180,8 +186,53 @@ int doIO(ZModem *zm) {
|
|||||||
pos++;
|
pos++;
|
||||||
j++;
|
j++;
|
||||||
} else {
|
} else {
|
||||||
j++;
|
// IAC command
|
||||||
j++;
|
if (buffer[j+1] == IAC_WILL || buffer[j+1] == IAC_WONT || buffer[j+1] == IAC_DO || buffer[j+1] == IAC_DONT) {
|
||||||
|
switch (buffer[j+1]) {
|
||||||
|
case IAC_WILL:
|
||||||
|
fprintf(stderr, "IAC WILL %d\n", buffer[j+2]);
|
||||||
|
if (buffer[j+2] == 0) {
|
||||||
|
if (telnet_bin_mode != 1) {
|
||||||
|
telnet_bin_mode = 1;
|
||||||
|
write(gSocket, iac_binary_do, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_WONT:
|
||||||
|
fprintf(stderr, "IAC WONT %d\n", buffer[j+2]);
|
||||||
|
if (buffer[j+2] == 0) {
|
||||||
|
if (telnet_bin_mode != 0) {
|
||||||
|
telnet_bin_mode = 0;
|
||||||
|
write(gSocket, iac_binary_dont, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_DO:
|
||||||
|
fprintf(stderr, "IAC DO %d\n", buffer[j+2]);
|
||||||
|
if (buffer[j+2] == 0) {
|
||||||
|
if (telnet_bin_mode != 1) {
|
||||||
|
telnet_bin_mode = 1;
|
||||||
|
write(gSocket, iac_binary_will, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IAC_DONT:
|
||||||
|
fprintf(stderr, "IAC DONT %d\n", buffer[j+2]);
|
||||||
|
if (buffer[j+2] == 0) {
|
||||||
|
if (telnet_bin_mode != 0) {
|
||||||
|
telnet_bin_mode = 0;
|
||||||
|
write(gSocket, iac_binary_wont, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
j+= 2;
|
||||||
|
} else if (buffer[j+1] == 250) {
|
||||||
|
j++;
|
||||||
|
do {
|
||||||
|
j++;
|
||||||
|
} while(buffer[j] != 240);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
buffer2[pos] = buffer[j];
|
buffer2[pos] = buffer[j];
|
||||||
@ -379,13 +430,22 @@ int do_download(struct user_record *user, char *file) {
|
|||||||
char **arguments;
|
char **arguments;
|
||||||
int bpos;
|
int bpos;
|
||||||
int len;
|
int len;
|
||||||
|
char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
|
||||||
if (conf.protocols[user->defprotocol - 1]->internal_zmodem) {
|
if (conf.protocols[user->defprotocol - 1]->internal_zmodem) {
|
||||||
if (sshBBS) {
|
if (sshBBS) {
|
||||||
ttySetRaw(STDIN_FILENO, &oldit);
|
ttySetRaw(STDIN_FILENO, &oldit);
|
||||||
ttySetRaw(STDOUT_FILENO, &oldot);
|
ttySetRaw(STDOUT_FILENO, &oldot);
|
||||||
|
} else {
|
||||||
|
if (telnet_bin_mode == 0) {
|
||||||
|
write(gSocket, iac_binary_will, 3);
|
||||||
|
write(gSocket, iac_binary_do, 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
timeoutpaused = 1;
|
||||||
download_zmodem(user, file);
|
download_zmodem(user, file);
|
||||||
|
timeoutpaused = 0;
|
||||||
if (sshBBS) {
|
if (sshBBS) {
|
||||||
tcsetattr(STDIN_FILENO, TCSANOW, &oldit);
|
tcsetattr(STDIN_FILENO, TCSANOW, &oldit);
|
||||||
tcsetattr(STDOUT_FILENO, TCSANOW, &oldot);
|
tcsetattr(STDOUT_FILENO, TCSANOW, &oldot);
|
||||||
@ -452,7 +512,12 @@ int do_download(struct user_record *user, char *file) {
|
|||||||
arguments[bpos] = NULL;
|
arguments[bpos] = NULL;
|
||||||
|
|
||||||
arguments[0] = download_command;
|
arguments[0] = download_command;
|
||||||
|
if (!sshBBS) {
|
||||||
|
if (telnet_bin_mode == 0) {
|
||||||
|
write(gSocket, iac_binary_will, 3);
|
||||||
|
write(gSocket, iac_binary_do, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
runexternal(user, download_command, conf.protocols[user->defprotocol - 1]->stdio, arguments, conf.bbs_path, 1, NULL);
|
runexternal(user, download_command, conf.protocols[user->defprotocol - 1]->stdio, arguments, conf.bbs_path, 1, NULL);
|
||||||
|
|
||||||
free(arguments);
|
free(arguments);
|
||||||
@ -473,9 +538,19 @@ int do_upload(struct user_record *user, char *final_path) {
|
|||||||
struct dirent *dent;
|
struct dirent *dent;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
int len;
|
int len;
|
||||||
|
char iac_binary_will[] = {IAC, IAC_WILL, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
char iac_binary_do[] = {IAC, IAC_DO, IAC_TRANSMIT_BINARY, '\0'};
|
||||||
|
|
||||||
if (conf.protocols[user->defprotocol - 1]->internal_zmodem) {
|
if (conf.protocols[user->defprotocol - 1]->internal_zmodem) {
|
||||||
|
if (!sshBBS) {
|
||||||
|
if (telnet_bin_mode == 0) {
|
||||||
|
write(gSocket, iac_binary_will, 3);
|
||||||
|
write(gSocket, iac_binary_do, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
timeoutpaused = 1;
|
||||||
upload_zmodem(user, final_path);
|
upload_zmodem(user, final_path);
|
||||||
|
timeoutpaused = 0;
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -554,6 +629,12 @@ int do_upload(struct user_record *user, char *final_path) {
|
|||||||
|
|
||||||
mkdir(upload_path, 0755);
|
mkdir(upload_path, 0755);
|
||||||
|
|
||||||
|
if (!sshBBS) {
|
||||||
|
if (telnet_bin_mode == 0) {
|
||||||
|
write(gSocket, iac_binary_will, 3);
|
||||||
|
write(gSocket, iac_binary_do, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
runexternal(user, upload_command, conf.protocols[user->defprotocol - 1]->stdio, arguments, upload_path, 1, NULL);
|
runexternal(user, upload_command, conf.protocols[user->defprotocol - 1]->stdio, arguments, upload_path, 1, NULL);
|
||||||
|
|
||||||
free(arguments);
|
free(arguments);
|
||||||
|
Reference in New Issue
Block a user