view mcabber/socket.c @ 11:b8815158a45d

[/trunk] Changeset 26 by mikael * Solve some display problems by introducing "force_show" parameter in the scr_WriteInWindow() function. (Ugly, yes...) * Do not display title for Status/Chat window
author mikael
date Sun, 20 Mar 2005 22:40:56 +0000
parents b3b2332715fb
children 0c2d2b79c4b5
line wrap: on
line source

#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;
}