mcabber/src/server.c
author mikael
Sun, 27 Mar 2005 20:16:02 +0000
changeset 24 e88b15cbf2de
child 26 8588f5a4b638
permissions -rw-r--r--
[/trunk] Changeset 40 by mikael * Change structure -> src directory for mcabber source code...
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     1
#include <arpa/inet.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     2
#include <netdb.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     3
#include <stdio.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     4
#include <stdlib.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     5
#include <string.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     6
#include <sys/poll.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     7
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     8
#include "list.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     9
#include "parsecfg.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    10
#include "screen.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    11
#include "socket.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    12
#include "utf8.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    13
#include "server.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    14
#include "harddefines.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    15
#include "utils.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    16
#include "buddies.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    17
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    18
#define JABBERPORT 5222
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    19
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    20
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    21
/* Desc: poll data from server
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    22
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    23
 * In  : socket
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    24
 * Out : pending buffer (or NULL if no incoming data)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    25
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    26
 * Note: it is up to the caller to free the returned string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    27
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    28
char *srv_poll(int sock)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    29
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    30
  struct pollfd sock_p;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    31
  sock_p.fd = sock;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    32
  sock_p.events = POLLIN | POLLPRI;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    33
  sock_p.revents = 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    34
  poll(&sock_p, 1, 0);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    35
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    36
  if (sock_p.revents) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    37
    return sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    38
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    39
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    40
  return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    41
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    42
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    43
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    44
/* Desc: resolve host
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    45
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    46
 * In  : hostname
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    47
 * Out : 32bit address (or 0 if error)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    48
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    49
 * Note: -
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    50
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    51
static u_long srv_resolve(const char *host)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    52
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    53
  long i;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    54
  struct hostent *he;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    55
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    56
  if ((i = inet_addr(host)) == -1) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    57
    if (!(he = gethostbyname(host)))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    58
      return 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    59
    else
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    60
      return (*(u_long *) he->h_addr);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    61
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    62
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    63
  return i;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    64
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    65
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    66
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    67
/* Desc: connect to jabber server
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    68
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    69
 * In  : config
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    70
 * Out : socket (or -1 on error)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    71
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    72
 * Note: if port is -1, the default Jabber port will be used
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    73
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    74
int srv_connect(const char *server, unsigned int port)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    75
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    76
  struct sockaddr_in name;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    77
  int sock;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    78
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    79
  if (server == NULL) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    80
    fprintf(stderr, "You must supply a server name\n\r");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    81
    return -1;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    82
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    83
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    84
  if (port == -1U) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    85
    port = JABBERPORT;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    86
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    87
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    88
  name.sin_family = AF_INET;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    89
  name.sin_port = htons(port);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    90
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    91
  if (!(name.sin_addr.s_addr = srv_resolve(server))) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    92
    fprintf(stderr, "Cant resolve \"%s\"\n", server);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    93
    return -1;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    94
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    95
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    96
  if ((sock = sk_conn((struct sockaddr *) &name)) < 0) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    97
    fprintf(stderr, "Can't connect to \"%s:%u\"\n", server, port);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    98
    return -1;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    99
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   100
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   101
  return sock;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   102
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   103
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   104
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   105
/* Desc: login into jabber server
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   106
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   107
 * In  : socket, servername, user, password, resource
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   108
 * Out : idsession
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   109
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   110
 * Note: it is up to the caller to free the returned string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   111
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   112
char *srv_login(int sock, const char *server, const char *user,
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   113
		const char *pass, const char *resource)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   114
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   115
  char *stringtosend = malloc(2048);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   116
  char *response, *aux;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   117
  char *idsession = malloc(128);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   118
  int pos = 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   119
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   120
  memset(stringtosend, 0, 2048);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   121
  strcpy(stringtosend, "<?xml version='1.0' encoding='UTF-8' ?>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   122
  strcat(stringtosend, "<stream:stream to='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   123
  strcat(stringtosend, server);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   124
  strcat(stringtosend, "' xmlns='jabber:client' xmlns:stream='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   125
  strcat(stringtosend, "http://etherx.jabber.org/streams'>\n");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   126
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   127
  if (!sk_send(sock, stringtosend)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   128
    perror("senddata (server.c:132)");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   129
    return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   130
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   131
  response = sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   132
  if (strstr(response, "error")) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   133
    /* fprintf(stderr, "Response not valid:\n%s\n\n", response); */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   134
    scr_CreatePopup("Error",
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   135
		    "Bad answer from the server", 60, 0, NULL);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   136
    return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   137
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   138
  aux = response;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   139
  while (strncmp(aux, "id", 2))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   140
    aux++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   141
  pos = 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   142
  aux += 4;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   143
  while (strncmp(aux, "'", 1)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   144
    aux++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   145
    pos++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   146
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   147
  aux -= pos;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   148
  strncpy(idsession, aux, pos);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   149
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   150
  free(response);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   151
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   152
  strcpy(stringtosend, "<iq type='set' id='1000'>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   153
  strcat(stringtosend, "<query xmlns='jabber:iq:auth'>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   154
  strcat(stringtosend, "<username>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   155
  strcat(stringtosend, user);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   156
  strcat(stringtosend, "</username><password>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   157
  strcat(stringtosend, pass);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   158
  strcat(stringtosend, "</password><resource>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   159
  strcat(stringtosend, resource);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   160
  strcat(stringtosend, "</resource></query></iq>\n");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   161
  if (!sk_send(sock, stringtosend)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   162
    perror("senddata (server.c:167)");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   163
    return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   164
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   165
  response = sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   166
  if (strstr(response, "error")) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   167
/*	fprintf(stderr, "Response not valid:\n%s\n\n", response);*/
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   168
    scr_CreatePopup("Error",
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   169
		    "Account doesn't exist, or bad password", 60, 0,
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   170
		    NULL);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   171
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   172
    /*
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   173
    scr_CreatePopup("Info", "Trying to create the account...", 60, 0, NULL);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   174
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   175
    strcpy(stringtosend, "<iq type='set' id='reg' to='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   176
    strcat(stringtosend, server);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   177
    strcat(stringtosend, "'>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   178
    strcat(stringtosend, "<query xmlns='jabber:iq:register'>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   179
    strcat(stringtosend, "<username>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   180
    strcat(stringtosend, user);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   181
    strcat(stringtosend, "</username><password>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   182
    strcat(stringtosend, pass);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   183
    strcat(stringtosend, "</password>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   184
    strcat(stringtosend, "</query></iq>\n");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   185
    if (!sk_send(sock, stringtosend)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   186
      perror("senddata (server.c:167)");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   187
      return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   188
    }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   189
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   190
    response = sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   191
    */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   192
    scr_TerminateCurses();
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   193
    printf("Reinicie cabber!\n\n");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   194
    return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   195
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   196
  free(response);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   197
  free(stringtosend);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   198
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   199
  return idsession;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   200
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   201
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   202
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   203
/* Desc: broadcast presence
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   204
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   205
 * In  : socket, presence string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   206
 * Out : ?
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   207
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   208
 * Note: see `sk_send' for output values
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   209
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   210
int srv_setpresence(int sock, const char *type)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   211
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   212
  int rv;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   213
  char *str = malloc(1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   214
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   215
  sprintf(str, "<presence><status>%s</status></presence>", type);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   216
  if (!(rv = sk_send(sock, str))) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   217
    perror("senddata (server.c:199)");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   218
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   219
  free(str);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   220
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   221
  return rv;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   222
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   223
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   224
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   225
/* Desc: request roster
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   226
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   227
 * In  : socket
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   228
 * Out : roster string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   229
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   230
 * Note: it is up to the caller to free the returned string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   231
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   232
char *srv_getroster(int sock)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   233
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   234
  char *str = malloc(1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   235
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   236
  strcpy(str, "<iq type='get' id='1001'><query xmlns='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   237
  strcat(str, "jabber:iq:roster'/></iq>\n");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   238
  if (!sk_send(sock, str)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   239
    perror("senddata (server.c:222)");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   240
    return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   241
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   242
  free(str);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   243
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   244
  return sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   245
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   246
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   247
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   248
/* Desc: send text to buddy
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   249
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   250
 * In  : socket, destination jid, text, source jid
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   251
 * Out : 0 = ok
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   252
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   253
 * Note: -
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   254
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   255
int
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   256
srv_sendtext(int sock, const char *to, const char *text, const char *from)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   257
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   258
  char *stringtosend = malloc(2048);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   259
  char *utf8inputline = utf8_encode(text);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   260
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   261
  sprintf(stringtosend,
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   262
	  "<message from='%s' to='%s' type='chat'><body>%s</body></message>",
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   263
	  from, to, utf8inputline);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   264
  if (!sk_send(sock, stringtosend)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   265
    perror("senddata (server.c:247)");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   266
    return -1;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   267
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   268
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   269
  free(stringtosend);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   270
  free(utf8inputline);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   271
  return 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   272
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   273
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   274
int check_io(int fd1, int fd2)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   275
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   276
  int n = 0, i;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   277
  fd_set fds;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   278
  int io_pending = 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   279
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   280
  i = fd1;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   281
  if (fd2 > fd1)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   282
    i = fd2;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   283
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   284
  FD_ZERO(&fds);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   285
  if (fd1 >= 0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   286
    FD_SET(fd1, &fds);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   287
  else
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   288
    fd1 = 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   289
  if (fd2 >= 0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   290
    FD_SET(fd2, &fds);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   291
  else
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   292
    fd2 = 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   293
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   294
  if (fd2 == 0 && io_pending)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   295
    n = 2;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   296
  else if (select(i + 1, &fds, NULL, NULL, NULL) > 0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   297
    n = 1 * (FD_ISSET(fd1, &fds) > 0) + 2 * (FD_ISSET(fd2, &fds) > 0);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   298
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   299
  return (n);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   300
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   301
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   302
/* Desc: read data from server
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   303
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   304
 * In  : socket
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   305
 * Out : ptr to newly allocated srv_msg struct
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   306
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   307
 * Note: returns NULL if no input from server
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   308
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   309
srv_msg *readserver(int sock)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   310
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   311
  char *buffer = sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   312
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   313
  if (buffer != NULL) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   314
    srv_msg *msg = calloc(1, sizeof(srv_msg));
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   315
    char *to = getattr(buffer, "to='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   316
    char *from = getattr(buffer, "from='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   317
    char *id = getattr(buffer, "id='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   318
    char *type = getattr(buffer, "type='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   319
    char *body = gettag(buffer, "body");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   320
    char *status = gettag(buffer, "status");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   321
    char *show = gettag(buffer, "show");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   322
    char *line = (char *) malloc(1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   323
    memset(line, 0, 1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   324
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   325
    /* scan for buffer */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   326
    if (!strncmp(buffer, "<message", 8)) {		/* manage messages */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   327
      msg->m = SM_MESSAGE;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   328
    } else if (!strncmp(buffer, "<presence", 9)) {	/* manage presences */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   329
      msg->m = SM_PRESENCE;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   330
      if (!strncmp(type, "UNK", 3)) {			/* assume online */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   331
	msg->connected = FLAG_BUDDY_CONNECTED;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   332
      } else if (!strncmp(type, "unavailable", 11)) {	/* offline */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   333
	msg->connected = 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   334
      }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   335
    } else {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   336
      msg->m = SM_UNHANDLED;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   337
    }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   338
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   339
    /* write the parsed buffer */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   340
    switch (msg->m) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   341
    case SM_MESSAGE:
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   342
      {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   343
	char *aux = strstr(from, "/");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   344
	if (aux)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   345
	  *aux = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   346
	msg->from = from;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   347
	msg->body = utf8_decode(body);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   348
	ut_WriteLog("+OK [%s]\n", buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   349
      }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   350
      break;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   351
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   352
    case SM_PRESENCE:
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   353
      {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   354
	char *aux = strstr(from, "/");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   355
	if (aux)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   356
	  *aux = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   357
	msg->from = from;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   358
      }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   359
      break;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   360
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   361
    case SM_UNHANDLED:
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   362
      ut_WriteLog("BAD [%s]\n", buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   363
      break;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   364
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   365
    }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   366
    free(line);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   367
    if (strncmp(to, "UNK", 3))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   368
      free(to);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   369
    if (strncmp(from, "UNK", 3) && (msg->m != SM_MESSAGE)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   370
	&& (msg->m != SM_PRESENCE))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   371
      free(from);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   372
    if (strncmp(id, "UNK", 3))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   373
      free(id);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   374
    if (strncmp(type, "UNK", 3))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   375
      free(type);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   376
    if (strncmp(body, "UNK", 3))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   377
      free(body);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   378
    if (strncmp(status, "UNK", 3))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   379
      free(status);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   380
    if (strncmp(show, "UNK", 3))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   381
      free(show);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   382
    free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   383
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   384
    return msg;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   385
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   386
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   387
  return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   388
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   389
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   390
void srv_AddBuddy(int sock, char *jidname)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   391
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   392
  char *buffer = (char *) malloc(1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   393
  char *p, *str;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   394
  int i;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   395
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   396
  memset(buffer, 0, 1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   397
  strcpy(buffer, "<iq type='set'>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   398
  strcat(buffer, "  <query xmlns='jabber:iq:roster'>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   399
  strcat(buffer, "    <item");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   400
  strcat(buffer, "      jid='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   401
  strcat(buffer, jidname);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   402
  strcat(buffer, "' name='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   403
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   404
  str = strdup(jidname);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   405
  p = strstr(str, "@");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   406
  if (p)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   407
    *p = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   408
  strcat(buffer, str);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   409
  strcat(buffer, "'/></query></iq>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   410
  sk_send(sock, buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   411
  free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   412
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   413
  for (i = 0; i < 2; i++) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   414
    buffer = sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   415
    ut_WriteLog("[Subscription]: %s\n", buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   416
    free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   417
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   418
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   419
  buffer = (char *) malloc(1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   420
  memset(buffer, 0, 1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   421
  strcpy(buffer, "<presence to='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   422
  strcat(buffer, jidname);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   423
  strcat(buffer, "' type='subscribe'>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   424
  strcat(buffer, "<status>I would like to add you!</status></presence>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   425
  sk_send(sock, buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   426
  free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   427
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   428
  buffer = sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   429
  ut_WriteLog("[Subscription]: %s\n", buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   430
  free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   431
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   432
  buffer = (char *) malloc(1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   433
  memset(buffer, 0, 1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   434
  strcpy(buffer, "<presence to='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   435
  strcat(buffer, jidname);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   436
  strcat(buffer, "' type='subscribed'/>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   437
  sk_send(sock, buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   438
  free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   439
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   440
  buffer = sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   441
  ut_WriteLog("[Subscription]: %s\n", buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   442
  free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   443
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   444
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   445
void srv_DelBuddy(int sock, char *jidname)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   446
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   447
  char *buffer = (char *) malloc(1024);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   448
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   449
  strcpy(buffer, "<iq type='set'><query xmlns='jabber:iq:roster'>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   450
  strcat(buffer, "<item jid='");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   451
  strcat(buffer, jidname);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   452
  strcat(buffer, "' subscription='remove'/></query></iq>");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   453
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   454
  sk_send(sock, buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   455
  free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   456
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   457
  buffer = sk_recv(sock);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   458
  ut_WriteLog("[SubscriptionRemove]: %s\n", buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   459
  free(buffer);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   460
}