summaryrefslogtreecommitdiff
path: root/core/obex/obexserver.cpp
Unidiff
Diffstat (limited to 'core/obex/obexserver.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/obex/obexserver.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/core/obex/obexserver.cpp b/core/obex/obexserver.cpp
index 786e9f7..286961f 100644
--- a/core/obex/obexserver.cpp
+++ b/core/obex/obexserver.cpp
@@ -169,96 +169,97 @@ static void handle_request (obex_t* handle, obex_object_t* object,
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 case OBEX_EV_REQDONE: 210 case OBEX_EV_REQDONE:
211 switch(obex_cmd) { 211 switch(obex_cmd) {
212 case OBEX_CMD_PUT: 212 case OBEX_CMD_PUT:
213 case OBEX_CMD_CONNECT: 213 case OBEX_CMD_CONNECT:
214 break; 214 break;
215 case OBEX_CMD_DISCONNECT: 215 case OBEX_CMD_DISCONNECT:
216 OBEX_TransportDisconnect(handle); 216 OBEX_TransportDisconnect(handle);
217 _exit(0);
217 break; 218 break;
218 default: 219 default:
219 break; 220 break;
220 } 221 }
221 break; 222 break;
222 case OBEX_EV_LINKERR: 223 case OBEX_EV_LINKERR:
223 break; 224 break;
224 } 225 }
225} 226}
226 227
227/** 228/**
228 * Function handles OBEX event 229 * Function handles OBEX event
229 * @param handle OBEX connection handle 230 * @param handle OBEX connection handle
230 * @param object OBEX object itself 231 * @param object OBEX object itself
231 * @param mode 232 * @param mode
232 * @param event event code 233 * @param event event code
233 * @param obex_cmd OBEX command itself 234 * @param obex_cmd OBEX command itself
234 * @param obex_rsp OBEX responce 235 * @param obex_rsp OBEX responce
235 */ 236 */
236static void obex_event (obex_t* handle, obex_object_t* object, int mode, 237static void obex_event (obex_t* handle, obex_object_t* object, int mode,
237 int event, int obex_cmd, int obex_rsp) 238 int event, int obex_cmd, int obex_rsp)
238{ 239{
239 240
240 obex_t *obex; //OBEX connection handle 241 obex_t *obex; //OBEX connection handle
241 242
242 switch (event) { 243 switch (event) {
243 case OBEX_EV_ACCEPTHINT: 244 case OBEX_EV_ACCEPTHINT:
244 obex = OBEX_ServerAccept (handle, obex_conn_event, NULL); 245 obex = OBEX_ServerAccept (handle, obex_conn_event, NULL);
245 break; 246 break;
246 247
247 default: 248 default:
248 obex_conn_event(handle, object, mode, event, obex_cmd, obex_rsp); 249 obex_conn_event(handle, object, mode, event, obex_cmd, obex_rsp);
249 } 250 }
250} 251}
251 252
252/** 253/**
253 * Function registers OBEX push service on a specified channel 254 * Function registers OBEX push service on a specified channel
254 * Based on The same function from GPE. 255 * Based on The same function from GPE.
255 * @param session SDP session 256 * @param session SDP session
256 * @param chan channel to listen 257 * @param chan channel to listen
257 * @name name to show 258 * @name name to show
258 */ 259 */
259sdp_session_t* ObexServer::addOpushSvc(uint8_t chan, const char* name) 260sdp_session_t* ObexServer::addOpushSvc(uint8_t chan, const char* name)
260{ 261{
261 sdp_list_t *svclass_id, *pfseq, *apseq, *root; 262 sdp_list_t *svclass_id, *pfseq, *apseq, *root;
262 uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid; 263 uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid;
263 sdp_profile_desc_t profile[1]; 264 sdp_profile_desc_t profile[1];
264 sdp_list_t *aproto, *proto[3]; 265 sdp_list_t *aproto, *proto[3];
@@ -389,103 +390,105 @@ bool ObexServer::start(RunMode runmode, Communication comm)
389 } 390 }
390 391
391 runs = true; 392 runs = true;
392 393
393 QApplication::flushX(); 394 QApplication::flushX();
394 395
395 // WABA: Note that we use fork() and not vfork() because 396 // WABA: Note that we use fork() and not vfork() because
396 // vfork() has unclear semantics and is not standardized. 397 // vfork() has unclear semantics and is not standardized.
397 pid_ = fork(); 398 pid_ = fork();
398 399
399 if ( 0 == pid_ ) 400 if ( 0 == pid_ )
400 { 401 {
401 if ( fd[ 0 ] ) 402 if ( fd[ 0 ] )
402 close( fd[ 0 ] ); 403 close( fd[ 0 ] );
403 if ( !runPrivileged() ) 404 if ( !runPrivileged() )
404 { 405 {
405 setgid( gid ); 406 setgid( gid );
406#if defined( HAVE_INITGROUPS) 407#if defined( HAVE_INITGROUPS)
407 408
408 if ( pw ) 409 if ( pw )
409 initgroups( pw->pw_name, pw->pw_gid ); 410 initgroups( pw->pw_name, pw->pw_gid );
410#endif 411#endif
411 412
412 setuid( uid ); 413 setuid( uid );
413 } 414 }
414 // The child process 415 // The child process
415 if ( !commSetupDoneC() ) 416 if ( !commSetupDoneC() )
416 qWarning( "Could not finish comm setup in child!" ); 417 qWarning( "Could not finish comm setup in child!" );
417 418
418 setupEnvironment(); 419 setupEnvironment();
419 420
420 // Matthias 421 // Matthias
421 if ( run_mode == DontCare ) 422 if ( run_mode == DontCare )
422 setpgid( 0, 0 ); 423 setpgid( 0, 0 );
423 // restore default SIGPIPE handler (Harri) 424 // restore default SIGPIPE handler (Harri)
424 struct sigaction act; 425 struct sigaction act;
425 sigemptyset( &( act.sa_mask ) ); 426 sigemptyset( &( act.sa_mask ) );
426 sigaddset( &( act.sa_mask ), SIGPIPE ); 427 sigaddset( &( act.sa_mask ), SIGPIPE );
427 act.sa_handler = SIG_DFL; 428 act.sa_handler = SIG_DFL;
428 act.sa_flags = 0; 429 act.sa_flags = 0;
429 sigaction( SIGPIPE, &act, 0L ); 430 sigaction( SIGPIPE, &act, 0L );
430 431
431 // We set the close on exec flag. 432 // We set the close on exec flag.
432 // Closing of fd[1] indicates that the execvp succeeded! 433 // Closing of fd[1] indicates that the execvp succeeded!
433 if ( fd[ 1 ] ) 434 if ( fd[ 1 ] )
434 fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC ); 435 fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC );
435 436
436 if (initObex() == 0) { 437 if (initObex() == 0) {
438 if ( fd[ 1 ] ) {
439 ::close(fd[1]);
440 fd[1] = 0;
441 }
437 do { 442 do {
438 if ( fd[ 1 ] ) { 443 if (OBEX_HandleInput(m_obex, 60) < 0) {
439 ::close(fd[1]); 444 fprintf(stderr,"failed to OBEX_HandleInput(), errno=%d\n");
440 fd[1] = 0; 445 _exit(1);
441 } 446 }
442 if (OBEX_HandleInput(m_obex, 10) < 0)
443 _exit(0);
444 } while(1); 447 } while(1);
445 } 448 }
446 char resultByte = 1; 449 char resultByte = 1;
447 if ( fd[ 1 ] ) 450 if ( fd[ 1 ] )
448 write( fd[ 1 ], &resultByte, 1 ); 451 write( fd[ 1 ], &resultByte, 1 );
449 _exit( -1 ); 452 _exit( -1 );
450 } 453 }
451 else if ( -1 == pid_ ) 454 else if ( -1 == pid_ )
452 { 455 {
453 // forking failed 456 // forking failed
454 457
455 runs = false; 458 runs = false;
456 return false; 459 return false;
457 } 460 }
458 else 461 else
459 { 462 {
460 if ( fd[ 1 ] ) 463 if ( fd[ 1 ] )
461 close( fd[ 1 ] ); 464 close( fd[ 1 ] );
462 // the parent continues here 465 // the parent continues here
463 466
464 // Discard any data for stdin that might still be there 467 // Discard any data for stdin that might still be there
465 input_data = 0; 468 input_data = 0;
466 469
467 // Check whether client could be started. 470 // Check whether client could be started.
468 if ( fd[ 0 ] ) 471 if ( fd[ 0 ] )
469 for ( ;; ) 472 for ( ;; )
470 { 473 {
471 char resultByte; 474 char resultByte;
472 int n = ::read( fd[ 0 ], &resultByte, 1 ); 475 int n = ::read( fd[ 0 ], &resultByte, 1 );
473 if ( n == 1 ) 476 if ( n == 1 )
474 { 477 {
475 // Error 478 // Error
476 runs = false; 479 runs = false;
477 close( fd[ 0 ] ); 480 close( fd[ 0 ] );
478 pid_ = 0; 481 pid_ = 0;
479 return false; 482 return false;
480 } 483 }
481 if ( n == -1 ) 484 if ( n == -1 )
482 { 485 {
483 if ( ( errno == ECHILD ) || ( errno == EINTR ) ) 486 if ( ( errno == ECHILD ) || ( errno == EINTR ) )
484 continue; // Ignore 487 continue; // Ignore
485 } 488 }
486 break; // success 489 break; // success
487 } 490 }
488 if ( fd[ 0 ] ) 491 if ( fd[ 0 ] )
489 close( fd[ 0 ] ); 492 close( fd[ 0 ] );
490 493
491 if ( !commSetupDoneP() ) // finish communication socket setup for the parent 494 if ( !commSetupDoneP() ) // finish communication socket setup for the parent