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 a98c64f..59fcb0f 100644
--- a/core/obex/obexserver.cpp
+++ b/core/obex/obexserver.cpp
@@ -252,273 +252,273 @@ static void obex_event (obex_t* handle, obex_object_t* object, int mode,
252 252
253/** 253/**
254 * Function registers OBEX push service on a specified channel 254 * Function registers OBEX push service on a specified channel
255 * Based on The same function from GPE. 255 * Based on The same function from GPE.
256 * @param session SDP session 256 * @param session SDP session
257 * @param chan channel to listen 257 * @param chan channel to listen
258 * @name name to show 258 * @name name to show
259 */ 259 */
260sdp_session_t* ObexServer::addOpushSvc(uint8_t chan, const char* name) 260sdp_session_t* ObexServer::addOpushSvc(uint8_t chan, const char* name)
261{ 261{
262 sdp_list_t *svclass_id, *pfseq, *apseq, *root; 262 sdp_list_t *svclass_id, *pfseq, *apseq, *root;
263 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;
264 sdp_profile_desc_t profile[1]; 264 sdp_profile_desc_t profile[1];
265 sdp_list_t *aproto, *proto[3]; 265 sdp_list_t *aproto, *proto[3];
266 sdp_record_t record; 266 sdp_record_t record;
267 sdp_data_t *channel; 267 sdp_data_t *channel;
268 uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; 268 uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
269 //uint8_t formats[] = { 0xff }; 269 //uint8_t formats[] = { 0xff };
270 void *dtds[sizeof(formats)], *values[sizeof(formats)]; 270 void *dtds[sizeof(formats)], *values[sizeof(formats)];
271 unsigned int i; 271 unsigned int i;
272 uint8_t dtd = SDP_UINT8; 272 uint8_t dtd = SDP_UINT8;
273 sdp_data_t *sflist; 273 sdp_data_t *sflist;
274 int err = 0; 274 int err = 0;
275 sdp_session_t* lsession = 0; 275 sdp_session_t* lsession = 0;
276 276
277 memset((void *)&record, 0, sizeof(sdp_record_t)); 277 memset((void *)&record, 0, sizeof(sdp_record_t));
278 record.handle = 0xffffffff; 278 record.handle = 0xffffffff;
279 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP); 279 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
280 root = sdp_list_append(0, &root_uuid); 280 root = sdp_list_append(0, &root_uuid);
281 sdp_set_browse_groups(&record, root); 281 sdp_set_browse_groups(&record, root);
282 282
283 sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID); 283 sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID);
284 svclass_id = sdp_list_append(0, &opush_uuid); 284 svclass_id = sdp_list_append(0, &opush_uuid);
285 sdp_set_service_classes(&record, svclass_id); 285 sdp_set_service_classes(&record, svclass_id);
286 286
287 sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID); 287 sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID);
288 profile[0].version = 0x0100; 288 profile[0].version = 0x0100;
289 pfseq = sdp_list_append(0, profile); 289 pfseq = sdp_list_append(0, profile);
290 sdp_set_profile_descs(&record, pfseq); 290 sdp_set_profile_descs(&record, pfseq);
291 291
292 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID); 292 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
293 proto[0] = sdp_list_append(0, &l2cap_uuid); 293 proto[0] = sdp_list_append(0, &l2cap_uuid);
294 apseq = sdp_list_append(0, proto[0]); 294 apseq = sdp_list_append(0, proto[0]);
295 295
296 sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID); 296 sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
297 proto[1] = sdp_list_append(0, &rfcomm_uuid); 297 proto[1] = sdp_list_append(0, &rfcomm_uuid);
298 channel = sdp_data_alloc(SDP_UINT8, &chan); 298 channel = sdp_data_alloc(SDP_UINT8, &chan);
299 proto[1] = sdp_list_append(proto[1], channel); 299 proto[1] = sdp_list_append(proto[1], channel);
300 apseq = sdp_list_append(apseq, proto[1]); 300 apseq = sdp_list_append(apseq, proto[1]);
301 301
302 sdp_uuid16_create(&obex_uuid, OBEX_UUID); 302 sdp_uuid16_create(&obex_uuid, OBEX_UUID);
303 proto[2] = sdp_list_append(0, &obex_uuid); 303 proto[2] = sdp_list_append(0, &obex_uuid);
304 apseq = sdp_list_append(apseq, proto[2]); 304 apseq = sdp_list_append(apseq, proto[2]);
305 305
306 aproto = sdp_list_append(0, apseq); 306 aproto = sdp_list_append(0, apseq);
307 sdp_set_access_protos(&record, aproto); 307 sdp_set_access_protos(&record, aproto);
308 308
309 for (i = 0; i < sizeof(formats); i++) 309 for (i = 0; i < sizeof(formats); i++)
310 { 310 {
311 dtds[i] = &dtd; 311 dtds[i] = &dtd;
312 values[i] = &formats[i]; 312 values[i] = &formats[i];
313 } 313 }
314 sflist = sdp_seq_alloc(dtds, values, sizeof(formats)); 314 sflist = sdp_seq_alloc(dtds, values, sizeof(formats));
315 sdp_attr_add(&record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist); 315 sdp_attr_add(&record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist);
316 316
317 sdp_set_info_attr(&record, name, 0, 0); 317 sdp_set_info_attr(&record, name, 0, 0);
318 318
319 // connect to the local SDP server, register the service record, and 319 // connect to the local SDP server, register the service record, and
320 // disconnect 320 // disconnect
321 lsession = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY); 321 lsession = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY);
322 if (lsession == NULL) 322 if (lsession == NULL)
323 goto errout; 323 goto errout;
324 err = sdp_record_register(lsession, &record, 0); 324 err = sdp_record_register(lsession, &record, 0);
325 if (err) { 325 if (err) {
326 sdp_close(lsession); 326 sdp_close(lsession);
327 lsession = NULL; 327 lsession = NULL;
328 } 328 }
329errout: 329errout:
330 sdp_data_free(channel); 330 sdp_data_free(channel);
331 sdp_list_free(proto[0], 0); 331 sdp_list_free(proto[0], 0);
332 sdp_list_free(proto[1], 0); 332 sdp_list_free(proto[1], 0);
333 sdp_list_free(proto[2], 0); 333 sdp_list_free(proto[2], 0);
334 sdp_list_free(apseq, 0); 334 sdp_list_free(apseq, 0);
335 sdp_list_free(aproto, 0); 335 sdp_list_free(aproto, 0);
336 336
337 return lsession; 337 return lsession;
338} 338}
339 339
340int ObexServer::initObex(void) 340int ObexServer::initObex(void)
341{ 341{
342 int channel = 10; //Channel on which we do listen 342 int channel = 10; //Channel on which we do listen
343 if (m_obex) 343 if (m_obex)
344 return 0; 344 return 0;
345 m_obex = ::OBEX_Init(transport, obex_event, 0); 345 m_obex = ::OBEX_Init(transport, obex_event, 0);
346 if (!m_obex) { 346 if (!m_obex) {
347 printf("OBEX initialization error %d\n", errno); 347 printf("OBEX initialization error %d\n", errno);
348 return -1; 348 return -1;
349 } 349 }
350 if (transport == OBEX_TRANS_BLUETOOTH) { 350 if (transport == OBEX_TRANS_BLUETOOTH) {
351 ::BtOBEX_ServerRegister(m_obex, NULL, channel); 351 ::BtOBEX_ServerRegister(m_obex, NULL, channel);
352 m_session = addOpushSvc(channel, "OBEX Object Push"); 352 m_session = addOpushSvc(channel, "OBEX Object Push");
353 if (!m_session) { 353 if (!m_session) {
354 printf("OBEX registration error %d\n", errno); 354 printf("OBEX registration error %d\n", errno);
355 ::OBEX_Cleanup(m_obex); 355 ::OBEX_Cleanup(m_obex);
356 m_obex = NULL; 356 m_obex = NULL;
357 return -1; 357 return -1;
358 } 358 }
359 } else if (transport == OBEX_TRANS_IRDA) 359 } else if (transport == OBEX_TRANS_IRDA)
360 ::IrOBEX_ServerRegister(m_obex, "OBEX"); 360 ::IrOBEX_ServerRegister(m_obex, "OBEX");
361 return 0; 361 return 0;
362} 362}
363 363
364bool ObexServer::start(RunMode runmode, Communication comm) 364bool ObexServer::start(RunMode runmode, Communication comm)
365{ 365{
366 if ( runs ) 366 if ( runs )
367 { 367 {
368 return false; // cannot start a process that is already running 368 return false; // cannot start a process that is already running
369 // or if no executable has been assigned 369 // or if no executable has been assigned
370 } 370 }
371 run_mode = runmode; 371 run_mode = runmode;
372 status = 0; 372 status = 0;
373 373
374 if ( !setupCommunication( comm ) ) 374 if ( !setupCommunication( comm ) )
375 qWarning( "Could not setup Communication!" ); 375 qWarning( "Could not setup Communication!" );
376 376
377 // We do this in the parent because if we do it in the child process 377 // We do this in the parent because if we do it in the child process
378 // gdb gets confused when the application runs from gdb. 378 // gdb gets confused when the application runs from gdb.
379 uid_t uid = getuid(); 379 uid_t uid = getuid();
380 gid_t gid = getgid(); 380 gid_t gid = getgid();
381#ifdef HAVE_INITGROUPS 381#ifdef HAVE_INITGROUPS
382 382
383 struct passwd *pw = getpwuid( uid ); 383 struct passwd *pw = getpwuid( uid );
384#endif 384#endif
385 385
386 int fd[ 2 ]; 386 int fd[ 2 ];
387 if ( 0 > pipe( fd ) ) 387 if ( 0 > pipe( fd ) )
388 { 388 {
389 fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue 389 fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue
390 } 390 }
391 391
392 runs = true; 392 runs = true;
393 393
394 QApplication::flushX(); 394 QApplication::flushX();
395 395
396 // WABA: Note that we use fork() and not vfork() because 396 // WABA: Note that we use fork() and not vfork() because
397 // vfork() has unclear semantics and is not standardized. 397 // vfork() has unclear semantics and is not standardized.
398 pid_ = fork(); 398 pid_ = fork();
399 399
400 if ( 0 == pid_ ) 400 if ( 0 == pid_ )
401 { 401 {
402 if ( fd[ 0 ] ) 402 if ( fd[ 0 ] )
403 close( fd[ 0 ] ); 403 close( fd[ 0 ] );
404 if ( !runPrivileged() ) 404 if ( !runPrivileged() )
405 { 405 {
406 setgid( gid ); 406 setgid( gid );
407#if defined( HAVE_INITGROUPS) 407#if defined( HAVE_INITGROUPS)
408 408
409 if ( pw ) 409 if ( pw )
410 initgroups( pw->pw_name, pw->pw_gid ); 410 initgroups( pw->pw_name, pw->pw_gid );
411#endif 411#endif
412 412
413 setuid( uid ); 413 setuid( uid );
414 } 414 }
415 // The child process 415 // The child process
416 if ( !commSetupDoneC() ) 416 if ( !commSetupDoneC() )
417 qWarning( "Could not finish comm setup in child!" ); 417 qWarning( "Could not finish comm setup in child!" );
418 418
419 setupEnvironment(); 419 setupEnvironment();
420 420
421 // Matthias 421 // Matthias
422 if ( run_mode == DontCare ) 422 if ( run_mode == DontCare )
423 setpgid( 0, 0 ); 423 setpgid( 0, 0 );
424 // restore default SIGPIPE handler (Harri) 424 // restore default SIGPIPE handler (Harri)
425 struct sigaction act; 425 struct sigaction act;
426 sigemptyset( &( act.sa_mask ) ); 426 sigemptyset( &( act.sa_mask ) );
427 sigaddset( &( act.sa_mask ), SIGPIPE ); 427 sigaddset( &( act.sa_mask ), SIGPIPE );
428 act.sa_handler = SIG_DFL; 428 act.sa_handler = SIG_DFL;
429 act.sa_flags = 0; 429 act.sa_flags = 0;
430 sigaction( SIGPIPE, &act, 0L ); 430 sigaction( SIGPIPE, &act, 0L );
431 431
432 // We set the close on exec flag. 432 // We set the close on exec flag.
433 // Closing of fd[1] indicates that the execvp succeeded! 433 // Closing of fd[1] indicates that the execvp succeeded!
434 if ( fd[ 1 ] ) 434 if ( fd[ 1 ] )
435 fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC ); 435 fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC );
436 436
437 if (initObex() == 0) { 437 if (initObex() == 0) {
438 if ( fd[ 1 ] ) { 438 if ( fd[ 1 ] ) {
439 ::close(fd[1]); 439 ::close(fd[1]);
440 fd[1] = 0; 440 fd[1] = 0;
441 } 441 }
442 do { 442 do {
443 if (OBEX_HandleInput(m_obex, 60) < 0) { 443 if (OBEX_HandleInput(m_obex, 60) < 0) {
444 fprintf(stderr,"failed to OBEX_HandleInput(), errno=%d\n"); 444 fprintf(stderr,"failed to OBEX_HandleInput(), errno=%d\n",errno);
445 _exit(errno?errno:-1); 445 _exit(errno?errno:-1);
446 } 446 }
447 } while(1); 447 } while(1);
448 } 448 }
449 char resultByte = 1; 449 char resultByte = 1;
450 if ( fd[ 1 ] ) 450 if ( fd[ 1 ] )
451 write( fd[ 1 ], &resultByte, 1 ); 451 write( fd[ 1 ], &resultByte, 1 );
452 _exit( -1 ); 452 _exit( -1 );
453 } 453 }
454 else if ( -1 == pid_ ) 454 else if ( -1 == pid_ )
455 { 455 {
456 // forking failed 456 // forking failed
457 457
458 runs = false; 458 runs = false;
459 return false; 459 return false;
460 } 460 }
461 else 461 else
462 { 462 {
463 if ( fd[ 1 ] ) 463 if ( fd[ 1 ] )
464 close( fd[ 1 ] ); 464 close( fd[ 1 ] );
465 // the parent continues here 465 // the parent continues here
466 466
467 // Discard any data for stdin that might still be there 467 // Discard any data for stdin that might still be there
468 input_data = 0; 468 input_data = 0;
469 469
470 // Check whether client could be started. 470 // Check whether client could be started.
471 if ( fd[ 0 ] ) 471 if ( fd[ 0 ] )
472 for ( ;; ) 472 for ( ;; )
473 { 473 {
474 char resultByte; 474 char resultByte;
475 int n = ::read( fd[ 0 ], &resultByte, 1 ); 475 int n = ::read( fd[ 0 ], &resultByte, 1 );
476 if ( n == 1 ) 476 if ( n == 1 )
477 { 477 {
478 // Error 478 // Error
479 runs = false; 479 runs = false;
480 close( fd[ 0 ] ); 480 close( fd[ 0 ] );
481 pid_ = 0; 481 pid_ = 0;
482 return false; 482 return false;
483 } 483 }
484 if ( n == -1 ) 484 if ( n == -1 )
485 { 485 {
486 if ( ( errno == ECHILD ) || ( errno == EINTR ) ) 486 if ( ( errno == ECHILD ) || ( errno == EINTR ) )
487 continue; // Ignore 487 continue; // Ignore
488 } 488 }
489 break; // success 489 break; // success
490 } 490 }
491 if ( fd[ 0 ] ) 491 if ( fd[ 0 ] )
492 close( fd[ 0 ] ); 492 close( fd[ 0 ] );
493 493
494 if ( !commSetupDoneP() ) // finish communication socket setup for the parent 494 if ( !commSetupDoneP() ) // finish communication socket setup for the parent
495 qWarning( "Could not finish comm setup in parent!" ); 495 qWarning( "Could not finish comm setup in parent!" );
496 496
497 if ( run_mode == Block ) 497 if ( run_mode == Block )
498 { 498 {
499 commClose(); 499 commClose();
500 500
501 // The SIGCHLD handler of the process controller will catch 501 // The SIGCHLD handler of the process controller will catch
502 // the exit and set the status 502 // the exit and set the status
503 while ( runs ) 503 while ( runs )
504 { 504 {
505 OProcessController::theOProcessController-> 505 OProcessController::theOProcessController->
506 slotDoHousekeeping( 0 ); 506 slotDoHousekeeping( 0 );
507 } 507 }
508 runs = FALSE; 508 runs = FALSE;
509 emit processExited( this ); 509 emit processExited( this );
510 } 510 }
511 } 511 }
512 return true; 512 return true;
513} 513}
514 514
515/* 515/*
516 * Stop forwarding process 516 * Stop forwarding process
517 */ 517 */
518int ObexServer::stop() 518int ObexServer::stop()
519{ 519{
520 kill(SIGTERM); 520 kill(SIGTERM);
521 return 0; 521 return 0;
522} 522}
523 523
524//eof 524//eof