summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/obex/obexserver.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/core/obex/obexserver.cpp b/core/obex/obexserver.cpp
index 25d8224..f1fb205 100644
--- a/core/obex/obexserver.cpp
+++ b/core/obex/obexserver.cpp
@@ -1,518 +1,518 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de> 3             .=l. Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This library is free software; you can 5 _;:,     .>    :=|. This library is free software; you can
6.> <,   >  .   <= redistribute it and/or modify it under 6.> <,   >  .   <= redistribute it and/or modify it under
7:=1 )Y*s>-.--   : the terms of the GNU Library General Public 7:=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; version 2 of the License. 9 - .   .-<_>     .<> Foundation; version 2 of the License.
10     ._= =}       : 10     ._= =}       :
11    .%+i>       _;_. 11    .%+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that 12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=| MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU 16  _.=:.       :    :=>: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more 17..}^=.=       =       ; Library General Public License for more
18++=   -.     .     .: details. 18++=   -.     .     .: details.
19 :     =  ...= . :.=- 19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU 20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library General Public License along with
22   --        :-= this library; see the file COPYING.LIB. 22   --        :-= this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation, 23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, 24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28/* 28/*
29 * The OBEX server class implementation 29 * The OBEX server class implementation
30 * Based on OBEX server from GPE (thanks, guys) 30 * Based on OBEX server from GPE (thanks, guys)
31 */ 31 */
32 32
33#include "obexserver.h" 33#include "obexserver.h"
34#include <unistd.h> 34#include <unistd.h>
35#include <opie2/odebug.h> 35#include <opie2/odebug.h>
36#include <sys/types.h> 36#include <sys/types.h>
37#include <sys/wait.h> 37#include <sys/wait.h>
38#include <errno.h> 38#include <errno.h>
39#include <stdlib.h> 39#include <stdlib.h>
40#include <stdio.h> 40#include <stdio.h>
41#include <fcntl.h> 41#include <fcntl.h>
42#include <qapplication.h> 42#include <qapplication.h>
43#include <opie2/oprocctrl.h> 43#include <opie2/oprocctrl.h>
44#include <qstring.h> 44#include <qstring.h>
45#include <qfile.h> 45#include <qfile.h>
46 46
47using namespace Opie::Core; 47using namespace Opie::Core;
48using namespace Opie::Core::Internal; 48using namespace Opie::Core::Internal;
49using namespace OpieObex; 49using namespace OpieObex;
50 50
51ObexServer::ObexServer(int trans) : 51ObexServer::ObexServer(int trans) :
52 OProcess(tr("ObexServer"), 0, "ObexServer") 52 OProcess(tr("ObexServer"), 0, "ObexServer")
53{ 53{
54 transport = trans; 54 transport = trans;
55 m_obex = NULL; 55 m_obex = NULL;
56} 56}
57 57
58ObexServer::~ObexServer() 58ObexServer::~ObexServer()
59{ 59{
60 stop(); 60 stop();
61} 61}
62 62
63/** 63/**
64 * Function handles the file received 64 * Function handles the file received
65 * @param name the file name 65 * @param name the file name
66 * @param data the file data 66 * @param data the file data
67 * @param data_len the data length 67 * @param data_len the data length
68 * @return 0 on success -1 on error 68 * @return 0 on success -1 on error
69 */ 69 */
70static int file_received(uint8_t* name, const uint8_t* data, size_t data_len) 70static int file_received(uint8_t* name, const uint8_t* data, size_t data_len)
71{ 71{
72 QString path("/tmp/"); 72 QString path("/tmp/");
73 path += (char*)name; 73 path += (char*)name;
74 QFile out(path); 74 QFile out(path);
75 int err = 0; 75 int err = 0;
76 76
77 if (!out.open(IO_Raw | IO_ReadWrite | IO_Truncate)) { 77 if (!out.open(IO_Raw | IO_ReadWrite | IO_Truncate)) {
78 printf("File %s open error %d\n", (const char*)path, errno); 78 printf("File %s open error %d\n", (const char*)path, errno);
79 err = -1; 79 err = -1;
80 goto out; 80 goto out;
81 } 81 }
82 if (out.writeBlock((const char*)data, data_len) < 0) { 82 if (out.writeBlock((const char*)data, data_len) < 0) {
83 printf("File %s write error %d\n", (const char*)path, errno); 83 printf("File %s write error %d\n", (const char*)path, errno);
84 err = -1; 84 err = -1;
85 goto out; 85 goto out;
86 } 86 }
87out: 87out:
88 out.close(); 88 out.close();
89 if (err == 0) { 89 if (err == 0) {
90 printf("Wrote %s (%d bytes)\n", (const char*)path, data_len); 90 printf("Wrote %s (%d bytes)\n", (const char*)path, data_len);
91 fflush(stdout); 91 fflush(stdout);
92 } 92 }
93 return err; 93 return err;
94} 94}
95 95
96/** 96/**
97 * Function handles the situation when the PUT request has been done 97 * Function handles the situation when the PUT request has been done
98 * @param handle OBEX connection handle 98 * @param handle OBEX connection handle
99 * @param object OBEX object itself 99 * @param object OBEX object itself
100 */ 100 */
101static int put_done(obex_t* handle, obex_object_t* object) 101static int put_done(obex_t* handle, obex_object_t* object)
102{ 102{
103 obex_headerdata_t hv; //Received file header 103 obex_headerdata_t hv; //Received file header
104 uint8_t hi; //Type of the request 104 uint8_t hi; //Type of the request
105 uint32_t hlen; //File (file name) length 105 uint32_t hlen; //File (file name) length
106 int err = 0; 106 int err = 0;
107 107
108 const uint8_t *body = NULL; 108 const uint8_t *body = NULL;
109 int body_len = 0; 109 int body_len = 0;
110 uint8_t* name = NULL; 110 uint8_t* name = NULL;
111 111
112 while (OBEX_ObjectGetNextHeader (handle, object, &hi, &hv, &hlen)) { 112 while (OBEX_ObjectGetNextHeader (handle, object, &hi, &hv, &hlen)) {
113 switch(hi) { 113 switch(hi) {
114 case OBEX_HDR_BODY: 114 case OBEX_HDR_BODY:
115 body = hv.bs; 115 body = hv.bs;
116 body_len = hlen; 116 body_len = hlen;
117 break; 117 break;
118 118
119 case OBEX_HDR_NAME: 119 case OBEX_HDR_NAME:
120 name = new uint8_t[(hlen / 2) + 1]; 120 name = new uint8_t[(hlen / 2) + 1];
121 OBEX_UnicodeToChar(name, hv.bs, hlen); 121 OBEX_UnicodeToChar(name, hv.bs, hlen);
122 break; 122 break;
123 123
124 default: 124 default:
125 break; 125 break;
126 } 126 }
127 } 127 }
128 128
129 if (body) 129 if (body)
130 err = file_received(name, body, body_len); 130 err = file_received(name, body, body_len);
131 131
132 if (name) 132 if (name)
133 delete[] name; 133 delete[] name;
134 return err; 134 return err;
135} 135}
136 136
137/** 137/**
138 * Function handles OBEX request 138 * Function handles OBEX request
139 * @param handle OBEX connection handle 139 * @param handle OBEX connection handle
140 * @param object OBEX object itself 140 * @param object OBEX object itself
141 * @param mode 141 * @param mode
142 * @param event event code 142 * @param event event code
143 * @param cmd OBEX command itself 143 * @param cmd OBEX command itself
144 */ 144 */
145static void handle_request (obex_t* handle, obex_object_t* object, 145static void handle_request (obex_t* handle, obex_object_t* object,
146 int event, int cmd) 146 int event, int cmd)
147{ 147{
148 (void)event; 148 (void)event;
149 switch(cmd){ 149 switch(cmd){
150 case OBEX_CMD_SETPATH: 150 case OBEX_CMD_SETPATH:
151 OBEX_ObjectSetRsp (object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); 151 OBEX_ObjectSetRsp (object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
152 break; 152 break;
153 case OBEX_CMD_PUT: 153 case OBEX_CMD_PUT:
154 if (put_done (handle, object) < 0) 154 if (put_done (handle, object) < 0)
155 OBEX_ObjectSetRsp (object, OBEX_RSP_INTERNAL_SERVER_ERROR, 155 OBEX_ObjectSetRsp (object, OBEX_RSP_INTERNAL_SERVER_ERROR,
156 OBEX_RSP_INTERNAL_SERVER_ERROR); 156 OBEX_RSP_INTERNAL_SERVER_ERROR);
157 else 157 else
158 OBEX_ObjectSetRsp (object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); 158 OBEX_ObjectSetRsp (object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
159 break; 159 break;
160 case OBEX_CMD_CONNECT: 160 case OBEX_CMD_CONNECT:
161 OBEX_ObjectSetRsp (object, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); 161 OBEX_ObjectSetRsp (object, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
162 break; 162 break;
163 case OBEX_CMD_DISCONNECT: 163 case OBEX_CMD_DISCONNECT:
164 OBEX_ObjectSetRsp (object, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); 164 OBEX_ObjectSetRsp (object, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
165 break; 165 break;
166 default: 166 default:
167 printf("Denied %02x request\n", cmd); 167 printf("Denied %02x request\n", cmd);
168 fflush(stdout); 168 fflush(stdout);
169 OBEX_ObjectSetRsp (object, OBEX_RSP_NOT_IMPLEMENTED, 169 OBEX_ObjectSetRsp (object, OBEX_RSP_NOT_IMPLEMENTED,
170 OBEX_RSP_NOT_IMPLEMENTED); 170 OBEX_RSP_NOT_IMPLEMENTED);
171 break; 171 break;
172 } 172 }
173} 173}
174 174
175 175
176/** 176/**
177 * Function handles OBEX event when a client is connected to the server 177 * Function handles OBEX event when a client is connected to the server
178 * @param handle OBEX connection handle 178 * @param handle OBEX connection handle
179 * @param object OBEX object itself 179 * @param object OBEX object itself
180 * @param mode 180 * @param mode
181 * @param event event code 181 * @param event event code
182 * @param obex_cmd OBEX command itself 182 * @param obex_cmd OBEX command itself
183 * @param obex_rsp OBEX responce 183 * @param obex_rsp OBEX responce
184 */ 184 */
185static void obex_conn_event (obex_t *handle, obex_object_t *object, 185static void obex_conn_event (obex_t *handle, obex_object_t *object,
186 int mode, int event, int obex_cmd, int obex_rsp) 186 int mode, int event, int obex_cmd, int obex_rsp)
187{ 187{
188 (void)mode; 188 (void)mode;
189 (void)obex_rsp; 189 (void)obex_rsp;
190 190
191 switch(event) { 191 switch(event) {
192 case OBEX_EV_REQHINT: 192 case OBEX_EV_REQHINT:
193 switch(obex_cmd) { 193 switch(obex_cmd) {
194 case OBEX_CMD_PUT: 194 case OBEX_CMD_PUT:
195 case OBEX_CMD_CONNECT: 195 case OBEX_CMD_CONNECT:
196 case OBEX_CMD_DISCONNECT: 196 case OBEX_CMD_DISCONNECT:
197 OBEX_ObjectSetRsp (object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); 197 OBEX_ObjectSetRsp (object, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
198 break; 198 break;
199 default: 199 default:
200 OBEX_ObjectSetRsp (object, OBEX_RSP_NOT_IMPLEMENTED, 200 OBEX_ObjectSetRsp (object, OBEX_RSP_NOT_IMPLEMENTED,
201 OBEX_RSP_NOT_IMPLEMENTED); 201 OBEX_RSP_NOT_IMPLEMENTED);
202 break; 202 break;
203 } 203 }
204 break; 204 break;
205 205
206 case OBEX_EV_REQ: 206 case OBEX_EV_REQ:
207 /* Comes when a server-request has been received. */ 207 /* Comes when a server-request has been received. */
208 handle_request (handle, object, event, obex_cmd); 208 handle_request (handle, object, event, obex_cmd);
209 break; 209 break;
210 210
211 case OBEX_EV_LINKERR: 211 case OBEX_EV_LINKERR:
212 break; 212 break;
213 } 213 }
214} 214}
215 215
216/** 216/**
217 * Function handles OBEX event 217 * Function handles OBEX event
218 * @param handle OBEX connection handle 218 * @param handle OBEX connection handle
219 * @param object OBEX object itself 219 * @param object OBEX object itself
220 * @param mode 220 * @param mode
221 * @param event event code 221 * @param event event code
222 * @param obex_cmd OBEX command itself 222 * @param obex_cmd OBEX command itself
223 * @param obex_rsp OBEX responce 223 * @param obex_rsp OBEX responce
224 */ 224 */
225static void obex_event (obex_t* handle, obex_object_t* object, int mode, 225static void obex_event (obex_t* handle, obex_object_t* object, int mode,
226 int event, int obex_cmd, int obex_rsp) 226 int event, int obex_cmd, int obex_rsp)
227{ 227{
228 228
229 obex_t *obex; //OBEX connection handle 229 obex_t *obex; //OBEX connection handle
230 230
231 switch (event) { 231 switch (event) {
232 case OBEX_EV_ACCEPTHINT: 232 case OBEX_EV_ACCEPTHINT:
233 obex = OBEX_ServerAccept (handle, obex_conn_event, NULL); 233 obex = OBEX_ServerAccept (handle, obex_conn_event, NULL);
234 break; 234 break;
235 235
236 default: 236 default:
237 obex_conn_event(handle, object, mode, event, obex_cmd, obex_rsp); 237 obex_conn_event(handle, object, mode, event, obex_cmd, obex_rsp);
238 } 238 }
239} 239}
240 240
241/** 241/**
242 * Function registers OBEX push service on a specified channel 242 * Function registers OBEX push service on a specified channel
243 * Based on The same function from GPE. 243 * Based on The same function from GPE.
244 * @param session SDP session 244 * @param session SDP session
245 * @param chan channel to listen 245 * @param chan channel to listen
246 * @name name to show 246 * @name name to show
247 */ 247 */
248sdp_session_t* ObexServer::addOpushSvc(uint8_t chan, const char* name) 248sdp_session_t* ObexServer::addOpushSvc(uint8_t chan, const char* name)
249{ 249{
250 sdp_list_t *svclass_id, *pfseq, *apseq, *root; 250 sdp_list_t *svclass_id, *pfseq, *apseq, *root;
251 uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid; 251 uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid;
252 sdp_profile_desc_t profile[1]; 252 sdp_profile_desc_t profile[1];
253 sdp_list_t *aproto, *proto[3]; 253 sdp_list_t *aproto, *proto[3];
254 sdp_record_t record; 254 sdp_record_t record;
255 sdp_data_t *channel; 255 sdp_data_t *channel;
256 uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; 256 uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
257 //uint8_t formats[] = { 0xff }; 257 //uint8_t formats[] = { 0xff };
258 void *dtds[sizeof(formats)], *values[sizeof(formats)]; 258 void *dtds[sizeof(formats)], *values[sizeof(formats)];
259 unsigned int i; 259 unsigned int i;
260 uint8_t dtd = SDP_UINT8; 260 uint8_t dtd = SDP_UINT8;
261 sdp_data_t *sflist; 261 sdp_data_t *sflist;
262 int err = 0; 262 int err = 0;
263 sdp_session_t* lsession = 0; 263 sdp_session_t* lsession = 0;
264 264
265 memset((void *)&record, 0, sizeof(sdp_record_t)); 265 memset((void *)&record, 0, sizeof(sdp_record_t));
266 record.handle = 0xffffffff; 266 record.handle = 0xffffffff;
267 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP); 267 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
268 root = sdp_list_append(0, &root_uuid); 268 root = sdp_list_append(0, &root_uuid);
269 sdp_set_browse_groups(&record, root); 269 sdp_set_browse_groups(&record, root);
270 270
271 sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID); 271 sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID);
272 svclass_id = sdp_list_append(0, &opush_uuid); 272 svclass_id = sdp_list_append(0, &opush_uuid);
273 sdp_set_service_classes(&record, svclass_id); 273 sdp_set_service_classes(&record, svclass_id);
274 274
275 sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID); 275 sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID);
276 profile[0].version = 0x0100; 276 profile[0].version = 0x0100;
277 pfseq = sdp_list_append(0, profile); 277 pfseq = sdp_list_append(0, profile);
278 sdp_set_profile_descs(&record, pfseq); 278 sdp_set_profile_descs(&record, pfseq);
279 279
280 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID); 280 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
281 proto[0] = sdp_list_append(0, &l2cap_uuid); 281 proto[0] = sdp_list_append(0, &l2cap_uuid);
282 apseq = sdp_list_append(0, proto[0]); 282 apseq = sdp_list_append(0, proto[0]);
283 283
284 sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID); 284 sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
285 proto[1] = sdp_list_append(0, &rfcomm_uuid); 285 proto[1] = sdp_list_append(0, &rfcomm_uuid);
286 channel = sdp_data_alloc(SDP_UINT8, &chan); 286 channel = sdp_data_alloc(SDP_UINT8, &chan);
287 proto[1] = sdp_list_append(proto[1], channel); 287 proto[1] = sdp_list_append(proto[1], channel);
288 apseq = sdp_list_append(apseq, proto[1]); 288 apseq = sdp_list_append(apseq, proto[1]);
289 289
290 sdp_uuid16_create(&obex_uuid, OBEX_UUID); 290 sdp_uuid16_create(&obex_uuid, OBEX_UUID);
291 proto[2] = sdp_list_append(0, &obex_uuid); 291 proto[2] = sdp_list_append(0, &obex_uuid);
292 apseq = sdp_list_append(apseq, proto[2]); 292 apseq = sdp_list_append(apseq, proto[2]);
293 293
294 aproto = sdp_list_append(0, apseq); 294 aproto = sdp_list_append(0, apseq);
295 sdp_set_access_protos(&record, aproto); 295 sdp_set_access_protos(&record, aproto);
296 296
297 for (i = 0; i < sizeof(formats); i++) 297 for (i = 0; i < sizeof(formats); i++)
298 { 298 {
299 dtds[i] = &dtd; 299 dtds[i] = &dtd;
300 values[i] = &formats[i]; 300 values[i] = &formats[i];
301 } 301 }
302 sflist = sdp_seq_alloc(dtds, values, sizeof(formats)); 302 sflist = sdp_seq_alloc(dtds, values, sizeof(formats));
303 sdp_attr_add(&record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist); 303 sdp_attr_add(&record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist);
304 304
305 sdp_set_info_attr(&record, name, 0, 0); 305 sdp_set_info_attr(&record, name, 0, 0);
306 306
307 // connect to the local SDP server, register the service record, and 307 // connect to the local SDP server, register the service record, and
308 // disconnect 308 // disconnect
309 lsession = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY); 309 lsession = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY);
310 if (lsession == NULL) 310 if (lsession == NULL)
311 goto errout; 311 goto errout;
312 err = sdp_record_register(lsession, &record, 0); 312 err = sdp_record_register(lsession, &record, 0);
313 if (err) { 313 if (err) {
314 sdp_close(lsession); 314 sdp_close(lsession);
315 lsession = NULL; 315 lsession = NULL;
316 } 316 }
317errout: 317errout:
318 sdp_data_free(channel); 318 sdp_data_free(channel);
319 sdp_list_free(proto[0], 0); 319 sdp_list_free(proto[0], 0);
320 sdp_list_free(proto[1], 0); 320 sdp_list_free(proto[1], 0);
321 sdp_list_free(proto[2], 0); 321 sdp_list_free(proto[2], 0);
322 sdp_list_free(apseq, 0); 322 sdp_list_free(apseq, 0);
323 sdp_list_free(aproto, 0); 323 sdp_list_free(aproto, 0);
324 324
325 return lsession; 325 return lsession;
326} 326}
327 327
328int ObexServer::initObex(void) 328int ObexServer::initObex(void)
329{ 329{
330 int channel = 10; //Channel on which we do listen 330 int channel = 10; //Channel on which we do listen
331 if (m_obex) 331 if (m_obex)
332 return 0; 332 return 0;
333 m_obex = ::OBEX_Init(transport, obex_event, 0); 333 m_obex = ::OBEX_Init(transport, obex_event, 0);
334 if (!m_obex) { 334 if (!m_obex) {
335 printf("OBEX initialization error %d\n", errno); 335 printf("OBEX initialization error %d\n", errno);
336 return -1; 336 return -1;
337 } 337 }
338 if (transport == OBEX_TRANS_BLUETOOTH) { 338 if (transport == OBEX_TRANS_BLUETOOTH) {
339 ::BtOBEX_ServerRegister(m_obex, NULL, channel); 339 ::BtOBEX_ServerRegister(m_obex, NULL, channel);
340 m_session = addOpushSvc(channel, "OBEX push service"); 340 m_session = addOpushSvc(channel, "OBEX Object Push");
341 if (!m_session) { 341 if (!m_session) {
342 printf("OBEX registration error %d\n", errno); 342 printf("OBEX registration error %d\n", errno);
343 ::OBEX_Cleanup(m_obex); 343 ::OBEX_Cleanup(m_obex);
344 m_obex = NULL; 344 m_obex = NULL;
345 return -1; 345 return -1;
346 } 346 }
347 } else if (transport == OBEX_TRANS_IRDA) 347 } else if (transport == OBEX_TRANS_IRDA)
348 ::IrOBEX_ServerRegister(m_obex, "OBEX"); 348 ::IrOBEX_ServerRegister(m_obex, "OBEX");
349 return 0; 349 return 0;
350} 350}
351 351
352bool ObexServer::start(RunMode runmode, Communication comm) 352bool ObexServer::start(RunMode runmode, Communication comm)
353{ 353{
354 if ( runs ) 354 if ( runs )
355 { 355 {
356 return false; // cannot start a process that is already running 356 return false; // cannot start a process that is already running
357 // or if no executable has been assigned 357 // or if no executable has been assigned
358 } 358 }
359 run_mode = runmode; 359 run_mode = runmode;
360 status = 0; 360 status = 0;
361 361
362 if ( !setupCommunication( comm ) ) 362 if ( !setupCommunication( comm ) )
363 qWarning( "Could not setup Communication!" ); 363 qWarning( "Could not setup Communication!" );
364 364
365 // We do this in the parent because if we do it in the child process 365 // We do this in the parent because if we do it in the child process
366 // gdb gets confused when the application runs from gdb. 366 // gdb gets confused when the application runs from gdb.
367 uid_t uid = getuid(); 367 uid_t uid = getuid();
368 gid_t gid = getgid(); 368 gid_t gid = getgid();
369#ifdef HAVE_INITGROUPS 369#ifdef HAVE_INITGROUPS
370 370
371 struct passwd *pw = getpwuid( uid ); 371 struct passwd *pw = getpwuid( uid );
372#endif 372#endif
373 373
374 int fd[ 2 ]; 374 int fd[ 2 ];
375 if ( 0 > pipe( fd ) ) 375 if ( 0 > pipe( fd ) )
376 { 376 {
377 fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue 377 fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue
378 } 378 }
379 379
380 runs = true; 380 runs = true;
381 381
382 QApplication::flushX(); 382 QApplication::flushX();
383 383
384 // WABA: Note that we use fork() and not vfork() because 384 // WABA: Note that we use fork() and not vfork() because
385 // vfork() has unclear semantics and is not standardized. 385 // vfork() has unclear semantics and is not standardized.
386 pid_ = fork(); 386 pid_ = fork();
387 387
388 if ( 0 == pid_ ) 388 if ( 0 == pid_ )
389 { 389 {
390 if ( fd[ 0 ] ) 390 if ( fd[ 0 ] )
391 close( fd[ 0 ] ); 391 close( fd[ 0 ] );
392 if ( !runPrivileged() ) 392 if ( !runPrivileged() )
393 { 393 {
394 setgid( gid ); 394 setgid( gid );
395#if defined( HAVE_INITGROUPS) 395#if defined( HAVE_INITGROUPS)
396 396
397 if ( pw ) 397 if ( pw )
398 initgroups( pw->pw_name, pw->pw_gid ); 398 initgroups( pw->pw_name, pw->pw_gid );
399#endif 399#endif
400 400
401 setuid( uid ); 401 setuid( uid );
402 } 402 }
403 // The child process 403 // The child process
404 if ( !commSetupDoneC() ) 404 if ( !commSetupDoneC() )
405 qWarning( "Could not finish comm setup in child!" ); 405 qWarning( "Could not finish comm setup in child!" );
406 406
407 setupEnvironment(); 407 setupEnvironment();
408 408
409 // Matthias 409 // Matthias
410 if ( run_mode == DontCare ) 410 if ( run_mode == DontCare )
411 setpgid( 0, 0 ); 411 setpgid( 0, 0 );
412 // restore default SIGPIPE handler (Harri) 412 // restore default SIGPIPE handler (Harri)
413 struct sigaction act; 413 struct sigaction act;
414 sigemptyset( &( act.sa_mask ) ); 414 sigemptyset( &( act.sa_mask ) );
415 sigaddset( &( act.sa_mask ), SIGPIPE ); 415 sigaddset( &( act.sa_mask ), SIGPIPE );
416 act.sa_handler = SIG_DFL; 416 act.sa_handler = SIG_DFL;
417 act.sa_flags = 0; 417 act.sa_flags = 0;
418 sigaction( SIGPIPE, &act, 0L ); 418 sigaction( SIGPIPE, &act, 0L );
419 419
420 // We set the close on exec flag. 420 // We set the close on exec flag.
421 // Closing of fd[1] indicates that the execvp succeeded! 421 // Closing of fd[1] indicates that the execvp succeeded!
422 if ( fd[ 1 ] ) 422 if ( fd[ 1 ] )
423 fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC ); 423 fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC );
424 424
425 if (initObex() == 0) { 425 if (initObex() == 0) {
426 do { 426 do {
427 int result; //Connection result 427 int result; //Connection result
428 if ( fd[ 1 ] ) { 428 if ( fd[ 1 ] ) {
429 ::close(fd[1]); 429 ::close(fd[1]);
430 fd[1] = 0; 430 fd[1] = 0;
431 } 431 }
432 if ((result = OBEX_HandleInput(m_obex, 60)) < 0) { 432 if ((result = OBEX_HandleInput(m_obex, 60)) < 0) {
433 if (errno != ECONNRESET) { 433 if (errno != ECONNRESET) {
434 printf("OBEX_HandleInput error %d\n", errno); 434 printf("OBEX_HandleInput error %d\n", errno);
435 fflush(stdout); 435 fflush(stdout);
436 _exit(-1); 436 _exit(-1);
437 } 437 }
438 else 438 else
439 _exit(0); 439 _exit(0);
440 } 440 }
441 } while(1); 441 } while(1);
442 } 442 }
443 char resultByte = 1; 443 char resultByte = 1;
444 if ( fd[ 1 ] ) 444 if ( fd[ 1 ] )
445 write( fd[ 1 ], &resultByte, 1 ); 445 write( fd[ 1 ], &resultByte, 1 );
446 _exit( -1 ); 446 _exit( -1 );
447 } 447 }
448 else if ( -1 == pid_ ) 448 else if ( -1 == pid_ )
449 { 449 {
450 // forking failed 450 // forking failed
451 451
452 runs = false; 452 runs = false;
453 return false; 453 return false;
454 } 454 }
455 else 455 else
456 { 456 {
457 if ( fd[ 1 ] ) 457 if ( fd[ 1 ] )
458 close( fd[ 1 ] ); 458 close( fd[ 1 ] );
459 // the parent continues here 459 // the parent continues here
460 460
461 // Discard any data for stdin that might still be there 461 // Discard any data for stdin that might still be there
462 input_data = 0; 462 input_data = 0;
463 463
464 // Check whether client could be started. 464 // Check whether client could be started.
465 if ( fd[ 0 ] ) 465 if ( fd[ 0 ] )
466 for ( ;; ) 466 for ( ;; )
467 { 467 {
468 char resultByte; 468 char resultByte;
469 int n = ::read( fd[ 0 ], &resultByte, 1 ); 469 int n = ::read( fd[ 0 ], &resultByte, 1 );
470 if ( n == 1 ) 470 if ( n == 1 )
471 { 471 {
472 // Error 472 // Error
473 runs = false; 473 runs = false;
474 close( fd[ 0 ] ); 474 close( fd[ 0 ] );
475 pid_ = 0; 475 pid_ = 0;
476 return false; 476 return false;
477 } 477 }
478 if ( n == -1 ) 478 if ( n == -1 )
479 { 479 {
480 if ( ( errno == ECHILD ) || ( errno == EINTR ) ) 480 if ( ( errno == ECHILD ) || ( errno == EINTR ) )
481 continue; // Ignore 481 continue; // Ignore
482 } 482 }
483 break; // success 483 break; // success
484 } 484 }
485 if ( fd[ 0 ] ) 485 if ( fd[ 0 ] )
486 close( fd[ 0 ] ); 486 close( fd[ 0 ] );
487 487
488 if ( !commSetupDoneP() ) // finish communication socket setup for the parent 488 if ( !commSetupDoneP() ) // finish communication socket setup for the parent
489 qWarning( "Could not finish comm setup in parent!" ); 489 qWarning( "Could not finish comm setup in parent!" );
490 490
491 if ( run_mode == Block ) 491 if ( run_mode == Block )
492 { 492 {
493 commClose(); 493 commClose();
494 494
495 // The SIGCHLD handler of the process controller will catch 495 // The SIGCHLD handler of the process controller will catch
496 // the exit and set the status 496 // the exit and set the status
497 while ( runs ) 497 while ( runs )
498 { 498 {
499 OProcessController::theOProcessController-> 499 OProcessController::theOProcessController->
500 slotDoHousekeeping( 0 ); 500 slotDoHousekeeping( 0 );
501 } 501 }
502 runs = FALSE; 502 runs = FALSE;
503 emit processExited( this ); 503 emit processExited( this );
504 } 504 }
505 } 505 }
506 return true; 506 return true;
507} 507}
508 508
509/* 509/*
510 * Stop forwarding process 510 * Stop forwarding process
511 */ 511 */
512int ObexServer::stop() 512int ObexServer::stop()
513{ 513{
514 kill(SIGTERM); 514 kill(SIGTERM);
515 return 0; 515 return 0;
516} 516}
517 517
518//eof 518//eof