Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * dhcpcd-dbus | 2 * dhcpcd-dbus |
| 3 * Copyright 2009 Roy Marples <roy@marples.name> | 3 * Copyright 2009 Roy Marples <roy@marples.name> |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 466 dbus_message_unref(reply); | 466 dbus_message_unref(reply); |
| 467 return DBUS_HANDLER_RESULT_HANDLED; | 467 return DBUS_HANDLER_RESULT_HANDLED; |
| 468 } | 468 } |
| 469 | 469 |
| 470 static DBusHandlerResult | 470 static DBusHandlerResult |
| 471 msg_handler(DBusConnection *con, DBusMessage *msg, _unused void *data) | 471 msg_handler(DBusConnection *con, DBusMessage *msg, _unused void *data) |
| 472 { | 472 { |
| 473 #define IsMethod(msg, method) \ | 473 #define IsMethod(msg, method) \ |
| 474 dbus_message_is_method_call(msg, DHCPCD_SERVICE, method) | 474 dbus_message_is_method_call(msg, DHCPCD_SERVICE, method) |
| 475 if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, | 475 if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, |
| 476 "Introspect")) { | 476 » » » » » "Introspect")) { |
| 477 return introspect(con, msg); | 477 return introspect(con, msg); |
| 478 } else if (IsMethod(msg, "GetVersion")) { | 478 } else if (IsMethod(msg, "GetVersion")) { |
| 479 return version(con, msg, VERSION); | 479 return version(con, msg, VERSION); |
| 480 } else if (IsMethod(msg, "GetInterfaces")) { | 480 } else if (IsMethod(msg, "GetInterfaces")) { |
| 481 return dhcpcd_get_interfaces(con, msg); | 481 return dhcpcd_get_interfaces(con, msg); |
| 482 } else if (IsMethod(msg, "GetStatus")) { | 482 } else if (IsMethod(msg, "GetStatus")) { |
| 483 return return_status(con, msg); | 483 return return_status(con, msg); |
| 484 } else if (IsMethod(msg, "Rebind")) { | 484 } else if (IsMethod(msg, "Rebind")) { |
| 485 start_interface(ifaces); | 485 start_interface(ifaces); |
| 486 return dbus_ack(con, msg); | 486 return dbus_ack(con, msg); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 545 | 545 |
| 546 static void | 546 static void |
| 547 remove_watch(DBusWatch *watch, _unused void *data) | 547 remove_watch(DBusWatch *watch, _unused void *data) |
| 548 { | 548 { |
| 549 int fd; | 549 int fd; |
| 550 | 550 |
| 551 fd = dbus_watch_get_unix_fd(watch); | 551 fd = dbus_watch_get_unix_fd(watch); |
| 552 delete_event(fd); | 552 delete_event(fd); |
| 553 } | 553 } |
| 554 | 554 |
| 555 static DBusHandlerResult dhcpcd_dbus_filter(DBusConnection *conn, | |
| 556 DBusMessage *msg, | |
| 557 void *user_data) | |
| 558 { | |
| 559 const char *service = NULL; | |
| 560 const char *old_owner = NULL; | |
| 561 const char *new_owner = NULL; | |
| 562 | |
| 563 if (!dbus_message_is_signal(msg, DBUS_INTERFACE_DBUS, | |
| 564 "NameOwnerChanged")) | |
| 565 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | |
| 566 | |
| 567 if (!dbus_message_get_args(msg, NULL, | |
| 568 DBUS_TYPE_STRING, &service, | |
| 569 DBUS_TYPE_STRING, &old_owner, | |
| 570 DBUS_TYPE_STRING, &new_owner, | |
| 571 DBUS_TYPE_INVALID)) { | |
| 572 syslog(LOG_ERR, | |
| 573 "Invalid arguments for NameOwnerChanged signal"); | |
| 574 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | |
| 575 } | |
| 576 if (strcmp(service, "org.chromium.flimflam") == 0 && | |
| 577 strlen(new_owner) == 0) { | |
|
kobi
2010/07/27 18:07:02
I think it is better to check new_owner against nu
| |
| 578 syslog(LOG_INFO, "exiting because flimflamd has died"); | |
| 579 stop_interface(ifaces); | |
| 580 exit(EXIT_FAILURE); | |
| 581 } | |
| 582 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | |
| 583 } | |
| 584 | |
| 585 static const char *service_watch_rule = "interface=" DBUS_INTERFACE_DBUS | |
| 586 ",type=signal,member=NameOwnerChanged"; | |
| 587 | |
| 555 void | 588 void |
| 556 dhcpcd_dbus_close(void) | 589 dhcpcd_dbus_close(void) |
| 557 { | 590 { |
| 558 if (connection) { | 591 if (connection) { |
| 592 dbus_bus_remove_match(connection, service_watch_rule, NULL); | |
| 593 dbus_connection_remove_filter(connection, | |
| 594 dhcpcd_dbus_filter, | |
| 595 NULL); | |
| 559 dbus_connection_unref(connection); | 596 dbus_connection_unref(connection); |
| 560 connection = NULL; | 597 connection = NULL; |
| 561 } | 598 } |
| 562 } | 599 } |
| 563 | 600 |
| 564 int | 601 int |
| 565 dhcpcd_dbus_init(void) | 602 dhcpcd_dbus_init(void) |
| 566 { | 603 { |
| 567 DBusObjectPathVTable vt = { | 604 DBusObjectPathVTable vt = { |
| 568 NULL, &msg_handler, NULL, NULL, NULL, NULL | 605 NULL, &msg_handler, NULL, NULL, NULL, NULL |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 586 { | 623 { |
| 587 syslog(LOG_ERR, "dbus: failed to set watch functions"); | 624 syslog(LOG_ERR, "dbus: failed to set watch functions"); |
| 588 return -1; | 625 return -1; |
| 589 } | 626 } |
| 590 if (!dbus_connection_register_object_path(connection, | 627 if (!dbus_connection_register_object_path(connection, |
| 591 DHCPCD_PATH, &vt, NULL)) | 628 DHCPCD_PATH, &vt, NULL)) |
| 592 { | 629 { |
| 593 syslog(LOG_ERR, "dbus: failed to register object path"); | 630 syslog(LOG_ERR, "dbus: failed to register object path"); |
| 594 return -1; | 631 return -1; |
| 595 } | 632 } |
| 633 dbus_connection_add_filter(connection, dhcpcd_dbus_filter, NULL, NULL); | |
| 634 dbus_bus_add_match(connection, service_watch_rule, &err); | |
| 635 if (dbus_error_is_set(&err)) { | |
| 636 syslog(LOG_ERR, "Cannot add rule: %s", err.message); | |
| 637 return -1; | |
| 638 } | |
| 596 return 0; | 639 return 0; |
| 597 } | 640 } |
| 598 | 641 |
| 599 int | 642 int |
| 600 configure(struct interface *ifp) | 643 configure(struct interface *ifp) |
| 601 { | 644 { |
| 602 if (ifp->state->new != NULL) { | 645 if (ifp->state->new != NULL) { |
| 603 /* push state over d-bus */ | 646 /* push state over d-bus */ |
| 604 dhcpcd_dbus_configure(ifp, ifp->state->reason); | 647 dhcpcd_dbus_configure(ifp, ifp->state->reason); |
| 605 | 648 |
| 606 if (write_lease(ifp, ifp->state->new) == -1) | 649 if (write_lease(ifp, ifp->state->new) == -1) |
| 607 syslog(LOG_ERR, "write_lease: %m"); | 650 syslog(LOG_ERR, "write_lease: %m"); |
| 608 } | 651 } |
| 609 return 0; | 652 return 0; |
| 610 } | 653 } |
| 611 | 654 |
| 612 int | 655 int |
| 613 run_script(const struct interface *ifp) | 656 run_script(const struct interface *ifp) |
| 614 { | 657 { |
| 615 return 0; | 658 return 0; |
| 616 } | 659 } |
| OLD | NEW |