New broadcast ability, to send notifications of log in to clients on network

This commit is contained in:
Andrew Pamment 2016-12-08 22:17:19 +10:00
parent b18e9ee10e
commit e769e5448f
4 changed files with 59 additions and 5 deletions

51
bbs.c
View File

@ -12,6 +12,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <fts.h> #include <fts.h>
#include <errno.h> #include <errno.h>
#include <sys/socket.h>
#include "bbs.h" #include "bbs.h"
#include "lua/lua.h" #include "lua/lua.h"
#include "lua/lualib.h" #include "lua/lualib.h"
@ -41,6 +42,44 @@ void sigint_handler(int s)
{ {
// do nothing... // do nothing...
} }
void broadcast(char *mess, ...) {
char buffer[512];
struct sockaddr_in s;
int bcast_sock;
int broadcastEnable=1;
int ret;
if (conf.broadcast_enable) {
bcast_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
ret=setsockopt(bcast_sock, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));
if (ret) {
dolog("broadcast: Couldn't set socket to broadcast mode");
close(bcast_sock);
return;
}
memset(&s, 0, sizeof(struct sockaddr_in));
s.sin_family=AF_INET;
s.sin_addr.s_addr = htonl(INADDR_ANY);
s.sin_port = htons((unsigned short)conf.broadcast_port);
bind(bcast_sock, (struct sockaddr *)&s, sizeof(struct sockaddr_in));
va_list ap;
va_start(ap, mess);
vsnprintf(buffer, 512, mess, ap);
va_end(ap);
ret = sendto(bcast_sock, buffer, strlen(buffer) + 1, 0, (struct sockaddr *)&s, sizeof(struct sockaddr_in));
if (ret < 0) {
dolog("broadcast: Couldn't send broadcast");
}
close(bcast_sock);
}
}
void dolog(char *fmt, ...) { void dolog(char *fmt, ...) {
char buffer[512]; char buffer[512];
@ -61,12 +100,12 @@ void dolog(char *fmt, ...) {
dolog("Error opening log file!"); dolog("Error opening log file!");
return; return;
} }
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buffer, 512, fmt, ap); vsnprintf(buffer, 512, fmt, ap);
va_end(ap); va_end(ap);
fprintf(logfptr, "%02d:%02d:%02d [%d][%s] %s\n", time_now.tm_hour, time_now.tm_min, time_now.tm_sec, mypid, ipaddress, buffer); fprintf(logfptr, "%02d:%02d:%02d [%d][%s] %s\n", time_now.tm_hour, time_now.tm_min, time_now.tm_sec, mypid, ipaddress, buffer);
fclose(logfptr); fclose(logfptr);
} }
@ -680,6 +719,7 @@ tryagain:
// do post-login // do post-login
dolog("%s logged in, on node %d", user->loginname, mynode); dolog("%s logged in, on node %d", user->loginname, mynode);
broadcast("%s: %s logged in, on node %d", conf.bbs_name, user->loginname, mynode);
// check time left // check time left
now = time(NULL); now = time(NULL);
localtime_r(&now, &thetime); localtime_r(&now, &thetime);
@ -749,6 +789,7 @@ tryagain:
dolog("%s is logging out, on node %d", user->loginname, mynode); dolog("%s is logging out, on node %d", user->loginname, mynode);
broadcast("%s: %s is logging out, on node %d", conf.bbs_name, user->loginname, mynode);
disconnect("Log out"); disconnect("Log out");
} }

2
bbs.h
View File

@ -127,6 +127,8 @@ struct bbs_config {
int nodes; int nodes;
int newuserlvl; int newuserlvl;
int automsgwritelvl; int automsgwritelvl;
int broadcast_enable;
int broadcast_port;
int mail_conference_count; int mail_conference_count;
struct mail_conference **mail_conferences; struct mail_conference **mail_conferences;
int door_count; int door_count;

View File

@ -24,6 +24,8 @@ 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 Archivers = config/archivers.ini
Broadcast Enable = false
Broadcast Port = 2027
[paths] [paths]
WWW Path = /home/andrew/MagickaBBS/www WWW Path = /home/andrew/MagickaBBS/www

9
main.c
View File

@ -379,6 +379,14 @@ static int handler(void* user, const char* section, const char* name,
conf->bwave_max_msgs = atoi(value); conf->bwave_max_msgs = atoi(value);
} else if (strcasecmp(name, "archivers") == 0) { } else if (strcasecmp(name, "archivers") == 0) {
conf->archiver_path = strdup(value); conf->archiver_path = strdup(value);
} else if (strcasecmp(name, "broadcast enable") == 0) {
if (strcasecmp(value, "true") == 0) {
conf->broadcast_enable = 1;
} else {
conf->broadcast_enable = 0;
}
} else if (strcasecmp(name, "broadcast port") == 0) {
conf->broadcast_port = atoi(value);
} }
} else if (strcasecmp(section, "paths") == 0){ } else if (strcasecmp(section, "paths") == 0){
if (strcasecmp(name, "ansi path") == 0) { if (strcasecmp(name, "ansi path") == 0) {
@ -842,6 +850,7 @@ int main(int argc, char **argv) {
conf.www_path = NULL; conf.www_path = NULL;
conf.archiver_path = NULL; conf.archiver_path = NULL;
conf.archiver_count = 0; conf.archiver_count = 0;
conf.broadcast_enable = 0;
// Load BBS data // Load BBS data
if (ini_parse(argv[1], handler, &conf) <0) { if (ini_parse(argv[1], handler, &conf) <0) {