annotate mcabber/libjabber/jconn.c @ 403:17aa60c6dc63

Allow a different server name than the jid domain name Sync libjabber with upstream (centericq). The libjabber patch is from Ian Johannesen. This allows connecting to Google Talk, for example.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 27 Aug 2005 11:21:27 +0200
parents bd5638c21834
children ec86d759ed54
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
1 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
2 * This program is free software; you can redistribute it and/or modify
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
3 * it under the terms of the GNU General Public License as published by
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
4 * the Free Software Foundation; either version 2 of the License, or
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
5 * (at your option) any later version.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
6 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
7 * This program is distributed in the hope that it will be useful,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
10 * GNU General Public License for more details.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
11 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
12 * You should have received a copy of the GNU General Public License
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
13 * along with this program; if not, write to the Free Software
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
15 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
16 * Jabber
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
17 * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
18 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
19
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
20 #include "jabber.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
21 #include "connwrap.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
22
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 176
diff changeset
23 #include "../src/logprint.h" /* For logging */
176
99a99a160113 [/trunk] Changeset 188 by mikael
mikael
parents: 172
diff changeset
24
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
25 /* local macros for launching event handlers */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
26 #define STATE_EVT(arg) if(j->on_state) { (j->on_state)(j, (arg) ); }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
27
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
28 /* prototypes of the local functions */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
29 static void startElement(void *userdata, const char *name, const char **attribs);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
30 static void endElement(void *userdata, const char *name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
31 static void charData(void *userdata, const char *s, int slen);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
32
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
33 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
34 * jab_new -- initialize a new jabber connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
35 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
36 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
37 * user -- jabber id of the user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
38 * pass -- password of the user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
39 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
40 * results
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
41 * a pointer to the connection structure
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
42 * or NULL if allocations failed
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
43 */
403
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
44 jconn jab_new(char *user, char *pass, char *server, int port, int ssl)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
45 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
46 pool p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
47 jconn j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
48
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
49 if(!user) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
50
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
51 p = pool_new();
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
52 if(!p) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
53 j = pmalloc_x(p, sizeof(jconn_struct), 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
54 if(!j) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
55 j->p = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
56
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
57 j->user = jid_new(p, user);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
58 j->pass = pstrdup(p, pass);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
59 j->port = port;
403
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
60 j->server = server;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
61
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
62 j->state = JCONN_STATE_OFF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
63 j->cw_state = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
64 j->id = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
65 j->fd = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
66 j->ssl = ssl;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
67
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
68 return j;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
69 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
70
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
71 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
72 * jab_delete -- free a jabber connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
73 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
74 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
75 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
76 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
77 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
78 void jab_delete(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
79 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
80 if(!j) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
81
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
82 jab_stop(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
83 pool_free(j->p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
84 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
85
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
86 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
87 * jab_state_handler -- set callback handler for state change
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
88 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
89 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
90 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
91 * h -- name of the handler function
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
92 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
93 void jab_state_handler(jconn j, jconn_state_h h)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
94 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
95 if(!j) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
96
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
97 j->on_state = h;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
98 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
99
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
100 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
101 * jab_packet_handler -- set callback handler for incoming packets
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
102 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
103 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
104 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
105 * h -- name of the handler function
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
106 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
107 void jab_packet_handler(jconn j, jconn_packet_h h)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
108 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
109 if(!j) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
110
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
111 j->on_packet = h;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
112 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
113
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
114 void jab_logger(jconn j, jconn_logger h)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
115 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
116 if(!j) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
117
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
118 j->logger = h;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
119 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
120
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
121
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
122 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
123 * jab_start -- start connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
124 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
125 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
126 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
127 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
128 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
129 void jab_start(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
130 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
131 xmlnode x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
132 char *t,*t2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
133
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
134 if(!j || (j->state != JCONN_STATE_OFF && j->state != JCONN_STATE_CONNECTING) ) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
135
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
136 if (!(j->cw_state & CW_CONNECT_WANT_SOMETHING)) { /* same as state != JCONN_STATE_CONNECTING */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
137 j->parser = XML_ParserCreate(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
138 XML_SetUserData(j->parser, (void *)j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
139 XML_SetElementHandler(j->parser, startElement, endElement);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
140 XML_SetCharacterDataHandler(j->parser, charData);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
141
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
142 if (j->cw_state & CW_CONNECT_BLOCKING)
403
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
143 j->fd = make_netsocket(j->port, j->server, NETSOCKET_CLIENT, j->ssl);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
144 else
403
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
145 j->fd = make_nb_netsocket(j->port, j->server, NETSOCKET_CLIENT, j->ssl, &j->cw_state);
17aa60c6dc63 Allow a different server name than the jid domain name
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
146
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
147 if(j->fd < 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
148 STATE_EVT(JCONN_STATE_OFF);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
149 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
150 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
151 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
152 else { /* subsequent calls to cw_nb_connect until it finishes negociation */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
153 if (cw_nb_connect(j->fd, 0, 0, j->ssl, &j->cw_state)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
154 STATE_EVT(JCONN_STATE_OFF);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
155 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
156 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
157 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
158 if (j->cw_state & CW_CONNECT_WANT_SOMETHING){ /* check if it finished negociation */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
159 j->state = JCONN_STATE_CONNECTING;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
160 STATE_EVT(JCONN_STATE_CONNECTING);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
161 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
162 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
163 change_socket_to_blocking(j->fd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
164
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
165 j->state = JCONN_STATE_CONNECTED;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
166 STATE_EVT(JCONN_STATE_CONNECTED)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
167
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
168 /* start stream */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
169 x = jutil_header(NS_CLIENT, j->user->server);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
170 t = xmlnode2str(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
171 /* this is ugly, we can create the string here instead of jutil_header */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
172 /* what do you think about it? -madcat */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
173 t2 = strstr(t,"/>");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
174 *t2++ = '>';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
175 *t2 = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
176 jab_send_raw(j,"<?xml version='1.0'?>");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
177 jab_send_raw(j,t);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
178 xmlnode_free(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
179
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
180 j->state = JCONN_STATE_ON;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
181 STATE_EVT(JCONN_STATE_ON)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
182
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
183 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
184
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
185 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
186 * jab_stop -- stop connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
187 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
188 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
189 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
190 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
191 void jab_stop(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
192 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
193 if(!j || j->state == JCONN_STATE_OFF) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
194
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
195 j->state = JCONN_STATE_OFF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
196 cw_close(j->fd);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
197 j->fd = -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
198 XML_ParserFree(j->parser);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
199 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
200
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
201 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
202 * jab_getfd -- get file descriptor of connection socket
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
203 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
204 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
205 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
206 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
207 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
208 * fd of the socket or -1 if socket was not connected
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
209 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
210 int jab_getfd(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
211 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
212 if(j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
213 return j->fd;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
214 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
215 return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
216 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
217
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
218 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
219 * jab_getjid -- get jid structure of user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
220 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
221 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
222 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
223 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
224 jid jab_getjid(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
225 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
226 if(j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
227 return(j->user);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
228 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
229 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
230 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
231
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
232 /* jab_getsid -- get stream id
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
233 * This is the id of server's <stream:stream> tag and used for
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
234 * digest authorization.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
235 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
236 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
237 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
238 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
239 char *jab_getsid(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
240 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
241 if(j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
242 return(j->sid);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
243 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
244 return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
245 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
246
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
247 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
248 * jab_getid -- get a unique id
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
249 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
250 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
251 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
252 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
253 char *jab_getid(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
254 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
255 snprintf(j->idbuf, 8, "%d", j->id++);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
256 return &j->idbuf[0];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
257 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
258
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
259 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
260 * jab_send -- send xml data
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
261 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
262 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
263 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
264 * x -- xmlnode structure
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
265 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
266 void jab_send(jconn j, xmlnode x)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
267 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
268 if (j && j->state != JCONN_STATE_OFF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
269 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
270 char *buf = xmlnode2str(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
271 if (buf) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
272 cw_write(j->fd, buf, strlen(buf), j->ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
273 if (j->logger)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
274 (j->logger)(j, 0, buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
275 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
276
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
277 #ifdef JDEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
278 printf ("out: %s\n", buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
279 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
280 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
281 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
282
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
283 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
284 * jab_send_raw -- send a string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
285 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
286 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
287 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
288 * str -- xml string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
289 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
290 void jab_send_raw(jconn j, const char *str)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
291 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
292 if (j && j->state != JCONN_STATE_OFF) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
293 cw_write(j->fd, str, strlen(str), j->ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
294
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
295 if (j->logger)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
296 (j->logger)(j, 0, str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
297 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
298
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
299 #ifdef JDEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
300 printf ("out: %s\n", str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
301 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
302 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
303
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
304 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
305 * jab_recv -- read and parse incoming data
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
306 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
307 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
308 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
309 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
310 void jab_recv(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
311 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
312 static char buf[32768];
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
313 int len;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
314
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
315 if(!j || j->state == JCONN_STATE_OFF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
316 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
317
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
318 len = cw_read(j->fd, buf, sizeof(buf)-1, j->ssl);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
319 if(len>0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
320 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
321 buf[len] = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
322
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
323 if (j->logger)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
324 (j->logger)(j, 1, buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
325
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
326 #ifdef JDEBUG
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
327 printf (" in: %s\n", buf);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
328 #endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
329 XML_Parse(j->parser, buf, len, 0);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
330 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
331 else if(len<=0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
332 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
333 STATE_EVT(JCONN_STATE_OFF);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
334 jab_stop(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
335 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
336 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
337
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
338 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
339 * jab_poll -- check socket for incoming data
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
340 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
341 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
342 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
343 * timeout -- poll timeout
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
344 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
345 void jab_poll(jconn j, int timeout)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
346 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
347 fd_set fds;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
348 struct timeval tv;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
349 int r;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
350
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
351 if (!j || j->state == JCONN_STATE_OFF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
352 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
353
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
354 FD_ZERO(&fds);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
355 FD_SET(j->fd, &fds);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
356
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
357 if(timeout <= 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
358 r = select(j->fd + 1, &fds, NULL, NULL, NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
359
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
360 } else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
361 tv.tv_sec = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
362 tv.tv_usec = timeout;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
363 r = select(j->fd + 1, &fds, NULL, NULL, &tv);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
364
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
365 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
366
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
367 if(r > 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
368 jab_recv(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
369
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
370 } else if(r) {
172
dabf8c3b475c [/trunk] Changeset 184 by mikael
mikael
parents: 171
diff changeset
371 /* Don't disconnect for interrupted system call */
dabf8c3b475c [/trunk] Changeset 184 by mikael
mikael
parents: 171
diff changeset
372 if(errno == EINTR) return;
171
5a364195d003 [/trunk] Changeset 183 by mikael
mikael
parents: 25
diff changeset
373
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 176
diff changeset
374 scr_LogPrint(LPRINT_LOGNORM, "jab_poll: select returned errno=%d",
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 176
diff changeset
375 errno);
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
376 STATE_EVT(JCONN_STATE_OFF);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
377 jab_stop(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
378
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
379 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
380 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
381
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
382 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
383 * jab_auth -- authorize user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
384 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
385 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
386 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
387 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
388 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
389 * id of the iq packet
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
390 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
391 char *jab_auth(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
392 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
393 xmlnode x,y,z;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
394 char *hash, *user, *id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
395
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
396 if(!j) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
397
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
398 x = jutil_iqnew(JPACKET__SET, NS_AUTH);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
399 id = jab_getid(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
400 xmlnode_put_attrib(x, "id", id);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
401 y = xmlnode_get_tag(x,"query");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
402
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
403 user = j->user->user;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
404
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
405 if (user)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
406 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
407 z = xmlnode_insert_tag(y, "username");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
408 xmlnode_insert_cdata(z, user, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
409 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
410
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
411 z = xmlnode_insert_tag(y, "resource");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
412 xmlnode_insert_cdata(z, j->user->resource, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
413
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
414 if (j->sid)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
415 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
416 z = xmlnode_insert_tag(y, "digest");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
417 hash = pmalloc(x->p, strlen(j->sid)+strlen(j->pass)+1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
418 strcpy(hash, j->sid);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
419 strcat(hash, j->pass);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
420 hash = shahash(hash);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
421 xmlnode_insert_cdata(z, hash, 40);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
422 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
423 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
424 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
425 z = xmlnode_insert_tag(y, "password");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
426 xmlnode_insert_cdata(z, j->pass, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
427 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
428
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
429 jab_send(j, x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
430 xmlnode_free(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
431 return id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
432 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
433
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
434 /*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
435 * jab_reg -- register user
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
436 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
437 * parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
438 * j -- connection
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
439 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
440 * returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
441 * id of the iq packet
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
442 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
443 char *jab_reg(jconn j)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
444 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
445 xmlnode x,y,z;
176
99a99a160113 [/trunk] Changeset 188 by mikael
mikael
parents: 172
diff changeset
446 char *user, *id;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
447
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
448 if (!j) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
449
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
450 x = jutil_iqnew(JPACKET__SET, NS_REGISTER);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
451 id = jab_getid(j);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
452 xmlnode_put_attrib(x, "id", id);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
453 y = xmlnode_get_tag(x,"query");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
454
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
455 user = j->user->user;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
456
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
457 if (user)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
458 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
459 z = xmlnode_insert_tag(y, "username");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
460 xmlnode_insert_cdata(z, user, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
461 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
462
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
463 z = xmlnode_insert_tag(y, "resource");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
464 xmlnode_insert_cdata(z, j->user->resource, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
465
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
466 if (j->pass)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
467 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
468 z = xmlnode_insert_tag(y, "password");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
469 xmlnode_insert_cdata(z, j->pass, -1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
470 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
471
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
472 jab_send(j, x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
473 xmlnode_free(x);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
474 j->state = JCONN_STATE_ON;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
475 STATE_EVT(JCONN_STATE_ON)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
476 return id;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
477 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
478
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
479
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
480 /* local functions */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
481
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
482 static void startElement(void *userdata, const char *name, const char **attribs)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
483 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
484 xmlnode x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
485 jconn j = (jconn)userdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
486
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
487 if(j->current)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
488 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
489 /* Append the node to the current one */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
490 x = xmlnode_insert_tag(j->current, name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
491 xmlnode_put_expat_attribs(x, attribs);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
492
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
493 j->current = x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
494 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
495 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
496 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
497 x = xmlnode_new_tag(name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
498 xmlnode_put_expat_attribs(x, attribs);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
499 if(strcmp(name, "stream:stream") == 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
500 /* special case: name == stream:stream */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
501 /* id attrib of stream is stored for digest auth */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
502 j->sid = xmlnode_get_attrib(x, "id");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
503 /* STATE_EVT(JCONN_STATE_AUTH) */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
504 } else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
505 j->current = x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
506 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
507 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
508 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
509
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
510 static void endElement(void *userdata, const char *name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
511 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
512 jconn j = (jconn)userdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
513 xmlnode x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
514 jpacket p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
515
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
516 if(j->current == NULL) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
517 /* we got </stream:stream> */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
518 STATE_EVT(JCONN_STATE_OFF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
519 return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
520 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
521
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
522 x = xmlnode_get_parent(j->current);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
523
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
524 if(x == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
525 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
526 /* it is time to fire the event */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
527 p = jpacket_new(j->current);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
528
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
529 if(j->on_packet)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
530 (j->on_packet)(j, p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
531 else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
532 xmlnode_free(j->current);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
533 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
534
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
535 j->current = x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
536 }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
537
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
538 static void charData(void *userdata, const char *s, int slen)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
539 {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
540 jconn j = (jconn)userdata;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
541
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
542 if (j->current)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
543 xmlnode_insert_cdata(j->current, s, slen);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
544 }