[systemd-devel] [PATCH v4 1/4] bus: StartTransientUnit can have aux unit

WaLyong Cho walyong.cho at samsung.com
Wed Dec 3 20:26:09 PST 2014


On 12/04/2014 03:00 AM, Lennart Poettering wrote:
> On Tue, 02.12.14 23:29, WaLyong Cho (walyong.cho at samsung.com) wrote:
> 
>> ---
>>  src/core/dbus-manager.c | 123 +++++++++++++++++++++++++++++++++++++++++-------
>>  1 file changed, 105 insertions(+), 18 deletions(-)
>>
>> diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
>> index 0994d7b..643aa8b 100644
>> --- a/src/core/dbus-manager.c
>> +++ b/src/core/dbus-manager.c
>> @@ -615,6 +615,93 @@ static int method_set_unit_properties(sd_bus *bus, sd_bus_message *message, void
>>          return bus_unit_method_set_properties(bus, message, u, error);
>>  }
>>  
>> +static int transient_unit_from_message(
>> +                Manager *m,
>> +                sd_bus_message *message,
>> +                const char *name,
>> +                Unit **unit,
>> +                sd_bus_error *error) {
>> +
>> +        Unit *u;
>> +        int r;
>> +
>> +        assert(m);
>> +        assert(message);
>> +        assert(name);
>> +
>> +        r = manager_load_unit(m, name, NULL, error, &u);
>> +        if (r < 0)
>> +                return r;
>> +
>> +        if (u->load_state != UNIT_NOT_FOUND ||
>> +            set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0)
>> +                return sd_bus_error_setf(error,
>> +                                         BUS_ERROR_UNIT_EXISTS,
>> +                                         "Unit %s already exists.",
>> +                                         name);
> 
> Please do not line-break so eagerly. See CODING_STYLE, we do no follow
> a 80ch regime.
> 
>> +
>> +static int try_aux_units_in_message(
>> +                Manager *m,
>> +                sd_bus_message *message,
>> +                sd_bus_error *error) {
> 
> Why call this "try"? Maybe invoke it
> "transient_aux_units_from_message()" or so?
> 
>>          if (r < 0)
>>                  return r;
>>          if (r == 0)
>> -                return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
>> +                /* No authorization for now, but the async polkit
>> +                 * stuff will call us again when it has it */
>> +                return 1;
> 
> Please don't rearrange lines that your patch doesn't really
> change. Please don't break lines too eagerly.
> 
>>  
>>          r = sd_bus_message_read(message, "ss", &name, &smode);
>>          if (r < 0)
>> @@ -639,34 +728,32 @@ static int method_start_transient_unit(sd_bus *bus, sd_bus_message *message, voi
>>  
>>          t = unit_name_to_type(name);
>>          if (t < 0)
>> -                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid unit type.");
>> +                return sd_bus_error_setf(error,
>> +                                         SD_BUS_ERROR_INVALID_ARGS,
>> +                                         "Invalid unit type.");
> 
> Same here...
> 
>>  
>>          if (!unit_vtable[t]->can_transient)
>> -                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unit type %s does not support transient units.", unit_type_to_string(t));
>> -
>> -        mode = job_mode_from_string(smode);
>> -        if (mode < 0)
>> -                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Job mode %s is invalid.", smode);
>> +                return sd_bus_error_setf(error,
>> +                                         SD_BUS_ERROR_INVALID_ARGS,
>> +                                         "Unit type %s does not support transient units.",
>> +                                         unit_type_to_string(t));
> 
> Same here.
> 
>>  
>>          r = mac_selinux_access_check(message, "start", error);
>>          if (r < 0)
>>                  return r;
>>  
>> -        r = manager_load_unit(m, name, NULL, error, &u);
>> -        if (r < 0)
>> -                return r;
>> -
>> -        if (u->load_state != UNIT_NOT_FOUND || set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0)
>> -                return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS, "Unit %s already exists.", name);
>> +        mode = job_mode_from_string(smode);
>> +        if (mode < 0)
>> +                return sd_bus_error_setf(error,
>> +                                         SD_BUS_ERROR_INVALID_ARGS,
>> +                                         "Job mode %s is invalid.",
>> +                                         smode);
> 
> Why did you move the parsing of the job mode after the selinux access
> check? I think we should validate all args before doing any further checks.
> 
>>  
>> -        /* OK, the unit failed to load and is unreferenced, now let's
>> -         * fill in the transient data instead */
>> -        r = unit_make_transient(u);
>> +        r = transient_unit_from_message(m, message, name, &u, error);
>>          if (r < 0)
>>                  return r;
>>  
>> -        /* Set our properties */
>> -        r = bus_unit_set_properties(u, message, UNIT_RUNTIME, false, error);
>> +        r = try_aux_units_in_message(m, message, error);
>>          if (r < 0)
>>                  return r;
> 
> Hmm, the unit_load() invocation, isn't that something that should move
> into transient_unit_from_message() as well?

The main transient unit should have UNIT_REFERENCED_BY dependency to the
aux unit. So the aux unit should be loaded first. To keep this order,
unit_load() can not be move into transient_unit_from_message().

WaLyong
> 
> Lennart
> 


More information about the systemd-devel mailing list