|
5 | 5 | #include "strv.h" |
6 | 6 | #include "user-util.h" |
7 | 7 | #include "varlink.h" |
| 8 | +#include "varlink-internal.h" |
8 | 9 | #include "varlink-io.systemd.UserDatabase.h" |
9 | 10 | #include "varlink-io.systemd.ManagedOOM.h" |
10 | 11 |
|
@@ -492,46 +493,42 @@ static void vl_disconnect(VarlinkServer *s, Varlink *link, void *userdata) { |
492 | 493 | } |
493 | 494 |
|
494 | 495 | static int manager_varlink_init_system(Manager *m) { |
495 | | - _cleanup_(varlink_server_unrefp) VarlinkServer *s = NULL; |
496 | 496 | int r; |
497 | 497 |
|
498 | 498 | assert(m); |
499 | 499 |
|
500 | | - if (m->varlink_server) |
501 | | - return 1; |
502 | | - |
503 | 500 | if (!MANAGER_IS_SYSTEM(m)) |
504 | 501 | return 0; |
505 | 502 |
|
506 | | - r = manager_setup_varlink_server(m, &s); |
| 503 | + r = manager_setup_varlink_server(m); |
507 | 504 | if (r < 0) |
508 | 505 | return log_error_errno(r, "Failed to set up varlink server: %m"); |
| 506 | + bool fresh = r > 0; |
509 | 507 |
|
510 | 508 | if (!MANAGER_IS_TEST_RUN(m)) { |
511 | 509 | (void) mkdir_p_label("/run/systemd/userdb", 0755); |
512 | 510 |
|
513 | 511 | FOREACH_STRING(address, "/run/systemd/userdb/io.systemd.DynamicUser", VARLINK_ADDR_PATH_MANAGED_OOM_SYSTEM) { |
514 | | - if (MANAGER_IS_RELOADING(m)) { |
515 | | - /* If manager is reloading, we skip listening on existing addresses, since |
516 | | - * the fd should be acquired later through deserialization. */ |
517 | | - if (access(address, F_OK) >= 0) |
| 512 | + if (!fresh) { |
| 513 | + /* We might have got sockets through deserialization. Do not bind to them twice. */ |
| 514 | + |
| 515 | + bool found = false; |
| 516 | + LIST_FOREACH(sockets, ss, m->varlink_server->sockets) |
| 517 | + if (path_equal(ss->address, address)) { |
| 518 | + found = true; |
| 519 | + break; |
| 520 | + } |
| 521 | + |
| 522 | + if (found) |
518 | 523 | continue; |
519 | | - if (errno != ENOENT) |
520 | | - return log_error_errno(errno, |
521 | | - "Failed to check if varlink socket '%s' exists: %m", address); |
522 | 524 | } |
523 | 525 |
|
524 | | - r = varlink_server_listen_address(s, address, 0666); |
| 526 | + r = varlink_server_listen_address(m->varlink_server, address, 0666); |
525 | 527 | if (r < 0) |
526 | 528 | return log_error_errno(r, "Failed to bind to varlink socket '%s': %m", address); |
527 | 529 | } |
528 | 530 | } |
529 | 531 |
|
530 | | - r = varlink_server_attach_event(s, m->event, SD_EVENT_PRIORITY_NORMAL); |
531 | | - if (r < 0) |
532 | | - return log_error_errno(r, "Failed to attach varlink connection to event loop: %m"); |
533 | | - |
534 | | - m->varlink_server = TAKE_PTR(s); |
535 | 532 | return 1; |
536 | 533 | } |
537 | 534 |
|
@@ -597,12 +594,17 @@ static int manager_varlink_init_user(Manager *m) { |
597 | 594 | return 1; |
598 | 595 | } |
599 | 596 |
|
600 | | -int manager_setup_varlink_server(Manager *m, VarlinkServer **ret) { |
| 597 | +int manager_setup_varlink_server(Manager *m) { |
601 | 598 | _cleanup_(varlink_server_unrefp) VarlinkServer *s = NULL; |
602 | 599 | int r; |
603 | 600 |
|
604 | 601 | assert(m); |
605 | | - assert(ret); |
| 602 | + |
| 603 | + if (m->varlink_server) |
| 604 | + return 0; |
| 605 | + |
| 606 | + if (!MANAGER_IS_SYSTEM(m)) |
| 607 | + return -EINVAL; |
606 | 608 |
|
607 | 609 | r = varlink_server_new(&s, VARLINK_SERVER_ACCOUNT_UID|VARLINK_SERVER_INHERIT_USERDATA); |
608 | 610 | if (r < 0) |
@@ -630,8 +632,12 @@ int manager_setup_varlink_server(Manager *m, VarlinkServer **ret) { |
630 | 632 | if (r < 0) |
631 | 633 | return log_debug_errno(r, "Failed to register varlink disconnect handler: %m"); |
632 | 634 |
|
633 | | - *ret = TAKE_PTR(s); |
634 | | - return 0; |
| 635 | + r = varlink_server_attach_event(s, m->event, SD_EVENT_PRIORITY_NORMAL); |
| 636 | + if (r < 0) |
| 637 | + return log_debug_errno(r, "Failed to attach varlink connection to event loop: %m"); |
| 638 | + |
| 639 | + m->varlink_server = TAKE_PTR(s); |
| 640 | + return 1; |
635 | 641 | } |
636 | 642 |
|
637 | 643 | int manager_varlink_init(Manager *m) { |
|
0 commit comments