@@ -1180,37 +1180,71 @@ ni_ifcondition_sharable(xml_node_t *node)
11801180
11811181/*
11821182 * <device>...</device>
1183+ * <device:name>...</device:name>
1184+ * <device:alias>...</device:alias>
1185+ * <device:ifindex>...</device:ifindex>
11831186 */
11841187static ni_bool_t
1185- __ni_fsm_policy_match_device_check (const ni_ifcondition_t * cond , ni_ifworker_t * w )
1188+ __ni_fsm_policy_match_device_name_check (const ni_ifcondition_t * cond , ni_ifworker_t * w )
11861189{
1187- ni_warn ("<device> condition not implemented yet" );
1188- return FALSE;
1190+ return ni_ifworker_match_netdev_name (w , cond -> args .string );
11891191}
1190-
1191- static ni_ifcondition_t *
1192- ni_ifcondition_device (xml_node_t * node )
1192+ static ni_bool_t
1193+ __ni_fsm_policy_match_device_alias_check (const ni_ifcondition_t * cond , ni_ifworker_t * w )
11931194{
1194- ni_ifcondition_t * result ;
1195+ return ni_ifworker_match_netdev_alias (w , cond -> args .string );
1196+ }
1197+ static ni_bool_t
1198+ __ni_fsm_policy_match_device_ifindex_check (const ni_ifcondition_t * cond , ni_ifworker_t * w )
1199+ {
1200+ unsigned int ifindex ;
11951201
1196- result = ni_ifcondition_new ( __ni_fsm_policy_match_device_check );
1197- result -> args . device . node = node ;
1198- return result ;
1202+ if ( ni_parse_uint ( cond -> args . string , & ifindex , 10 ) < 0 || ! ifindex )
1203+ return FALSE ;
1204+ return ni_ifworker_match_netdev_ifindex ( w , ifindex ) ;
11991205}
12001206
1201- /*
1202- * <device-alias>foobidoo</device-alias>
1203- */
1204- static ni_bool_t
1205- __ni_fsm_policy_match_device_alias_check (const ni_ifcondition_t * cond , ni_ifworker_t * w )
1207+ static ni_ifcondition_t *
1208+ ni_ifcondition_device_element (xml_node_t * node , const char * name )
12061209{
1207- return ni_ifworker_match_alias (w , cond -> args .string );
1210+ if (ni_string_eq (name , "name" )) {
1211+ return ni_ifcondition_new_cdata (__ni_fsm_policy_match_device_name_check , node );
1212+ }
1213+ if (ni_string_eq (name , "alias" )) {
1214+ return ni_ifcondition_new_cdata (__ni_fsm_policy_match_device_alias_check , node );
1215+ }
1216+ if (ni_string_eq (name , "ifindex" )) {
1217+ return ni_ifcondition_new_cdata (__ni_fsm_policy_match_device_ifindex_check , node );
1218+ }
1219+ ni_error ("%s: unknown device condition <%s>" , xml_node_location (node ), name );
1220+ return NULL ;
12081221}
12091222
12101223static ni_ifcondition_t *
1211- ni_ifcondition_device_alias (xml_node_t * node )
1224+ ni_ifcondition_device (xml_node_t * node )
12121225{
1213- return ni_ifcondition_new_cdata (__ni_fsm_policy_match_device_alias_check , node );
1226+ ni_ifcondition_t * result = NULL ;
1227+
1228+ if (!node -> children && node -> cdata )
1229+ return ni_ifcondition_new_cdata (__ni_fsm_policy_match_device_name_check , node );
1230+
1231+ for (node = node -> children ; node ; node = node -> next ) {
1232+ ni_ifcondition_t * cond ;
1233+
1234+ cond = ni_ifcondition_device_element (node , node -> name );
1235+ if (cond == NULL ) {
1236+ if (result )
1237+ ni_ifcondition_free (result );
1238+ return NULL ;
1239+ }
1240+
1241+ if (result == NULL )
1242+ result = cond ;
1243+ else
1244+ result = ni_ifcondition_and_terms (result , cond );
1245+ }
1246+
1247+ return result ;
12141248}
12151249
12161250/*
@@ -1468,30 +1502,30 @@ ni_ifcondition_from_xml(xml_node_t *node)
14681502 return ni_ifcondition_none (node );
14691503 if (!strcmp (node -> name , "type" ))
14701504 return ni_ifcondition_type (node );
1471- if (!strcmp (node -> name , "device" ))
1472- return ni_ifcondition_device (node );
14731505 if (!strcmp (node -> name , "class" ))
14741506 return ni_ifcondition_class (node );
14751507 if (!strcmp (node -> name , "sharable" ))
14761508 return ni_ifcondition_sharable (node );
14771509 if (!strcmp (node -> name , "link-type" ))
14781510 return ni_ifcondition_linktype (node );
1479- if (!strcmp (node -> name , "device-alias" ))
1480- return ni_ifcondition_device_alias (node );
14811511 if (!strcmp (node -> name , "control-mode" ))
14821512 return ni_ifcondition_control_mode (node );
14831513 if (!strcmp (node -> name , "boot-stage" ))
14841514 return ni_ifcondition_boot_stage (node );
14851515 if (!strcmp (node -> name , "minimum-device-state" ))
14861516 return ni_ifcondition_min_device_state (node );
1517+ if (!strcmp (node -> name , "device" ))
1518+ return ni_ifcondition_device (node );
1519+ if (!strncmp (node -> name , "device:" , sizeof ("device:" )- 1 ))
1520+ return ni_ifcondition_device_element (node , node -> name + sizeof ("device:" )- 1 );
14871521 if (!strcmp (node -> name , "modem" ))
14881522 return ni_ifcondition_modem (node );
1489- if (!strncmp (node -> name , "modem:" , 6 ))
1490- return ni_ifcondition_modem_element (node , node -> name + 6 );
1523+ if (!strncmp (node -> name , "modem:" , sizeof ( "modem:" ) - 1 ))
1524+ return ni_ifcondition_modem_element (node , node -> name + sizeof ( "modem:" ) - 1 );
14911525 if (!strcmp (node -> name , "wireless" ))
14921526 return ni_ifcondition_wireless (node );
1493- if (!strncmp (node -> name , "wireless:" , 9 ))
1494- return ni_ifcondition_wireless_element (node , node -> name + 9 );
1527+ if (!strncmp (node -> name , "wireless:" , sizeof ( "wireless:" ) - 1 ))
1528+ return ni_ifcondition_wireless_element (node , node -> name + sizeof ( "wireless:" ) - 1 );
14951529
14961530 ni_error ("%s: unsupported policy conditional <%s>" , xml_node_location (node ), node -> name );
14971531 return NULL ;
0 commit comments