noirchat/main.c

122 lines
3.0 KiB
C

#include "macros.h"
#include "net.h"
#include "users.h"
#include "common.h"
#include "con/console.h"
#include "ui_common.h"
#include <string.h>
#define STDIN 0
#define DATAGRAM_SIZE 512
#define QUIT_STRING "quit"
#define QUIT_MESSAGE "さよなら!"
#define NICK_STRING "nick"
#define NICK_MESSAGE "nick set to"
#define NICK_SYNTAX "/nick new_nickname"
#define SET_STRING "set"
#define SET_IP_STRING "ip"
#define SET_IP_MESSAGE "(re)start send/listen sockets to use new IP"
#define SET_PORT_STRING "port"
#define START_STRING "start"
#define START_SYNTAX "/start listen|send"
#define START_LISTEN "listen"
#define START_LISTEN_MESSAGE "--starting listen--"
#define START_SEND "send"
#define START_SEND_MESSAGE "--starting send--"
#define STOP_STRING "stop"
#define STOP_LISTEN "listen"
#define STOP_LISTEN_MESSAGE "--stopping listen--"
#define STOP_SEND "send"
#define STOP_SEND_MESSAGE "--stopping send--"
#define RESTART_STRING "restart"
#define RESTART_MESSAGE "--restarting sockets--"
#define HELP_STRING "help"
#define UNKNOWN_CMD_MESSAGE "unknown command"
int main() {
char data_buffer[2047];
FD_ZERO(&master_fds);
FD_ZERO(&read_fds);
getInterfaces();
initNetwork();
addCommand(QUIT_COMMAND, quitProgram);
addCommand(HELP_COMMAND, showHelp);
addCommand(SET_COMMAND, setConfig);
addCommand(LIST_COMMAND, showVariables);
addCommand(RESTART_COMMAND, restartSockets);
addCommand(START_COMMAND, startSockets);
addCommand(STOP_COMMAND, stopSockets);
addCommand("open", sendOpen);
addCommand(WHO_COMMAND, showUsers);
addHelp(WHO_COMMAND, WHO_HELP);
addSyntax(WHO_COMMAND, WHO_SYNTAX);
addHelp(SET_COMMAND, SET_HELP);
addSyntax(SET_COMMAND, SET_SYNTAX);
addHelp(LIST_COMMAND, LIST_HELP);
addHelp(START_COMMAND, START_HELP);
addSyntax(START_COMMAND, START_SYNTAX);
addHelp(STOP_COMMAND, STOP_HELP);
addSyntax(STOP_COMMAND, STOP_SYNTAX);
addHelp(RESTART_COMMAND, RESTART_HELP);
addSyntax(RESTART_COMMAND, RESTART_SYNTAX);
addHelp(QUIT_COMMAND, QUIT_HELP);
addHelp(HELP_COMMAND, HELP_HELP);
addSyntax(HELP_COMMAND, HELP_SYNTAX);
if (initInterface() == 0) {
is_running = 1;
} else {
printf("error, couldn't start interface...\n");
}
while(is_running) {
read_fds = master_fds;
if (select(max_fd+1, &read_fds, NULL, NULL, NULL) == -1) {
perror("select");
return -1;
}
for (i = 0; i <= max_fd; i++) {
if (FD_ISSET(i, &read_fds)) {
if (i == interface_fd) {
handleInterface();
} else if (i == listen_socket) {
if (recvfrom(listen_socket, data_buffer, DATAGRAM_SIZE, 0, (struct sockaddr *) &from_address, &from_address_length) < 0) {
perror("couldn't recvfrom() listen_socket");
} else {
handleNetInput(data_buffer);
messageOpen(current_message);
}
}
}
}
}
closeInterface();
stopSockets(NULL);
freeMessage(&current_message);
freeInterfaces();
freeUserList(&user_list);
freeHelp();
freeSyntax();
freeConfig();
setAttribute(GREEN);
printf("%s\n", QUIT_MESSAGE);
clearAttributes();
return 0;
}