Skip to content

Commit

Permalink
fsm: add ni_fsm_policy_array_t primitives and cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Jul 20, 2021
1 parent 1e8480d commit 5de453e
Show file tree
Hide file tree
Showing 7 changed files with 485 additions and 131 deletions.
51 changes: 39 additions & 12 deletions include/wicked/fsm.h
Expand Up @@ -47,17 +47,26 @@ typedef enum ni_config_origin_prio {
#define NI_IFWORKER_DEFAULT_TIMEOUT 30000
#define NI_IFWORKER_INFINITE_TIMEOUT ((unsigned int) -1)

typedef struct ni_fsm ni_fsm_t;
typedef struct ni_ifworker ni_ifworker_t;
typedef struct ni_fsm_require ni_fsm_require_t;
typedef struct ni_fsm_policy ni_fsm_policy_t;
typedef struct ni_fsm_event ni_fsm_event_t;
typedef struct ni_fsm ni_fsm_t;
typedef struct ni_ifworker ni_ifworker_t;
typedef struct ni_fsm_event ni_fsm_event_t;
typedef struct ni_fsm_require ni_fsm_require_t;
typedef struct ni_fsm_policy ni_fsm_policy_t;
typedef int ni_fsm_policy_compare_fn_t(const ni_fsm_policy_t *, const ni_fsm_policy_t *);

typedef struct ni_fsm_policy_array {
unsigned int count;
ni_fsm_policy_t ** data;
} ni_fsm_policy_array_t;

#define NI_FSM_POLICY_ARRAY_INIT { .count = 0, .data = NULL }

typedef struct ni_ifworker_array {
unsigned int count;
ni_ifworker_t ** data;
unsigned int count;
ni_ifworker_t ** data;
} ni_ifworker_array_t;
#define NI_IFWORKER_ARRAY_INIT { .count = 0, .data = NULL }

#define NI_IFWORKER_ARRAY_INIT { .count = 0, .data = NULL }

typedef struct ni_fsm_timer_ctx ni_fsm_timer_ctx_t;
typedef void ni_fsm_timer_fn_t(const ni_timer_t *, ni_fsm_timer_ctx_t *);
Expand Down Expand Up @@ -141,16 +150,18 @@ struct ni_ifworker {
pending : 1,
readonly : 1;

ni_fsm_policy_array_t policies;

ni_ifworker_control_t control;

struct {
ni_client_state_config_t meta;
xml_node_t * node;
} state;
} config;

struct {
ni_client_state_config_t meta;
xml_node_t * node;
} config;
} state;

/* The security ID can be used as a set of identifiers
* to look up user name/password/pin type info in a
Expand Down Expand Up @@ -290,16 +301,32 @@ extern void ni_fsm_policy_free(ni_fsm_policy_t *);
extern ni_bool_t ni_fsm_policy_update(ni_fsm_policy_t *, xml_node_t *);
extern ni_bool_t ni_fsm_policy_remove(ni_fsm_t *, ni_fsm_policy_t *);
extern ni_fsm_policy_t * ni_fsm_policy_by_name(const ni_fsm_t *, const char *);
extern int ni_fsm_policy_compare_weight(const ni_fsm_policy_t *, const ni_fsm_policy_t *);
extern unsigned int ni_fsm_policy_get_applicable_policies(const ni_fsm_t *, ni_ifworker_t *,
const ni_fsm_policy_t **, unsigned int);
extern ni_bool_t ni_fsm_exists_applicable_policy(const ni_fsm_t *, ni_fsm_policy_t *, ni_ifworker_t *);
extern xml_node_t * ni_fsm_policy_transform_document(xml_node_t *, ni_fsm_policy_t * const *, unsigned int);
extern const char * ni_fsm_policy_name(const ni_fsm_policy_t *);
extern const xml_node_t * ni_fsm_policy_node(const ni_fsm_policy_t *);
extern const xml_location_t * ni_fsm_policy_location(const ni_fsm_policy_t *);
extern const char * ni_fsm_policy_get_origin(const ni_fsm_policy_t *);
extern const ni_uuid_t * ni_fsm_policy_uuid(const ni_fsm_policy_t *);
extern uid_t ni_fsm_policy_owner(const ni_fsm_policy_t *);
extern const char * ni_fsm_policy_origin(const ni_fsm_policy_t *);
extern unsigned int ni_fsm_policy_weight(const ni_fsm_policy_t *);
extern ni_bool_t ni_fsm_policies_changed_since(const ni_fsm_t *, unsigned int *tstamp);

extern void ni_fsm_policy_array_init(ni_fsm_policy_array_t *);
extern void ni_fsm_policy_array_destroy(ni_fsm_policy_array_t *);
extern void ni_fsm_policy_array_sort(ni_fsm_policy_array_t *, ni_fsm_policy_compare_fn_t *);
extern ni_bool_t ni_fsm_policy_array_move(ni_fsm_policy_array_t *, ni_fsm_policy_array_t *);
extern ni_bool_t ni_fsm_policy_array_append(ni_fsm_policy_array_t *, ni_fsm_policy_t *);
extern ni_bool_t ni_fsm_policy_array_insert(ni_fsm_policy_array_t *, unsigned int, ni_fsm_policy_t *);
extern ni_bool_t ni_fsm_policy_array_delete(ni_fsm_policy_array_t *, unsigned int);
extern ni_fsm_policy_t * ni_fsm_policy_array_remove(ni_fsm_policy_array_t *, unsigned int);
extern ni_fsm_policy_t * ni_fsm_policy_array_get(ni_fsm_policy_array_t *, unsigned int);
extern ni_fsm_policy_t * ni_fsm_policy_array_ref(ni_fsm_policy_array_t *, unsigned int);
extern unsigned int ni_fsm_policy_array_index(const ni_fsm_policy_array_t *, const ni_fsm_policy_t *);

extern ni_dbus_client_t * ni_fsm_create_client(ni_fsm_t *);
extern ni_bool_t ni_fsm_refresh_state(ni_fsm_t *);
extern unsigned int ni_fsm_schedule(ni_fsm_t *);
Expand Down
4 changes: 2 additions & 2 deletions nanny/device.c
Expand Up @@ -208,7 +208,7 @@ ni_factory_device_apply_policy(ni_fsm_t *fsm, ni_ifworker_t *w, ni_managed_polic
ni_debug_nanny("%s: using device config", w->name);
xml_node_print_debug(config, 0);

ni_ifworker_set_config(w, config, ni_fsm_policy_get_origin(policy));
ni_ifworker_set_config(w, config, ni_fsm_policy_origin(policy));
xml_node_free(config);

/* Now do the fandango */
Expand Down Expand Up @@ -276,7 +276,7 @@ ni_managed_device_apply_policy(ni_managed_device_t *mdev, ni_managed_policy_t *m
xml_node_free(config);

/* Now do the fandango */
return ni_managed_device_up(mdev, ni_fsm_policy_get_origin(policy));
return ni_managed_device_up(mdev, ni_fsm_policy_origin(policy));
}

/*
Expand Down
4 changes: 2 additions & 2 deletions nanny/nanny.c
Expand Up @@ -586,7 +586,7 @@ ni_nanny_prompt(const ni_fsm_prompt_t *p, xml_node_t *node, void *user_data)
w->name, path_buf.string);
goto done;
}
if ((user = ni_nanny_get_user(mgr, mdev->selected_policy->owner)) == NULL) {
if (!(user = ni_nanny_get_user(mgr, ni_managed_policy_owner(mdev->selected_policy)))) {
ni_error("%s: policy not owned by anyone?!", w->name);
goto done;
}
Expand Down Expand Up @@ -1054,7 +1054,7 @@ ni_nanny_recheck_policy(ni_nanny_t *mgr, ni_fsm_policy_t *policy)
w = ni_fsm_ifworker_by_policy_name(mgr->fsm, NI_IFWORKER_TYPE_NETDEV,
ni_fsm_policy_name(policy));
if (w == NULL || !w->config.node) {
const char *origin = ni_fsm_policy_get_origin(policy);
const char *origin = ni_fsm_policy_origin(policy);

config = xml_node_new(NI_CLIENT_IFCONFIG, NULL);
config = ni_fsm_policy_transform_document(config, &policy, 1);
Expand Down
2 changes: 1 addition & 1 deletion nanny/nanny.h
Expand Up @@ -68,7 +68,6 @@ struct ni_managed_policy {
ni_managed_policy_t ** pprev;
ni_managed_policy_t * next;

uid_t owner;
unsigned int seqno;
ni_fsm_policy_t * fsm_policy;
};
Expand Down Expand Up @@ -158,6 +157,7 @@ extern ni_dbus_object_t * ni_managed_policy_register(ni_nanny_t *, ni_fsm_policy
extern ni_managed_policy_t * ni_managed_policy_new(ni_nanny_t *, ni_fsm_policy_t *);
extern ni_managed_policy_t * ni_managed_policy_ref(ni_managed_policy_t *);
extern void ni_managed_policy_free(ni_managed_policy_t *);
extern uid_t ni_managed_policy_owner(const ni_managed_policy_t *);

extern const char * ni_managed_state_to_string(ni_managed_state_t);

Expand Down
9 changes: 7 additions & 2 deletions nanny/policy.c
Expand Up @@ -191,6 +191,12 @@ ni_managed_policy_free(ni_managed_policy_t *mpolicy)
}
}

uid_t
ni_managed_policy_owner(const ni_managed_policy_t *mpolicy)
{
return mpolicy ? ni_fsm_policy_owner(mpolicy->fsm_policy) : -1U;
}

ni_dbus_object_t *
ni_managed_policy_register(ni_nanny_t *mgr, ni_fsm_policy_t *policy)
{
Expand Down Expand Up @@ -298,7 +304,7 @@ ni_objectmodel_managed_policy_update(ni_dbus_object_t *object, const ni_dbus_met
return FALSE;
}

if (caller_uid != 0 && caller_uid != mpolicy->owner) {
if (caller_uid != 0 && caller_uid != ni_managed_policy_owner(mpolicy)) {
dbus_set_error_const(error, NI_DBUS_ERROR_PERMISSION_DENIED, NULL);
return FALSE;
}
Expand Down Expand Up @@ -331,7 +337,6 @@ ni_objectmodel_managed_policy_update(ni_dbus_object_t *object, const ni_dbus_met
}
xml_document_free(doc);

mpolicy->owner = caller_uid;
mpolicy->seqno++;

if (!ni_managed_policy_save(mpolicy)) {
Expand Down

0 comments on commit 5de453e

Please sign in to comment.