00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "korebot.h"
00012
00013 static char ksock_command_terminator = '\n';
00014 static char * ksock_buf_snd = NULL;
00015 static unsigned ksock_buf_len = 0;
00016
00017 static struct kb_command_s * ksock_cmd_list = NULL;
00018 unsigned ksock_cmd_n;
00019
00020 void DieWithError(char *errorMessage)
00021 {
00022 perror(errorMessage);
00023 exit(1);
00024 }
00025
00031 int ksock_init(char terminator, unsigned buffer_len)
00032 {
00033 ksock_command_terminator = terminator;
00034
00035 ksock_cmd_n = 0;
00036
00037 ksock_cmd_list = KB_ALLOC(struct kb_command_s, 1);
00038 ksock_cmd_list->name = NULL;
00039 ksock_cmd_list->minParam = 0;
00040 ksock_cmd_list->maxParam = 0;
00041 ksock_cmd_list->parse = NULL;
00042
00043
00044 ksock_buf_snd = KB_ALLOC(char, buffer_len);
00045 ksock_buf_len = buffer_len;
00046
00047 return 0;
00048 }
00049
00050
00054 int ksock_server_open(ksock_t * server, unsigned short port)
00055 {
00056
00057 if ((server->serv_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
00058 DieWithError("socket() failed");
00059
00060
00061 memset(&(server->serv_addr), 0, sizeof(server->serv_addr));
00062 server->serv_addr.sin_family = AF_INET;
00063 server->serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
00064 server->serv_addr.sin_port = htons(port);
00065
00066
00067 if (bind(server->serv_socket,
00068 (struct sockaddr *) &(server->serv_addr),sizeof(server->serv_addr)) < 0)
00069 DieWithError("bind() failed");
00070
00071
00072 if (listen(server->serv_socket, MAXPENDING) < 0)
00073 DieWithError("listen() failed");
00074
00075 return 0;
00076 }
00077
00078
00082 int ksock_next_connection(ksock_t * server)
00083 {
00084 struct sockaddr_in echoClntAddr;
00085 unsigned int clntLen;
00086 int clntSock;
00087
00088
00089 clntLen = sizeof(echoClntAddr);
00090
00091
00092 if ((clntSock = accept(server->serv_socket, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0)
00093 DieWithError("accept() failed");
00094
00095
00096 fcntl(clntSock, F_SETFL, O_NONBLOCK);
00097
00098
00099 kb_warning(KB_WARN_CONNECT, inet_ntoa(echoClntAddr.sin_addr));
00100
00101 return clntSock;
00102 }
00103
00113 int ksock_add_command(const char * name, int min_param,
00114 int max_param, int (*function)(int argc, char *argv[], void * data))
00115 {
00116 if(!ksock_cmd_list) {
00117 KB_ERROR("ksock_exec_command", KB_ERROR_NOINIT, "kb_socket");
00118 return -KB_ERROR_NOINIT;
00119 }
00120
00121
00122 ksock_cmd_list[ksock_cmd_n].name = KB_ALLOC(char, strlen(name));
00123 strcpy(ksock_cmd_list[ksock_cmd_n].name, name);
00124 ksock_cmd_list[ksock_cmd_n].minParam = min_param;
00125 ksock_cmd_list[ksock_cmd_n].maxParam = max_param;
00126 ksock_cmd_list[ksock_cmd_n].parse = function;
00127
00128 ksock_cmd_n++;
00129
00130
00131 ksock_cmd_list = KB_REALLOC(ksock_cmd_list, struct kb_command_s, ksock_cmd_n + 1);
00132 ksock_cmd_list[ksock_cmd_n].name = NULL;
00133 ksock_cmd_list[ksock_cmd_n].minParam = 0;
00134 ksock_cmd_list[ksock_cmd_n].maxParam = 0;
00135 ksock_cmd_list[ksock_cmd_n].parse = NULL;
00136
00137 return 0;
00138 }
00139
00146 int ksock_remove_command(char * name)
00147 {
00148 int index;
00149
00150 if(!ksock_cmd_list) {
00151 KB_ERROR("ksock_exec_command", KB_ERROR_NOINIT, "kb_socket");
00152 return -KB_ERROR_NOINIT;
00153 }
00154
00155 index = kb_find_command(name, ksock_cmd_list);
00156 if(index < 0)
00157 return index;
00158
00159 for(; index<ksock_cmd_n-1; index++) {
00160 memcpy(&(ksock_cmd_list[index]), &ksock_cmd_list[index+1], sizeof(kb_command_t));
00161 }
00162
00163 ksock_cmd_list[index].name = NULL;
00164 ksock_cmd_list[index].minParam = 0;
00165 ksock_cmd_list[index].maxParam = 0;
00166 ksock_cmd_list[index].parse = NULL;
00167
00168 return 0;
00169 }
00170
00171 void list_command()
00172 {
00173 kb_command_t * scan = ksock_cmd_list;
00174
00175 while(scan->name != NULL) {
00176 printf("%s: %d,%d\r\n", scan->name, scan->minParam, scan->maxParam);
00177 scan++;
00178 }
00179 }
00180
00186 int ksock_send_command(int socket, char * cmd, ...)
00187 {
00188 va_list ap;
00189 int buflen;
00190
00191
00192 va_start(ap, cmd);
00193
00194
00195 vsnprintf(ksock_buf_snd, ksock_buf_len-1, cmd, ap);
00196 buflen = strlen(ksock_buf_snd);
00197 ksock_buf_snd[buflen] = ksock_command_terminator;
00198
00199 buflen++;
00200
00201
00202 if (send(socket, ksock_buf_snd, buflen, 0) != buflen)
00203 DieWithError("send() sent a different number of bytes than expected");
00204
00205
00206 va_end(ap);
00207 }
00208
00216 int ksock_send_answer(int * socketStorage, char * cmd)
00217 {
00218 int buflen;
00219
00220
00221 strncpy(ksock_buf_snd,cmd,ksock_buf_len-1);
00222 buflen = strlen(ksock_buf_snd);
00223 ksock_buf_snd[buflen] = ksock_command_terminator;
00224 buflen++;
00225
00226
00227 if (send(*socketStorage, ksock_buf_snd, buflen, 0) != buflen)
00228 DieWithError("send() sent a different number of bytes than expected");
00229
00230 kb_free(socketStorage);
00231 }
00232
00260 int ksock_exec_command_pending(int clntSock, char * cmd)
00261 {
00262 int * socketStorage;
00263
00264 if(!ksock_cmd_list) {
00265 KB_ERROR("ksock_exec_command", KB_ERROR_NOINIT, "kb_socket");
00266 return -KB_ERROR_NOINIT;
00267 }
00268
00269 socketStorage = KB_ALLOC(int,1);
00270 *socketStorage = clntSock;
00271
00272 return kb_parse_command( cmd, ksock_cmd_list,(void*)socketStorage);
00273 }
00274
00285 int ksock_exec_command(char * cmd)
00286 {
00287 if(!ksock_cmd_list) {
00288 KB_ERROR("ksock_exec_command", KB_ERROR_NOINIT, "kb_socket");
00289 return -KB_ERROR_NOINIT;
00290 }
00291
00292 return kb_parse_command( cmd, ksock_cmd_list,NULL);
00293 }
00294
00308 int ksock_get_command(int clntSocket, char * cmdBuffer, unsigned bufSize)
00309 {
00310 int recvMsgSize;
00311 char * term;
00312 unsigned cmdLen;
00313
00314
00315 if ((recvMsgSize = recv(clntSocket, cmdBuffer, bufSize-1, MSG_PEEK)) < 0)
00316 {
00317 if(errno == EAGAIN) {
00318 cmdBuffer[0] = '\0';
00319 return 0;
00320 }
00321 else
00322 DieWithError("recv() failed");
00323 }
00324
00325
00326 if(!recvMsgSize) {
00327 cmdBuffer[0] = '\0';
00328 return -3;
00329 }
00330
00331
00332 cmdBuffer[recvMsgSize] = '\0';
00333
00334
00335 term = strchr(cmdBuffer, ksock_command_terminator);
00336 if( term == NULL) {
00337 cmdBuffer[0] = '\0';
00338 return -1;
00339 }
00340
00341
00342 *term = '\0';
00343 cmdLen = strlen(cmdBuffer) + 1;
00344
00345
00346 if ((recvMsgSize = recv(clntSocket, cmdBuffer, cmdLen, 0)) < 0)
00347 DieWithError("recv() failed");
00348
00349 if(recvMsgSize != cmdLen) {
00350 cmdBuffer[0] = '\0';
00351 return -2;
00352 }
00353
00354
00355 cmdBuffer[recvMsgSize - 1] = '\0';
00356
00357
00358 return recvMsgSize;
00359 }
00360
00370 int ksock_connect(char * servIP, unsigned short servPort)
00371 {
00372 struct sockaddr_in servAddr;
00373 int sock;
00374
00375
00376 if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
00377 DieWithError("socket() failed");
00378
00379
00380 memset(&servAddr, 0, sizeof(servAddr));
00381 servAddr.sin_family = AF_INET;
00382 servAddr.sin_addr.s_addr = inet_addr(servIP);
00383 servAddr.sin_port = htons(servPort);
00384
00385
00386 if (connect(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
00387 DieWithError("connect() failed");
00388
00389 return sock;
00390 }
00391
00392 int ksock_server_close(ksock_t * server)
00393 {
00394
00395 }