Big update for uploading with external protocols. May or may not work with SSH,tested with lrzsz

This commit is contained in:
Andrew Pamment 2016-12-10 17:55:47 +10:00
parent ee0d516d2e
commit 380375bd99
11 changed files with 527 additions and 63 deletions

30
bbs.c
View File

@ -914,3 +914,33 @@ finish:
return ret; return ret;
} }
int copy_file(char *src, char *dest) {
FILE *src_file;
FILE *dest_file;
char c;
src_file = fopen(src, "rb");
if (!src_file) {
return -1;
}
dest_file = fopen(dest, "wb");
if (!dest_file) {
fclose(src_file);
return -1;
}
while(1) {
c = fgetc(src_file);
if (!feof(src_file)) {
fputc(c, dest_file);
} else {
break;
}
}
fclose(src_file);
fclose(dest_file);
return 0;
}

19
bbs.h
View File

@ -94,6 +94,15 @@ struct archiver {
char *pack; char *pack;
}; };
struct protocol {
char *name;
char *upload;
char *download;
int internal_zmodem;
int stdio;
int upload_prompt;
};
struct bbs_config { struct bbs_config {
char *bbs_name; char *bbs_name;
char *bwave_name; char *bwave_name;
@ -141,9 +150,12 @@ struct bbs_config {
int text_file_count; int text_file_count;
struct text_file **text_files; struct text_file **text_files;
char *archiver_path; char *config_path;
int archiver_count; int archiver_count;
struct archiver **archivers; struct archiver **archivers;
int protocol_count;
struct protocol **protocols;
}; };
struct sec_level_t { struct sec_level_t {
@ -189,7 +201,7 @@ struct msg_headers {
struct jam_msg **msgs; struct jam_msg **msgs;
int msg_count; int msg_count;
}; };
extern int copy_file(char *src, char *dest);
extern int recursive_delete(const char *dir); extern int recursive_delete(const char *dir);
extern void automessage_write(struct user_record *user); extern void automessage_write(struct user_record *user);
extern void automessage_display(); extern void automessage_display();
@ -234,6 +246,7 @@ extern unsigned long generate_msgid();
extern int door_menu(struct user_record *user); extern int door_menu(struct user_record *user);
extern void rundoor(struct user_record *user, char *cmd, int stdio); extern void rundoor(struct user_record *user, char *cmd, int stdio);
extern void runexternal(struct user_record *user, char *cmd, int stdio, char **argv, char *cwd, int raw);
extern void bbs_list(struct user_record *user); extern void bbs_list(struct user_record *user);
@ -248,6 +261,8 @@ extern void download_zmodem(struct user_record *user, char *filename);
extern void settings_menu(struct user_record *user); extern void settings_menu(struct user_record *user);
extern void upload_zmodem(struct user_record *user, char *upload_p); extern void upload_zmodem(struct user_record *user, char *upload_p);
extern int ttySetRaw(int fd, struct termios *prevTermios); extern int ttySetRaw(int fd, struct termios *prevTermios);
extern int do_upload(struct user_record *user, char *final_path);
extern int do_download(struct user_record *user, char *file);
extern void lua_push_cfunctions(lua_State *L); extern void lua_push_cfunctions(lua_State *L);

View File

@ -357,15 +357,8 @@ void bwave_create_packet() {
system(buffer); system(buffer);
if (sshBBS) { do_download(gUser, archive);
ttySetRaw(STDIN_FILENO, &oldit);
ttySetRaw(STDOUT_FILENO, &oldot);
}
download_zmodem(gUser, archive);
if (sshBBS) {
tcsetattr(STDIN_FILENO, TCSANOW, &oldit);
tcsetattr(STDOUT_FILENO, TCSANOW, &oldot);
}
snprintf(buffer, 1024, "%s/node%d/bwave", conf.bbs_path, mynode); snprintf(buffer, 1024, "%s/node%d/bwave", conf.bbs_path, mynode);
recursive_delete(buffer); recursive_delete(buffer);
@ -586,7 +579,11 @@ void bwave_upload_reply() {
} }
mkdir(buffer, 0755); mkdir(buffer, 0755);
upload_zmodem(gUser, buffer); if (!do_upload(gUser, buffer)) {
s_printf(get_string(211));
recursive_delete(buffer);
return;
}
bpos = 0; bpos = 0;
for (i=0;i<strlen(conf.archivers[gUser->defarchiver-1]->unpack);i++) { for (i=0;i<strlen(conf.archivers[gUser->defarchiver-1]->unpack);i++) {

View File

@ -23,12 +23,12 @@ QWK Name = MAGICKA
QWK Max Messages = 5000 QWK Max Messages = 5000
ZIP Command = zip -j *a *f ZIP Command = zip -j *a *f
UNZIP Command = unzip -j -o *a -d *d UNZIP Command = unzip -j -o *a -d *d
Archivers = config/archivers.ini
Broadcast Enable = false Broadcast Enable = false
Broadcast Port = 2027 Broadcast Port = 2027
Broadcast Address = 192.168.1.255 Broadcast Address = 192.168.1.255
[paths] [paths]
Config Path = /home/andrew/MagickaBBS/config
WWW Path = /home/andrew/MagickaBBS/www WWW Path = /home/andrew/MagickaBBS/www
String File = /home/andrew/MagickaBBS/magicka.strings String File = /home/andrew/MagickaBBS/magicka.strings
PID File = /home/andrew/MagickaBBS/magicka.pid PID File = /home/andrew/MagickaBBS/magicka.pid

View File

@ -0,0 +1,8 @@
[ZModem]
Internal ZModem = true
[LRZSZ Zmodem]
Upload Prompt = false
Upload Command = rz -R
Download Command = sz *f
stdio = true

108
doors.c
View File

@ -128,12 +128,38 @@ int write_door32sys(struct user_record *user) {
return 0; return 0;
} }
void rundoor(struct user_record *user, char *cmd, int stdio) { void rundoor(struct user_record *user, char *cmd, int stdio) {
char buffer[256];
int pid;
char *arguments[4]; char *arguments[4];
int door_out;
char buffer[10];
if (sshBBS) {
door_out = STDOUT_FILENO;
} else {
door_out = gSocket;
}
arguments[0] = strdup(cmd);
sprintf(buffer, "%d", mynode);
arguments[1] = strdup(buffer);
sprintf(buffer, "%d", door_out);
arguments[2] = strdup(buffer);
arguments[3] = NULL;
runexternal(user, cmd, stdio, arguments, NULL, 0);
free(arguments[0]);
free(arguments[1]);
free(arguments[2]);
}
void runexternal(struct user_record *user, char *cmd, int stdio, char *argv[], char *cwd, int raw) {
char buffer[1024];
int pid;
int ret; int ret;
char c; unsigned char c;
int len; int len;
int master; int master;
int slave; int slave;
@ -143,9 +169,15 @@ void rundoor(struct user_record *user, char *cmd, int stdio) {
struct sigaction sa; struct sigaction sa;
int door_in; int door_in;
int door_out; int door_out;
int i;
int gotiac;
int flush;
struct timeval thetimeout;
struct termios oldit;
timeoutpaused = 1; timeoutpaused = 1;
printf("\"%s\"\n", cmd);
if (write_door32sys(user) != 0) { if (write_door32sys(user) != 0) {
return; return;
} }
@ -159,13 +191,6 @@ void rundoor(struct user_record *user, char *cmd, int stdio) {
door_out = gSocket; door_out = gSocket;
} }
arguments[0] = strdup(cmd);
sprintf(buffer, "%d", mynode);
arguments[1] = strdup(buffer);
sprintf(buffer, "%d", door_out);
arguments[2] = strdup(buffer);
arguments[3] = NULL;
ws.ws_row = 24; ws.ws_row = 24;
ws.ws_col = 80; ws.ws_col = 80;
@ -179,12 +204,17 @@ void rundoor(struct user_record *user, char *cmd, int stdio) {
perror("sigaction"); perror("sigaction");
exit(1); exit(1);
} }
if (raw) {
ttySetRaw(master, &oldit);
ttySetRaw(slave, &oldit);
}
pid = fork(); pid = fork();
if (pid < 0) { if (pid < 0) {
return; return;
} else if (pid == 0) { } else if (pid == 0) {
if (cwd != NULL) {
chdir(cwd);
}
close(master); close(master);
dup2(slave, 0); dup2(slave, 0);
dup2(slave, 1); dup2(slave, 1);
@ -195,11 +225,13 @@ void rundoor(struct user_record *user, char *cmd, int stdio) {
ioctl(0, TIOCSCTTY, 1); ioctl(0, TIOCSCTTY, 1);
execvp(cmd, arguments); execvp(cmd, argv);
} else { } else {
running_door_pid = pid; running_door_pid = pid;
gotiac = 0;
flush = 0;
while(running_door != 0) { while(running_door || !flush) {
FD_ZERO(&fdset); FD_ZERO(&fdset);
FD_SET(master, &fdset); FD_SET(master, &fdset);
FD_SET(door_in, &fdset); FD_SET(door_in, &fdset);
@ -208,7 +240,10 @@ void rundoor(struct user_record *user, char *cmd, int stdio) {
} else { } else {
t = door_in + 1; t = door_in + 1;
} }
ret = select(t, &fdset, NULL, NULL, NULL);
thetimeout.tv_sec = 5;
thetimeout.tv_usec = 0;
ret = select(t, &fdset, NULL, NULL, &thetimeout);
if (ret > 0) { if (ret > 0) {
if (FD_ISSET(door_in, &fdset)) { if (FD_ISSET(door_in, &fdset)) {
len = read(door_in, &c, 1); len = read(door_in, &c, 1);
@ -217,29 +252,62 @@ void rundoor(struct user_record *user, char *cmd, int stdio) {
disconnect("Socket Closed"); disconnect("Socket Closed");
return; return;
} }
if (!raw) {
if (c == '\n' || c == '\0') { if (c == '\n' || c == '\0') {
continue; continue;
} }
}
if (!running_door) {
continue;
}
if (c == 255) {
if (gotiac == 1) {
write(master, &c, 1); write(master, &c, 1);
gotiac = 0;
} else {
gotiac = 1;
}
} else {
if (gotiac < 2 && gotiac != 0) {
gotiac++;
} else {
write(master, &c, 1);
gotiac = 0;
}
}
} else if (FD_ISSET(master, &fdset)) { } else if (FD_ISSET(master, &fdset)) {
len = read(master, &c, 1); len = read(master, &c, 1);
if (len == 0) { if (len == 0) {
close(master); close(master);
break; break;
} }
if (c == 255) {
write(door_out, &c, 1); write(door_out, &c, 1);
} }
write(door_out, &c, 1);
}
} else {
if (!running_door) {
flush = 1;
} }
} }
} }
} }
free(arguments[0]); }
free(arguments[1]);
free(arguments[2]);
} else { } else {
if (!sshBBS) { if (!sshBBS) {
sprintf(buffer, "%s %d %d", cmd, mynode, gSocket); snprintf(buffer, 1024, "%s", cmd);
for (i=0;argv[i] != NULL; i++) {
snprintf(&buffer[strlen(buffer) - 1], 1024 - strlen(buffer), " %s", argv[i]);
}
if (cwd != NULL) {
chdir(cwd);
}
system(buffer); system(buffer);
if (cwd != NULL) {
chdir(conf.bbs_path);
}
} else { } else {
s_printf(get_string(51)); s_printf(get_string(51));
} }

250
files.c
View File

@ -8,6 +8,7 @@
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <termios.h> #include <termios.h>
#include <dirent.h>
#include "Xmodem/zmodem.h" #include "Xmodem/zmodem.h"
#include "bbs.h" #include "bbs.h"
#include "lua/lua.h" #include "lua/lua.h"
@ -326,10 +327,238 @@ char *get_file_id_diz(char *filename) {
return description; return description;
} }
int do_download(struct user_record *user, char *file) {
struct termios oldit;
struct termios oldot;
char download_command[1024];
int i;
int argc;
int last_char_space;
char **arguments;
int bpos;
if (conf.protocols[user->defprotocol - 1]->internal_zmodem) {
if (sshBBS) {
ttySetRaw(STDIN_FILENO, &oldit);
ttySetRaw(STDOUT_FILENO, &oldot);
}
download_zmodem(user, file);
if (sshBBS) {
tcsetattr(STDIN_FILENO, TCSANOW, &oldit);
tcsetattr(STDOUT_FILENO, TCSANOW, &oldot);
}
return 1;
} else {
bpos = 0;
for (i=0;i<strlen(conf.protocols[user->defprotocol - 1]->download);i++) {
if (conf.protocols[user->defprotocol - 1]->download[i] == '*') {
i++;
if (conf.protocols[user->defprotocol - 1]->download[i] == '*') {
download_command[bpos++] = conf.protocols[user->defprotocol - 1]->download[i];
download_command[bpos] = '\0';
continue;
} else if (conf.protocols[user->defprotocol - 1]->download[i] == 'f') {
sprintf(&download_command[bpos], "%s", file);
bpos = strlen(download_command);
continue;
} else if (conf.protocols[user->defprotocol - 1]->download[i] == 's') {
if (!sshBBS) {
sprintf(&download_command[bpos], "%d", gSocket);
bpos = strlen(download_command);
} else {
s_printf(get_string(209), conf.protocols[user->defprotocol - 1]->name);
return 0;
}
}
} else {
download_command[bpos++] = conf.protocols[user->defprotocol - 1]->download[i];
download_command[bpos] = '\0';
}
}
bpos = 1;
arguments = (char **)malloc(sizeof(char *) * (argc + 1));
for (i=0;i<strlen(download_command);i++) {
if (download_command[i] != ' ') {
continue;
}
download_command[i] = '\0';
i++;
while (download_command[i] == ' ')
i++;
arguments[bpos++] = &download_command[i];
}
arguments[bpos] = NULL;
arguments[0] = download_command;
runexternal(user, download_command, conf.protocols[user->defprotocol - 1]->stdio, arguments, conf.bbs_path, 1);
free(arguments);
}
}
int do_upload(struct user_record *user, char *final_path) {
char upload_path[1024];
char upload_command[1024];
char buffer3[256];
int bpos;
int i;
int argc;
int last_char_space;
char **arguments;
DIR *inb;
struct dirent *dent;
struct stat s;
if (conf.protocols[user->defprotocol - 1]->internal_zmodem) {
upload_zmodem(user, final_path);
return 1;
} else {
if (conf.protocols[user->defprotocol - 1]->upload_prompt) {
s_printf(get_string(210));
s_readstring(buffer3, 256);
s_printf("\r\n");
}
bpos = 0;
for (i=0;i<strlen(conf.protocols[user->defprotocol - 1]->upload);i++) {
if (conf.protocols[user->defprotocol - 1]->upload[i] == '*') {
i++;
if (conf.protocols[user->defprotocol - 1]->upload[i] == '*') {
upload_command[bpos++] = conf.protocols[user->defprotocol - 1]->upload[i];
upload_command[bpos] = '\0';
continue;
} else if (conf.protocols[user->defprotocol - 1]->upload[i] == 'f') {
if (conf.protocols[user->defprotocol - 1]->upload_prompt) {
sprintf(&upload_command[bpos], "%s", buffer3);
bpos = strlen(upload_command);
}
continue;
} else if (conf.protocols[user->defprotocol - 1]->upload[i] == 's') {
if (!sshBBS) {
sprintf(&upload_command[bpos], "%d", gSocket);
bpos = strlen(upload_command);
} else {
s_printf(get_string(209), conf.protocols[user->defprotocol - 1]->name);
return 0;
}
}
} else {
upload_command[bpos++] = conf.protocols[user->defprotocol - 1]->upload[i];
upload_command[bpos] = '\0';
}
}
argc = 1;
last_char_space = 0;
for (i=0;i<strlen(upload_command);i++) {
if (upload_command[i] == ' ') {
if (!last_char_space) {
argc++;
last_char_space = 1;
}
} else {
last_char_space = 0;
}
}
bpos = 1;
arguments = (char **)malloc(sizeof(char *) * (argc + 1));
for (i=0;i<strlen(upload_command);i++) {
if (upload_command[i] != ' ') {
continue;
}
upload_command[i] = '\0';
i++;
while (upload_command[i] == ' ')
i++;
arguments[bpos++] = &upload_command[i];
}
arguments[bpos] = NULL;
arguments[0] = upload_command;
snprintf(upload_path, 1024, "%s/node%d/upload/", conf.bbs_path, mynode);
if (stat(upload_path, &s) == 0) {
recursive_delete(upload_path);
}
mkdir(upload_path, 0755);
runexternal(user, upload_command, conf.protocols[user->defprotocol - 1]->stdio, arguments, upload_path, 1);
free(arguments);
if (conf.protocols[user->defprotocol - 1]->upload_prompt) {
snprintf(upload_command, 1024, "%s%s", upload_path, buffer3);
if (stat(buffer3, &s) != 0) {
recursive_delete(upload_path);
return 0;
}
snprintf(upload_filename, 1024, "%s/%s", final_path, buffer3);
if (stat(upload_filename, &s) == 0) {
recursive_delete(upload_path);
s_printf(get_string(214));
return 0;
}
if (copy_file(upload_command, upload_filename) != 0) {
recursive_delete(upload_path);
return 0;
}
recursive_delete(upload_path);
return 1;
} else {
inb = opendir(upload_path);
if (!inb) {
return 0;
}
while ((dent = readdir(inb)) != NULL) {
if (dent->d_type == DT_REG) {
snprintf(upload_command, 1-24, "%s%s", upload_path, dent->d_name);
snprintf(upload_filename, 1024, "%s/%s", final_path, dent->d_name);
if (stat(upload_filename, &s) == 0) {
recursive_delete(upload_path);
s_printf(get_string(214));
closedir(inb);
return 0;
}
if (copy_file(upload_command, upload_filename) != 0) {
recursive_delete(upload_path);
closedir(inb);
return 0;
}
closedir(inb);
recursive_delete(upload_path);
return 1;
}
}
closedir(inb);
return 0;
}
}
}
void upload(struct user_record *user) { void upload(struct user_record *user) {
char buffer[331]; char buffer[331];
char buffer2[66]; char buffer2[66];
char buffer3[256]; char buffer3[256];
int i; int i;
char *create_sql = "CREATE TABLE IF NOT EXISTS files (" char *create_sql = "CREATE TABLE IF NOT EXISTS files ("
"Id INTEGER PRIMARY KEY," "Id INTEGER PRIMARY KEY,"
@ -346,7 +575,11 @@ void upload(struct user_record *user) {
char *err_msg = NULL; char *err_msg = NULL;
char *description; char *description;
upload_zmodem(user, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->upload_path);
if (!do_upload(user, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->upload_path)) {
s_printf(get_string(211));
return;
}
description = NULL; description = NULL;
@ -508,15 +741,11 @@ void download(struct user_record *user) {
sqlite3 *db; sqlite3 *db;
sqlite3_stmt *res; sqlite3_stmt *res;
int rc; int rc;
struct termios oldit;
struct termios oldot;
if (sshBBS) {
ttySetRaw(STDIN_FILENO, &oldit);
ttySetRaw(STDOUT_FILENO, &oldot);
}
for (i=0;i<tagged_count;i++) { for (i=0;i<tagged_count;i++) {
download_zmodem(user, tagged_files[i]); do_download(user, tagged_files[i]);
sprintf(buffer, "%s/%s.sq3", conf.bbs_path, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->database); sprintf(buffer, "%s/%s.sq3", conf.bbs_path, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->database);
@ -563,10 +792,7 @@ void download(struct user_record *user) {
sqlite3_close(db); sqlite3_close(db);
} }
if (sshBBS) {
tcsetattr(STDIN_FILENO, TCSANOW, &oldit);
tcsetattr(STDOUT_FILENO, TCSANOW, &oldot);
}
for (i=0;i<tagged_count;i++) { for (i=0;i<tagged_count;i++) {
free(tagged_files[i]); free(tagged_files[i]);

View File

@ -207,3 +207,9 @@ Is this Correct? (Y/N)
\r\n\e[1;32mSelect an archiver...\e[0m\r\n\r\n \r\n\e[1;32mSelect an archiver...\e[0m\r\n\r\n
\e[1;31m%d. \e[1;37m%s\e[0m\r\n \e[1;31m%d. \e[1;37m%s\e[0m\r\n
> >
Sorry, this %s is unavailable over SSH\r\n
Please enter the filename of the file you want to upload\r\n>
\r\nUpload Failed\r\n
\r\n\e[1;32mSelect a protocol...\e[0m\r\n\r\n
\e[0;36mO. \e[1;37mDefault Protocol (\e[1;33m%s\e[1;37m)\r\n
File exists!\r\n

106
main.c
View File

@ -67,6 +67,83 @@ void sigchld_handler(int s)
errno = saved_errno; errno = saved_errno;
} }
static int protocol_config_handler(void* user, const char* section, const char* name,
const char* value)
{
struct bbs_config *conf = (struct bbs_config *)user;
int i;
for (i=0;i<conf->protocol_count;i++) {
if (strcasecmp(conf->protocols[i]->name, section) == 0) {
// found it
if (strcasecmp(name, "upload command") == 0) {
conf->protocols[i]->upload = strdup(value);
} else if (strcasecmp(name, "download command") == 0) {
conf->protocols[i]->download = strdup(value);
} else if (strcasecmp(name, "internal zmodem") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[i]->internal_zmodem = 1;
} else {
conf->protocols[i]->internal_zmodem = 0;
}
} else if (strcasecmp(name, "stdio") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[i]->stdio = 1;
} else {
conf->protocols[i]->stdio = 0;
}
} else if (strcasecmp(name, "upload prompt") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[i]->upload_prompt = 1;
} else {
conf->protocols[i]->upload_prompt = 0;
}
}
return 1;
}
}
if (conf->protocol_count == 0) {
conf->protocols = (struct protocol **)malloc(sizeof(struct protocol *));
} else {
conf->protocols = (struct protocol **)realloc(conf->protocols, sizeof(struct protocol *) * (conf->protocol_count + 1));
}
conf->protocols[conf->protocol_count] = (struct protocol *)malloc(sizeof(struct archiver));
conf->protocols[conf->protocol_count]->name = strdup(section);
conf->protocols[conf->protocol_count]->internal_zmodem = 0;
conf->protocols[conf->protocol_count]->upload_prompt = 0;
conf->protocols[conf->protocol_count]->stdio = 0;
if (strcasecmp(name, "upload command") == 0) {
conf->protocols[conf->protocol_count]->upload = strdup(value);
} else if (strcasecmp(name, "download command") == 0) {
conf->protocols[conf->protocol_count]->download = strdup(value);
} else if (strcasecmp(name, "internal zmodem") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[conf->protocol_count]->internal_zmodem = 1;
} else {
conf->protocols[conf->protocol_count]->internal_zmodem = 0;
}
} else if (strcasecmp(name, "stdio") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[conf->protocol_count]->stdio = 1;
} else {
conf->protocols[conf->protocol_count]->stdio = 0;
}
} else if (strcasecmp(name, "upload prompt") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->protocols[conf->protocol_count]->upload_prompt = 1;
} else {
conf->protocols[conf->protocol_count]->upload_prompt = 0;
}
}
conf->protocol_count++;
return 1;
}
static int archiver_config_handler(void* user, const char* section, const char* name, static int archiver_config_handler(void* user, const char* section, const char* name,
const char* value) const char* value)
{ {
@ -381,8 +458,6 @@ static int handler(void* user, const char* section, const char* name,
conf->main_aka = parse_fido_addr(value); conf->main_aka = parse_fido_addr(value);
} else if (strcasecmp(name, "qwk max messages") == 0) { } else if (strcasecmp(name, "qwk max messages") == 0) {
conf->bwave_max_msgs = atoi(value); conf->bwave_max_msgs = atoi(value);
} else if (strcasecmp(name, "archivers") == 0) {
conf->archiver_path = strdup(value);
} else if (strcasecmp(name, "broadcast enable") == 0) { } else if (strcasecmp(name, "broadcast enable") == 0) {
if (strcasecmp(value, "true") == 0) { if (strcasecmp(value, "true") == 0) {
conf->broadcast_enable = 1; conf->broadcast_enable = 1;
@ -413,6 +488,8 @@ static int handler(void* user, const char* section, const char* name,
conf->string_file = strdup(value); conf->string_file = strdup(value);
} else if (strcasecmp(name, "www path") == 0) { } else if (strcasecmp(name, "www path") == 0) {
conf->www_path = strdup(value); conf->www_path = strdup(value);
} else if (strcasecmp(name, "config path") == 0) {
conf->config_path = strdup(value);
} }
} else if (strcasecmp(section, "mail conferences") == 0) { } else if (strcasecmp(section, "mail conferences") == 0) {
if (conf->mail_conference_count == 0) { if (conf->mail_conference_count == 0) {
@ -833,6 +910,7 @@ int main(int argc, char **argv) {
int main_pid; int main_pid;
FILE *fptr; FILE *fptr;
struct stat s; struct stat s;
char buffer[1024];
if (argc < 2) { if (argc < 2) {
fprintf(stderr, "Usage ./magicka config/bbs.ini\n"); fprintf(stderr, "Usage ./magicka config/bbs.ini\n");
@ -854,17 +932,23 @@ int main(int argc, char **argv) {
conf.telnet_port = 0; conf.telnet_port = 0;
conf.string_file = NULL; conf.string_file = NULL;
conf.www_path = NULL; conf.www_path = NULL;
conf.archiver_path = NULL;
conf.archiver_count = 0; conf.archiver_count = 0;
conf.broadcast_enable = 0; conf.broadcast_enable = 0;
conf.broadcast_port = 0; conf.broadcast_port = 0;
conf.broadcast_address = NULL; conf.broadcast_address = NULL;
conf.config_path = NULL;
// Load BBS data // Load BBS data
if (ini_parse(argv[1], handler, &conf) <0) { if (ini_parse(argv[1], handler, &conf) <0) {
fprintf(stderr, "Unable to load configuration ini (%s)!\n", argv[1]); fprintf(stderr, "Unable to load configuration ini (%s)!\n", argv[1]);
exit(-1); exit(-1);
} }
if (conf.config_path == NULL) {
fprintf(stderr, "Config Path must be set in your bbs ini!\n");
exit(-1);
}
// Load mail Areas // Load mail Areas
for (i=0;i<conf.mail_conference_count;i++) { for (i=0;i<conf.mail_conference_count;i++) {
if (ini_parse(conf.mail_conferences[i]->path, mail_area_handler, conf.mail_conferences[i]) <0) { if (ini_parse(conf.mail_conferences[i]->path, mail_area_handler, conf.mail_conferences[i]) <0) {
@ -880,18 +964,26 @@ int main(int argc, char **argv) {
} }
} }
if (ini_parse("config/doors.ini", door_config_handler, &conf) <0) { snprintf(buffer, 1024, "%s/doors.ini", conf.config_path);
if (ini_parse(buffer, door_config_handler, &conf) <0) {
fprintf(stderr, "Unable to load configuration ini (doors.ini)!\n"); fprintf(stderr, "Unable to load configuration ini (doors.ini)!\n");
exit(-1); exit(-1);
} }
if (conf.archiver_path != NULL) { snprintf(buffer, 1024, "%s/archivers.ini", conf.config_path);
if (ini_parse(conf.archiver_path, archiver_config_handler, &conf) <0) { if (ini_parse(buffer, archiver_config_handler, &conf) <0) {
fprintf(stderr, "Unable to load configuration ini %s\n", conf.archiver_path); fprintf(stderr, "Unable to load configuration ini %s\n", buffer);
exit(-1); exit(-1);
} }
snprintf(buffer, 1024, "%s/protocols.ini", conf.config_path);
if (ini_parse(buffer, protocol_config_handler, &conf) <0) {
fprintf(stderr, "Unable to load configuration ini %s\n", buffer);
exit(-1);
} }
load_strings(); load_strings();
if (conf.fork) { if (conf.fork) {

View File

@ -20,6 +20,7 @@ void settings_menu(struct user_record *user) {
s_printf(get_string(151)); s_printf(get_string(151));
s_printf(get_string(152), user->location); s_printf(get_string(152), user->location);
s_printf(get_string(205), conf.archivers[user->defarchiver - 1]->name); s_printf(get_string(205), conf.archivers[user->defarchiver - 1]->name);
s_printf(get_string(213), conf.protocols[user->defprotocol - 1]->name);
s_printf(get_string(153)); s_printf(get_string(153));
s_printf(get_string(154)); s_printf(get_string(154));
@ -89,6 +90,27 @@ void settings_menu(struct user_record *user) {
} }
} }
break; break;
case 'o':
{
s_printf(get_string(212));
for (i=0;i<conf.protocol_count;i++) {
s_printf(get_string(207), i + 1, conf.protocols[i]->name);
}
s_printf(get_string(208));
s_readstring(buffer, 5);
new_arc = atoi(buffer);
if (new_arc - 1 < 0 || new_arc > conf.protocol_count) {
break;
} else {
user->defprotocol = new_arc;
save_user(user);
}
}
break;
case 'q': case 'q':
dosettings = 1; dosettings = 1;
break; break;

View File

@ -228,7 +228,7 @@ int inst_user(struct user_record *user) {
struct user_record *check_user_pass(char *loginname, char *password) { struct user_record *check_user_pass(char *loginname, char *password) {
struct user_record *user; struct user_record *user;
char buffer[256]; char buffer[1024];
sqlite3 *db; sqlite3 *db;
sqlite3_stmt *res; sqlite3_stmt *res;
int rc; int rc;
@ -306,7 +306,7 @@ struct user_record *check_user_pass(char *loginname, char *password) {
user->sec_info = (struct sec_level_t *)malloc(sizeof(struct sec_level_t)); user->sec_info = (struct sec_level_t *)malloc(sizeof(struct sec_level_t));
sprintf(buffer, "%s/config/s%d.ini", conf.bbs_path, user->sec_level); snprintf(buffer, 1024, "%s/s%d.ini", conf.config_path, user->sec_level);
if (ini_parse(buffer, secLevel, user->sec_info) <0) { if (ini_parse(buffer, secLevel, user->sec_info) <0) {
dolog("Unable to load sec Level ini (%s)!", buffer); dolog("Unable to load sec Level ini (%s)!", buffer);
exit(-1); exit(-1);