Hi Christos,

first off, my apologies for letting this linger for so long - I was on
vacation, and am still catching up with the backlog from that. But I
don't plan on taking vacation any time soon, so I'll make sure I respond
quicker ;)

I'll just comment on the patch for now, and respond to the larger merge
issue in a separate email.

First off, some stylistic comments: please do not use tabs to indent,
only spaces, and make sure there is no trailing whitespace.

More comments inline:
> >From 248ea90591198943c9bd2b7a273168db95e47951 Mon Sep 17 00:00:00 2001
> From: Christos Bountalis <[email protected]>
> Date: Thu, 9 Jun 2011 17:47:29 +0300
> Subject: [PATCH] Added aug_find_lense function to find and return used for 
> loading a
>  specific file
> 
> Aug_find_lense is a function that accepts a path of a file, and tries to
> find the lense that was used to load this file in Augeas. Returns either
> a string representing the lense if it is located succesfully either null
> if the lense could not be found, or the file is not loaded in augeas.

The proper word is 'lens' (without the 'e' at the end), i.e. aug_find_lens

> diff --git a/src/augeas.c b/src/augeas.c
> index 88d151f..559bd49 100644
> --- a/src/augeas.c
> +++ b/src/augeas.c
> @@ -617,6 +617,31 @@ static int find_one_node(struct pathx *p, struct tree 
> **match) {
>      return -1;
>  }
>  
> +char* aug_find_lense(struct augeas *aug,const char *path){
> +     //creating a path to run with aug_match in order to find the lense used
> +     //so it can use the same lense to load the other n number paths ...
> +     char *startstr="/augeas/load/*[ '";
> +     char *endstr="/' =~ glob(incl) + regexp('/.*') ]/lens";
> +     char 
> *tempstr=malloc((strlen(startstr)+strlen(endstr)+strlen(path)+2)*sizeof(char));

Please use ALLOC_N and check for errors to allocate memory; in this
case, you don't need to do that though, since you should never use
sprintf, always xasprintf:

> +     sprintf(tempstr,"%s%s%s",startstr,path,endstr);

This should be:

     char *tempstr = NULL;
     int r;
        r = xasprintf(&tempstr, "%s%s%s", startstr, path, endstr);
        ERR_NOMEM(r < 0, aug);
        
> +     //proceed with running the match path for the lense
> +     int cnt;
> +     char **matches;
> +     cnt=aug_match(aug,tempstr,&matches);

You can use Augeas' existing error detection and reporting mechanisms
here (see errcode.h and errcodes[] at the top of augeas.c): the below

> +    if (cnt != 1)   {
> +             printf("Error locating the lense for the specific path\n");
> +             free(tempstr);
> +             return NULL;
> +    }else{
> +             char *val;
> +        aug_get(aug, matches[0], &val);
> +        //remove initial @
> +        *val=*val++;
> +        free(tempstr);
> +        return val;
> +     }
> +}

should be replaced with

                ERR_THROW(cnt == 0, aug, AUG_ENOMATCH, "could not locate lens 
for %s", path);
                ERR_THROW(cnt > 1, aug, AUG_EMMATCH, "found %d lenses for %s", 
cnt, path);
                char *result = NULL; /* This needs to go at the very top of the 
function */
                result = aug_get(aug, matches[0], &result);
        error:
             free(tempstr);
             for (int i=0; i < cnt; i++)
                free(matches[i]);
             free(matches)
             return result;
        }

You should not strip the '@' from lens names - there are two different
ways in which Augeas indicates a lens: '@Module', meaning 'the lens from
Module that is marked for autoload', and 'Module.Lens' meaning 'the lens
Lens from module Module'.

> diff --git a/src/augeas.h b/src/augeas.h
> index 813b7a6..af387ff 100644
> --- a/src/augeas.h
> +++ b/src/augeas.h
> @@ -192,6 +192,18 @@ int aug_insert(augeas *aug, const char *path, const char 
> *label, int before);
>   */
>  int aug_rm(augeas *aug, const char *path);
>  
> +/* Function: aug_find_lense
> + *
> + * Finds the lense used for loading the file given as path
> + * to Augeas tree

You need to say whether path is a path in the file system, or in the
Augeas tree, i.e. whether you want '/etc/hosts' or '/files/etc/hosts'.

David


_______________________________________________
augeas-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/augeas-devel

Reply via email to