[PATCH app/xauth 2/2] Sort entries from most specific to most generic.

Walter Harms wharms at bfs.de
Tue Jun 5 15:46:05 UTC 2018



> Michal Srb <msrb at suse.com> hat am 31. Mai 2018 um 15:12 geschrieben:
> 
> 
> There is no point in adding entry or merging lists if a FamilyWild entry would
> end in front of any entry, or entry without display number would end in front
> of entry with number.
> 
> This sorts all entries in order:
>   * FamilyWild without display number
>   * FamilyWild with display number
>   * Other family without display number
>   * Other family with display number
> 
> The order of the entries in each category is kept.
> ---
>  process.c | 41 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 insertions(+)
> 
> diff --git a/process.c b/process.c
> index d3ea435..f3d6ca4 100644
> --- a/process.c
> +++ b/process.c
> @@ -1170,6 +1170,45 @@ merge_entries(AuthList **firstp, AuthList *second, int
> *nnewp, int *nreplp)
>  
>  }
>  
> +static void
> +sort_entries(AuthList **firstp)
> +{
> +    /* Insert sort, in each pass it removes auth records of certain */
> +    /* cathegory from the given list and inserts them into the sorted list.
> */
> +
> +    AuthList *sorted = NULL, *sorted_tail = NULL;
> +    AuthList *prev, *iter, *next;
> +
> +    #define SORT_OUT(EXPRESSION) { \
> +	prev = NULL; \
> +	for (iter = *firstp; iter; iter = next) { \
> +	    next = iter->next; \
> +	    if (EXPRESSION) { \
> +		if (prev) \
> +		    prev->next = next; \
> +		else \
> +		    *firstp = next; \
> +		if (sorted_tail == NULL) { \
> +		    sorted = sorted_tail = iter; \
> +		} else { \
> +		    sorted_tail->next = iter; \
> +		    sorted_tail = iter; \
> +		} \
> +		iter->next = NULL; \
> +	    } else { \
> +		prev = iter; \
> +	    } \
> +	} \
> +    }
> +
> +    SORT_OUT(iter->auth->family != FamilyWild && iter->auth->number_length !=
> 0);
> +    SORT_OUT(iter->auth->family != FamilyWild && iter->auth->number_length ==
> 0);
> +    SORT_OUT(iter->auth->family == FamilyWild && iter->auth->number_length !=
> 0);
> +    SORT_OUT(iter->auth->family == FamilyWild && iter->auth->number_length ==
> 0);
> +
> +    *firstp = sorted;
> +}
> +
>  static Xauth *
>  copyAuth(Xauth *auth)
>  {
> @@ -1508,6 +1547,7 @@ do_merge(const char *inputfilename, int lineno, int
> argc, const char **argv)
>  	  printf ("%d entries read in:  %d new, %d replacement%s\n",
>  	  	  nentries, nnew, nrepl, nrepl != 1 ? "s" : "");
>  	if (nentries > 0) xauth_modified = True;
> +	sort_entries(&xauth_head);
>      }
>  
>      return 0;
> @@ -1656,6 +1696,7 @@ do_add(const char *inputfilename, int lineno, int argc,
> const char **argv)
>  	fprintf (stderr, "unable to merge in added record\n");
>  	return 1;
>      }
> +    sort_entries(&xauth_head);
>  
>      xauth_modified = True;
>      return 0;


MMh, so far i understand you do an add and then sort the whole thing.
perhaps it would be more easy to start with a sorted field and insert (add)
a key on the correct location ?

re,
 wh

> -- 
> 2.13.6
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list