Mercurial > hg
diff mcabber/socket.c @ 0:b3b2332715fb
Tailorization of /trunk
Import of the upstream sources from
Repository: file:///tmp/svn-mcabber
Module: /trunk
Revision: 15
author | tailor@frmp8452 |
---|---|
date | Thu, 30 Jun 2005 21:39:31 +0000 |
parents | |
children | 0c2d2b79c4b5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mcabber/socket.c Thu Jun 30 21:39:31 2005 +0000 @@ -0,0 +1,101 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <unistd.h> +#include "utils.h" + +#include "socket.h" +#include <signal.h> + +/* Desc: create socket connection + * + * In : servername, port + * Out : socket (or -1 on error) + * + * Note: - + */ +int sk_conn(struct sockaddr *name) +{ + int sock; + + if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket (socket.c:23)"); + return -1; + } + + if (connect(sock, (struct sockaddr *) name, sizeof(struct sockaddr)) < 0) { + perror("connect (socket.c:29)"); + return -1; + } + + return sock; +} + + +/* Desc: send data through socket + * + * In : socket, buffer to send + * Out : 0 = fail, 1 = pass + * + * Note: - + */ +int sk_send(int sock, char *buffer) +{ + if ((send(sock, buffer, strlen(buffer), 0)) == -1) + return 0; + else + return 1; +} + +/* Desc: receive data through socket + * + * In : socket + * Out : received buffer + * + * Note: it is up to the caller to free the returned string + */ +char *sk_recv(int sock) +{ + int i = 1; + int tambuffer = 128; + char mtag[16]; + + char *buffer = malloc(tambuffer); + char *retval = malloc(tambuffer + 1); + + memset(retval, 0, tambuffer); + memset(buffer, 0, tambuffer + 1); + + while (1) { + char *p1; + recv(sock, buffer, tambuffer, 0); + + if (i == 1) { + char *p2; + strcpy(retval, buffer); + p1 = retval+1; + p2 = mtag; + while (('a' <= *p1) && (*p1 <= 'z') && (p2-mtag < 14)) + *p2++ = *p1++; + *p2++ = '>'; *p2++ = 0; + //fprintf(stderr, "TAG=\"%s\"\n", mtag); + } else { + retval = realloc(retval, (tambuffer * i) + 1); + strncat(retval, buffer, tambuffer + 1); + } + i++; + p1 = retval + strlen(retval) - strlen(mtag); + //fprintf(stderr, "buffer:[%s]\n", buffer); + //fprintf(stderr, "End RET=[%s]\n", p1); + if (!strcmp(p1, mtag)) + break; + for (p1 = retval; *p1 && (*p1 != '>'); p1++); + if ((*p1 == '>') && (*(p1-1) == '/')) + break; + memset(buffer, 0, tambuffer); + } + free(buffer); + ut_WriteLog("Received:%s\n", retval); + return retval; +}