@@ -151,14 +151,15 @@ static int method_list_machines(sd_bus *bus, sd_bus_message *message, void *user
151151 return sd_bus_send (bus , reply , NULL );
152152}
153153
154- static int method_create_or_register_machine (Manager * manager , sd_bus_message * message , Machine * * _m , sd_bus_error * error ) {
154+ static int method_create_or_register_machine (Manager * manager , sd_bus_message * message , bool read_network , Machine * * _m , sd_bus_error * error ) {
155155 const char * name , * service , * class , * root_directory ;
156+ const int32_t * netif = NULL ;
156157 MachineClass c ;
157158 uint32_t leader ;
158159 sd_id128_t id ;
159160 const void * v ;
160161 Machine * m ;
161- size_t n ;
162+ size_t n , n_netif = 0 ;
162163 int r ;
163164
164165 assert (manager );
@@ -185,6 +186,21 @@ static int method_create_or_register_machine(Manager *manager, sd_bus_message *m
185186 if (r < 0 )
186187 return r ;
187188
189+ if (read_network ) {
190+ size_t i ;
191+
192+ r = sd_bus_message_read_array (message , 'i' , (const void * * ) & netif , & n_netif );
193+ if (r < 0 )
194+ return r ;
195+
196+ n_netif /= sizeof (int32_t );
197+
198+ for (i = 0 ; i < n_netif ; i ++ ) {
199+ if (netif [i ] <= 0 )
200+ return sd_bus_error_setf (error , SD_BUS_ERROR_INVALID_ARGS , "Invalid network interface index %i" , netif [i ]);
201+ }
202+ }
203+
188204 if (isempty (class ))
189205 c = _MACHINE_CLASS_INVALID ;
190206 else {
@@ -240,6 +256,17 @@ static int method_create_or_register_machine(Manager *manager, sd_bus_message *m
240256 }
241257 }
242258
259+ if (n_netif > 0 ) {
260+ assert_cc (sizeof (int32_t ) == sizeof (int ));
261+ m -> netif = memdup (netif , sizeof (int32_t ) * n_netif );
262+ if (!m -> netif ) {
263+ r = - ENOMEM ;
264+ goto fail ;
265+ }
266+
267+ m -> n_netif = n_netif ;
268+ }
269+
243270 * _m = m ;
244271
245272 return 1 ;
@@ -249,12 +276,12 @@ static int method_create_or_register_machine(Manager *manager, sd_bus_message *m
249276 return r ;
250277}
251278
252- static int method_create_machine (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
279+ static int method_create_machine_internal (sd_bus * bus , sd_bus_message * message , bool read_network , void * userdata , sd_bus_error * error ) {
253280 Manager * manager = userdata ;
254281 Machine * m = NULL ;
255282 int r ;
256283
257- r = method_create_or_register_machine (manager , message , & m , error );
284+ r = method_create_or_register_machine (manager , message , read_network , & m , error );
258285 if (r < 0 )
259286 return r ;
260287
@@ -274,13 +301,21 @@ static int method_create_machine(sd_bus *bus, sd_bus_message *message, void *use
274301 return r ;
275302}
276303
277- static int method_register_machine (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
304+ static int method_create_machine_with_network (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
305+ return method_create_machine_internal (bus , message , true, userdata , error );
306+ }
307+
308+ static int method_create_machine (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
309+ return method_create_machine_internal (bus , message , false, userdata , error );
310+ }
311+
312+ static int method_register_machine_internal (sd_bus * bus , sd_bus_message * message , bool read_network , void * userdata , sd_bus_error * error ) {
278313 Manager * manager = userdata ;
279314 _cleanup_free_ char * p = NULL ;
280315 Machine * m = NULL ;
281316 int r ;
282317
283- r = method_create_or_register_machine (manager , message , & m , error );
318+ r = method_create_or_register_machine (manager , message , read_network , & m , error );
284319 if (r < 0 )
285320 return r ;
286321
@@ -309,6 +344,14 @@ static int method_register_machine(sd_bus *bus, sd_bus_message *message, void *u
309344 return r ;
310345}
311346
347+ static int method_register_machine_with_network (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
348+ return method_register_machine_internal (bus , message , true, userdata , error );
349+ }
350+
351+ static int method_register_machine (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
352+ return method_register_machine_internal (bus , message , false, userdata , error );
353+ }
354+
312355static int method_terminate_machine (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
313356 Manager * m = userdata ;
314357 Machine * machine ;
@@ -400,6 +443,8 @@ const sd_bus_vtable manager_vtable[] = {
400443 SD_BUS_METHOD ("ListMachines" , NULL , "a(ssso)" , method_list_machines , SD_BUS_VTABLE_UNPRIVILEGED ),
401444 SD_BUS_METHOD ("CreateMachine" , "sayssusa(sv)" , "o" , method_create_machine , 0 ),
402445 SD_BUS_METHOD ("RegisterMachine" , "sayssus" , "o" , method_register_machine , 0 ),
446+ SD_BUS_METHOD ("CreateMachineWithNetwork" , "sayssusaia(sv)" , "o" , method_create_machine_with_network , 0 ),
447+ SD_BUS_METHOD ("RegisterMachineWithNetwork" , "sayssusai" , "o" , method_register_machine_with_network , 0 ),
403448 SD_BUS_METHOD ("KillMachine" , "ssi" , NULL , method_kill_machine , SD_BUS_VTABLE_CAPABILITY (CAP_KILL )),
404449 SD_BUS_METHOD ("TerminateMachine" , "s" , NULL , method_terminate_machine , SD_BUS_VTABLE_CAPABILITY (CAP_KILL )),
405450 SD_BUS_METHOD ("GetMachineAddresses" , "s" , "a(yay)" , method_get_machine_addresses , SD_BUS_VTABLE_UNPRIVILEGED ),
0 commit comments