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
00217 int ksock_send_answer(int * socketStorage, char * cmd)
00218 {
00219 int buflen;
00220
00221
00222 strncpy(ksock_buf_snd,cmd,ksock_buf_len-1);
00223 buflen = strlen(ksock_buf_snd);
00224 ksock_buf_snd[buflen] = ksock_command_terminator;
00225 buflen++;
00226
00227
00228 if (send(*socketStorage, ksock_buf_snd, buflen, 0) != buflen)
00229 DieWithError("send() sent a different number of bytes than expected");
00230
00231 kb_free(socketStorage);
00232 }
00233
00255 int ksock_exec_command_pending(int clntSock, char * cmd)
00256 {
00257 int * socketStorage;
00258
00259 if(!ksock_cmd_list) {
00260 KB_ERROR("ksock_exec_command", KB_ERROR_NOINIT, "kb_socket");
00261 return -KB_ERROR_NOINIT;
00262 }
00263
00264 socketStorage = KB_ALLOC(int,1);
00265 *socketStorage = clntSock;
00266
00267 return kb_parse_command( cmd, ksock_cmd_list,(void*)socketStorage);
00268 }
00269
00280 int ksock_exec_command(char * cmd)
00281 {
00282 if(!ksock_cmd_list) {
00283 KB_ERROR("ksock_exec_command", KB_ERROR_NOINIT, "kb_socket");
00284 return -KB_ERROR_NOINIT;
00285 }
00286
00287 return kb_parse_command( cmd, ksock_cmd_list,NULL);
00288 }
00289
00303 int ksock_get_command(int clntSocket, char * cmdBuffer, unsigned bufSize)
00304 {
00305 int recvMsgSize;
00306 char * term;
00307 unsigned cmdLen;
00308
00309
00310 if ((recvMsgSize = recv(clntSocket, cmdBuffer, bufSize-1, MSG_PEEK)) < 0)
00311 {
00312 if(errno == EAGAIN) {
00313 cmdBuffer[0] = '\0';
00314 return 0;
00315 }
00316 else
00317 DieWithError("recv() failed");
00318 }
00319
00320
00321 if(!recvMsgSize) {
00322 cmdBuffer[0] = '\0';
00323 return -3;
00324 }
00325
00326
00327 cmdBuffer[recvMsgSize] = '\0';
00328
00329
00330 term = strchr(cmdBuffer, ksock_command_terminator);
00331 if( term == NULL) {
00332 cmdBuffer[0] = '\0';
00333 return -1;
00334 }
00335
00336
00337 *term = '\0';
00338 cmdLen = strlen(cmdBuffer) + 1;
00339
00340
00341 if ((recvMsgSize = recv(clntSocket, cmdBuffer, cmdLen, 0)) < 0)
00342 DieWithError("recv() failed");
00343
00344 if(recvMsgSize != cmdLen) {
00345 cmdBuffer[0] = '\0';
00346 return -2;
00347 }
00348
00349
00350 cmdBuffer[recvMsgSize - 1] = '\0';
00351
00352
00353 return recvMsgSize;
00354 }
00355
00364 int ksock_connect(char * servIP, unsigned short servPort)
00365 {
00366 struct sockaddr_in servAddr;
00367 int sock;
00368
00369
00370 if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
00371 DieWithError("socket() failed");
00372
00373
00374 memset(&servAddr, 0, sizeof(servAddr));
00375 servAddr.sin_family = AF_INET;
00376 servAddr.sin_addr.s_addr = inet_addr(servIP);
00377 servAddr.sin_port = htons(servPort);
00378
00379
00380 if (connect(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
00381 DieWithError("connect() failed");
00382
00383 return sock;
00384 }
00385
00391 int ksock_server_close(ksock_t * server)
00392 {
00393
00394 }