X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmanager.c;h=26a631e9d7fc0db7807d8a18211da0a353cb1e0d;hb=f34277d9117cd9d858f7332eef0023e05277ce74;hp=c062cfb5ed3f19fb33bde2d7456843022902c960;hpb=e983b76024342278a0377eae116c925f2567776e;p=elogind.git diff --git a/src/manager.c b/src/manager.c index c062cfb5e..26a631e9d 100644 --- a/src/manager.c +++ b/src/manager.c @@ -92,7 +92,7 @@ static int manager_setup_notify(Manager *m) { else strncpy(sa.un.sun_path+1, NOTIFY_SOCKET, sizeof(sa.un.sun_path)-1); - if (bind(m->notify_watch.fd, &sa.sa, sizeof(sa_family_t) + 1 + strlen(sa.un.sun_path+1)) < 0) { + if (bind(m->notify_watch.fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) { log_error("bind() failed: %m"); return -errno; } @@ -1398,18 +1398,27 @@ static int transaction_add_job_and_dependencies( assert(type < _JOB_TYPE_MAX); assert(unit); - if (unit->meta.load_state != UNIT_LOADED && unit->meta.load_state != UNIT_ERROR) { + if (unit->meta.load_state != UNIT_LOADED && + unit->meta.load_state != UNIT_ERROR && + unit->meta.load_state != UNIT_BANNED) { dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s is not loaded properly.", unit->meta.id); return -EINVAL; } if (type != JOB_STOP && unit->meta.load_state == UNIT_ERROR) { - dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s failed to load: %s. You might find more information in the system logs.", + dbus_set_error(e, BUS_ERROR_LOAD_FAILED, + "Unit %s failed to load: %s. " + "You might find more information in the system logs.", unit->meta.id, strerror(-unit->meta.load_error)); return -EINVAL; } + if (type != JOB_STOP && unit->meta.load_state == UNIT_BANNED) { + dbus_set_error(e, BUS_ERROR_BANNED, "Unit %s is banned.", unit->meta.id); + return -EINVAL; + } + if (!unit_job_is_applicable(unit, type)) { dbus_set_error(e, BUS_ERROR_JOB_TYPE_NOT_APPLICABLE, "Job type %s is not applicable for unit %s.", job_type_to_string(type), unit->meta.id); return -EBADR;