feat: server
This commit is contained in:
parent
53bfd71f9f
commit
bcabef7925
123
hw5/src/server.c
123
hw5/src/server.c
|
@ -3,19 +3,134 @@
|
||||||
* Manages interaction with a client telephone unit (TU).
|
* Manages interaction with a client telephone unit (TU).
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "pbx.h"
|
#include "pbx.h"
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
#include "tu.h"
|
||||||
/*
|
/*
|
||||||
* Thread function for the thread that handles interaction with a client TU.
|
* Thread function for the thread that handles interaction with a client TU.
|
||||||
* This is called after a network connection has been made via the main server
|
* This is called after a network connection has been made via the main server
|
||||||
* thread and a new thread has been created to handle the connection.
|
* thread and a new thread has been created to handle the connection.
|
||||||
*/
|
*/
|
||||||
#if 0
|
#if 1
|
||||||
|
int pbx_get_next_command(FILE* f, char** str);
|
||||||
|
int pbx_run_command(TU *tu, char* cmd);
|
||||||
|
|
||||||
void *pbx_client_service(void *arg) {
|
void *pbx_client_service(void *arg) {
|
||||||
// TO BE IMPLEMENTED
|
// detach the thread
|
||||||
abort();
|
pthread_detach(pthread_self());
|
||||||
|
|
||||||
|
// free file descriptor
|
||||||
|
if (!arg)
|
||||||
|
return NULL;
|
||||||
|
int fd = *(int*)arg;
|
||||||
|
free(arg);
|
||||||
|
|
||||||
|
// init TU
|
||||||
|
TU* tu = tu_init(fd);
|
||||||
|
if (!tu)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// open socket
|
||||||
|
FILE *f = fdopen(fd, "r");
|
||||||
|
|
||||||
|
// register tu
|
||||||
|
if (pbx_register(pbx, tu, fd))
|
||||||
|
{
|
||||||
|
// not success
|
||||||
|
fclose(f);
|
||||||
|
tu_unref(tu, "fail to register a TU");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// success
|
||||||
|
char* command = NULL;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
command = NULL;
|
||||||
|
if (pbx_get_next_command(f, &command))
|
||||||
|
break;
|
||||||
|
debug("Got command: %s", command);
|
||||||
|
pbx_run_command(tu, command);
|
||||||
|
free(command);
|
||||||
|
}
|
||||||
|
// no more command
|
||||||
|
fclose(f);
|
||||||
|
tu_unref(tu, "unregister tu");
|
||||||
|
pbx_unregister(pbx, tu);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* try to get the next command from f and assign to str
|
||||||
|
* return 0 if next command exist
|
||||||
|
* return -1 if next command does not exist or have length 0
|
||||||
|
* return -2 if fail to alloc memory
|
||||||
|
* return -3 if fail to realloc memory
|
||||||
|
*/
|
||||||
|
int pbx_get_next_command(FILE* f, char** str) {
|
||||||
|
int size = 8, index = 0;
|
||||||
|
char *cmd = malloc(sizeof(char) * size);
|
||||||
|
if (!cmd)
|
||||||
|
// fail to alloc memory
|
||||||
|
return -2;
|
||||||
|
|
||||||
|
char c;
|
||||||
|
while ((c = fgetc(f)) != EOF)
|
||||||
|
{
|
||||||
|
if (index == size - 1)
|
||||||
|
{
|
||||||
|
size *= 2;
|
||||||
|
cmd = realloc(cmd, sizeof(char)*size);
|
||||||
|
if (!cmd)
|
||||||
|
// fail to realloc memory
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '\n')
|
||||||
|
break;
|
||||||
|
if (c == '\r')
|
||||||
|
c = '\0';
|
||||||
|
|
||||||
|
cmd[index++] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
// command is empty
|
||||||
|
if (index == 0) {
|
||||||
|
free(cmd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd[index--] = '\0';
|
||||||
|
*str = cmd;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pbx_run_command(TU *tu, char* cmd) {
|
||||||
|
if (!strcmp(tu_command_names[TU_PICKUP_CMD], cmd))
|
||||||
|
return tu_pickup(tu);
|
||||||
|
if (!strcmp(tu_command_names[TU_HANGUP_CMD], cmd))
|
||||||
|
return tu_hangup(tu);
|
||||||
|
if (cmd == strstr(cmd, tu_command_names[TU_DIAL_CMD]))
|
||||||
|
{
|
||||||
|
char* ptr = &cmd[strlen(tu_command_names[TU_DIAL_CMD])];
|
||||||
|
while (*ptr == ' ')
|
||||||
|
ptr ++;
|
||||||
|
if (!*ptr)
|
||||||
|
return -1;
|
||||||
|
return pbx_dial(pbx, tu, atoi(ptr));
|
||||||
|
}
|
||||||
|
if (cmd == strstr(cmd, tu_command_names[TU_CHAT_CMD]))
|
||||||
|
{
|
||||||
|
char* ptr = &cmd[strlen(tu_command_names[TU_CHAT_CMD])];
|
||||||
|
while (*ptr == ' ')
|
||||||
|
ptr ++;
|
||||||
|
return tu_chat(tu, ptr);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user