[netcf-devel] [PATCH 2/3] Move get_augeas and aug_submatch to dutil.c
Jonas Eriksson
jonas.j.eriksson at ericsson.com
Mon Jul 20 06:44:05 UTC 2009
Well, this was not the best commit message of all times, never
mind the two first sentences with basically the same message..
Anyway, the problem was that the [n][2]-array could not be
included in a struct (as a **), as it apparently was stored as a
[n*2] array (I would not bet on the portability of accessing it
as such), and as it could not be casted to a [][2]-array.
The reason for including it in a struct was to make get_augeas
callable from outside drv_*.c.
Regards,
Jonas
On Fri, Jul 17, 2009 at 05:32:43PM +0200 Jonas Eriksson wrote:
> In order to include augeas_xfm in the driver struct, the type of augeas_xfm had
> to be reworked to a struct array. The inclusion of augeas_xfm in the driver
> struct was necessary in order to move get_augeas and aug_submatch from
> drv_initscripts.c to dutil.c. This also prepares for future utility functions
> operating on the augeas instance.
> ---
> src/drv_initscripts.c | 85 ++-----------------------------------------------
> src/dutil.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++
> src/dutil.h | 14 ++++++++
> 3 files changed, 99 insertions(+), 82 deletions(-)
>
> diff --git a/src/drv_initscripts.c b/src/drv_initscripts.c
> index d51ac97..7aba42d 100644
> --- a/src/drv_initscripts.c
> +++ b/src/drv_initscripts.c
> @@ -47,7 +47,7 @@ static const char *const ifcfg_path =
> "/files/etc/sysconfig/network-scripts/*";
>
> /* Augeas should only load the files we are interested in */
> -static const char *const augeas_xfm[][2] = {
> +static const struct augeas_pv augeas_xfm[] = {
> /* Ifcfg files */
> { "/augeas/load/Ifcfg/lens", "Shellvars.lns" },
> { "/augeas/load/Ifcfg/incl",
> @@ -90,68 +90,6 @@ static const char *const subif_paths[] = {
> "MASTER", "BRIDGE"
> };
>
> -/* Get the Augeas instance; if we already initialized it, just return
> - * it. Otherwise, create a new one and return that.
> - */
> -static struct augeas *get_augeas(struct netcf *ncf) {
> - int r;
> -
> - if (ncf->driver->augeas == NULL) {
> - struct augeas *aug;
> - char *path;
> -
> - r = xasprintf(&path, "%s/lenses", ncf->data_dir);
> - ERR_COND_BAIL(r < 0, ncf, ENOMEM);
> -
> - aug = aug_init(ncf->root, path, AUG_NO_MODL_AUTOLOAD);
> - FREE(path);
> - ERR_THROW(aug == NULL, ncf, EOTHER, "aug_init failed");
> - ncf->driver->augeas = aug;
> - /* Only look at a few config files */
> - r = aug_rm(aug, "/augeas/load/*");
> - ERR_THROW(r < 0, ncf, EOTHER, "aug_rm failed in get_augeas");
> -
> - for (int i=0; i < ARRAY_CARDINALITY(augeas_xfm); i++) {
> - r = aug_set(aug, augeas_xfm[i][0], augeas_xfm[i][1]);
> - ERR_THROW(r < 0, ncf, EOTHER,
> - "transform setup failed to set %s",
> - augeas_xfm[i][0]);
> - }
> - r = aug_load(aug);
> - ERR_THROW(r < 0, ncf, EOTHER, "failed to load config files");
> -
> - /* FIXME: we need to produce _much_ better diagnostics here - need
> - * to analyze what came back in /augeas//error; ultimately, we need
> - * to understand whether this is harmless or a real error. For real
> - * errors, we need to return an error.
> - */
> - r = aug_match(aug, "/augeas//error", NULL);
> - if (r > 0) {
> - fprintf(stderr, "warning: augeas initialization had errors\n");
> - fprintf(stderr, "please file a bug with the following lines in the bug report:\n");
> - aug_print(aug, stderr, "/augeas//error");
> - }
> - } else {
> - if (ncf->driver->load_augeas) {
> - struct augeas *aug = ncf->driver->augeas;
> - /* Undefine all our variables to work around bug 79 in Augeas */
> - aug_defvar(aug, "iptables", NULL);
> - aug_defvar(aug, "fw", NULL);
> - aug_defvar(aug, "fw_custom", NULL);
> - aug_defvar(aug, "ipt_filter", NULL);
> -
> - r = aug_load(ncf->driver->augeas);
> - ERR_THROW(r < 0, ncf, EOTHER, "failed to reload config files");
> - ncf->driver->load_augeas = 0;
> - }
> - }
> - return ncf->driver->augeas;
> - error:
> - aug_close(ncf->driver->augeas);
> - ncf->driver->augeas = NULL;
> - return NULL;
> -}
> -
> ATTRIBUTE_FORMAT(printf, 4, 5)
> static int defnode(struct netcf *ncf, const char *name, const char *value,
> const char *format, ...) {
> @@ -176,25 +114,6 @@ static int defnode(struct netcf *ncf, const char *name, const char *value,
> return (r < 0) ? -1 : created;
> }
>
> -static int aug_submatch(struct netcf *ncf, const char *p1,
> - const char *p2, char ***matches) {
> - struct augeas *aug = get_augeas(ncf);
> - char *path = NULL;
> - int r;
> -
> - r = xasprintf(&path, "%s/%s", p1, p2);
> - ERR_COND_BAIL(r < 0, ncf, EOTHER);
> -
> - r = aug_match(aug, path, matches);
> - ERR_COND_BAIL(r < 0, ncf, EOTHER);
> -
> - free(path);
> - return r;
> - error:
> - free(path);
> - return -1;
> -}
> -
> static int is_slave(struct netcf *ncf, const char *intf) {
> for (int s = 0; s < ARRAY_CARDINALITY(subif_paths); s++) {
> int r;
> @@ -355,6 +274,8 @@ int drv_init(struct netcf *ncf) {
> return -1;
>
> ncf->driver->ioctl_fd = -1;
> + ncf->driver->augeas_xfm_size = ARRAY_CARDINALITY(augeas_xfm);
> + ncf->driver->augeas_xfm = augeas_xfm;
>
> // FIXME: Check for errors
> xsltInit();
> diff --git a/src/dutil.c b/src/dutil.c
> index c15bfbc..d0cdb22 100644
> --- a/src/dutil.c
> +++ b/src/dutil.c
> @@ -62,6 +62,88 @@ int xasprintf(char **strp, const char *format, ...) {
> return result;
> }
>
> +/* Get the Augeas instance; if we already initialized it, just return
> + * it. Otherwise, create a new one and return that.
> + */
> +struct augeas *get_augeas(struct netcf *ncf) {
> + int r;
> +
> + if (ncf->driver->augeas == NULL) {
> + struct augeas *aug;
> + char *path;
> +
> + r = xasprintf(&path, "%s/lenses", ncf->data_dir);
> + ERR_COND_BAIL(r < 0, ncf, ENOMEM);
> +
> + aug = aug_init(ncf->root, path, AUG_NO_MODL_AUTOLOAD);
> + FREE(path);
> + ERR_THROW(aug == NULL, ncf, EOTHER, "aug_init failed");
> + ncf->driver->augeas = aug;
> + /* Only look at a few config files */
> + r = aug_rm(aug, "/augeas/load/*");
> + ERR_THROW(r < 0, ncf, EOTHER, "aug_rm failed in get_augeas");
> +
> + for (int i=0; i < ncf->driver->augeas_xfm_size; i++) {
> + r = aug_set(aug, ncf->driver->augeas_xfm[i].path,
> + ncf->driver->augeas_xfm[i].value);
> + ERR_THROW(r < 0, ncf, EOTHER,
> + "transform setup failed to set %s",
> + ncf->driver->augeas_xfm[i].path);
> + }
> + r = aug_load(aug);
> + ERR_THROW(r < 0, ncf, EOTHER, "failed to load config files");
> +
> + /* FIXME: we need to produce _much_ better diagnostics here - need
> + * to analyze what came back in /augeas//error; ultimately, we need
> + * to understand whether this is harmless or a real error. For real
> + * errors, we need to return an error.
> + */
> + r = aug_match(aug, "/augeas//error", NULL);
> + if (r > 0) {
> + fprintf(stderr, "warning: augeas initialization had errors\n");
> + fprintf(stderr, "please file a bug with the following lines in the bug report:\n");
> + aug_print(aug, stderr, "/augeas//error");
> + }
> + } else {
> + if (ncf->driver->load_augeas) {
> + struct augeas *aug = ncf->driver->augeas;
> + /* Undefine all our variables to work around bug 79 in Augeas */
> + aug_defvar(aug, "iptables", NULL);
> + aug_defvar(aug, "fw", NULL);
> + aug_defvar(aug, "fw_custom", NULL);
> + aug_defvar(aug, "ipt_filter", NULL);
> +
> + r = aug_load(ncf->driver->augeas);
> + ERR_THROW(r < 0, ncf, EOTHER, "failed to reload config files");
> + ncf->driver->load_augeas = 0;
> + }
> + }
> + return ncf->driver->augeas;
> + error:
> + aug_close(ncf->driver->augeas);
> + ncf->driver->augeas = NULL;
> + return NULL;
> +}
> +
> +int aug_submatch(struct netcf *ncf, const char *p1,
> + const char *p2, char ***matches) {
> + struct augeas *aug = get_augeas(ncf);
> + char *path = NULL;
> + int r;
> +
> + r = xasprintf(&path, "%s/%s", p1, p2);
> + ERR_COND_BAIL(r < 0, ncf, EOTHER);
> +
> + r = aug_match(aug, path, matches);
> + ERR_COND_BAIL(r < 0, ncf, EOTHER);
> +
> + free(path);
> + return r;
> + error:
> + free(path);
> + return -1;
> +}
> +
> void free_matches(int nint, char ***intf) {
> if (*intf != NULL) {
> for (int i=0; i < nint; i++)
> diff --git a/src/dutil.h b/src/dutil.h
> index e5ec383..8f6f293 100644
> --- a/src/dutil.h
> +++ b/src/dutil.h
> @@ -33,11 +33,25 @@ struct driver {
> xmlRelaxNGPtr rng;
> int ioctl_fd;
> unsigned int load_augeas : 1;
> + unsigned int augeas_xfm_size;
> + const struct augeas_pv *augeas_xfm;
> +};
> +
> +struct augeas_pv {
> + const char *const path;
> + const char *const value;
> };
>
> /* Like asprintf, but set *STRP to NULL on error */
> int xasprintf(char **strp, const char *format, ...);
>
> +/* Get or create the augeas instance from @ncf */
> +struct augeas *get_augeas(struct netcf *ncf);
> +
> +/* Like aug_match, but match @p1/@p2 */
> +int aug_submatch(struct netcf *ncf, const char *p1,
> + const char *p2, char ***matches);
> +
> /* Free matches from aug_match (or aug_submatch) */
> void free_matches(int nint, char ***intf);
>
> --
> 1.6.2
>
--
Jonas Eriksson
Consultant at AS/EAB/FLJ/IL
Phone: +46 8 58086281
Combitech AB
Älvsjö, Sweden
More information about the netcf-devel
mailing list