diff options
| author | <Mark.Phalan@Sun.COM> | 2008-11-05 10:43:38 +0100 | 
|---|---|---|
| committer | <Mark.Phalan@Sun.COM> | 2008-11-05 10:43:38 +0100 | 
| commit | 6d0847464d3fec218788a8cefc60dc6947328332 (patch) | |
| tree | 649cd4a0d28e33c65cfc223a2a5b484fbd914507 /usr/src/lib/krb5/ss/parse.c | |
| parent | dd9ccd46893ed9c4247368a00a0253d45a26311c (diff) | |
| download | illumos-gate-6d0847464d3fec218788a8cefc60dc6947328332.tar.gz | |
5047971 kadmin could use libtecla for enhanced command history and editing
Diffstat (limited to 'usr/src/lib/krb5/ss/parse.c')
| -rw-r--r-- | usr/src/lib/krb5/ss/parse.c | 45 | 
1 files changed, 34 insertions, 11 deletions
| diff --git a/usr/src/lib/krb5/ss/parse.c b/usr/src/lib/krb5/ss/parse.c index 9edb3ffe37..fa0dbb989c 100644 --- a/usr/src/lib/krb5/ss/parse.c +++ b/usr/src/lib/krb5/ss/parse.c @@ -1,17 +1,32 @@ -#pragma ident	"%Z%%M%	%I%	%E% SMI" -  /*   * Copyright 1987, 1988 by MIT Student Information Processing Board   *   * For copyright info, see copyright.h.   */ +/* + * Copyright 2008 Sun Microsystems, Inc.  All rights reserved. + * Use is subject to license terms. + */ +  #include "ss_internal.h"  #include "copyright.h"  #include <errno.h>  enum parse_mode { WHITESPACE, TOKEN, QUOTED_STRING }; + +/* + * Solaris Kerberos: + * ss_parse has been modified slightly from the original in two ways. + * 1) A new parameter "quiet" has been added which is used to silence + *    error or warning messages. + * 2) ss_parse now returns an error status instead of argv - this is to + *    allow an error to be distinguished from no tokens when parsing an empty + *    string. + * Both of these changes allow ss_parse to be used during tab-completion. + */ +  /*   * parse(line_ptr, argc_ptr)   * @@ -23,18 +38,21 @@ enum parse_mode { WHITESPACE, TOKEN, QUOTED_STRING };   *              Pointer to text string to be parsed.   *      argc_ptr (int *)   *              Where to put the "argc" (number of tokens) value. + *      argv_ptr (char ***) + *              Where to put the series of pointers to parsed tokens.   * Returns: - *      argv (char **) - *              Series of pointers to parsed tokens. + *      error (0 - success, non-zero on failure)   */  #define NEW_ARGV(old,n) (char **)realloc((char *)old,\  					 (unsigned)(n+2)*sizeof(char*)) -char **ss_parse (sci_idx, line_ptr, argc_ptr) +int ss_parse (sci_idx, line_ptr, argc_ptr, argv_ptr, quiet)      int sci_idx;      register char *line_ptr;      int *argc_ptr; +    char ***argv_ptr; +    int quiet;  {      register char **argv, *cp;      register int argc; @@ -42,9 +60,11 @@ char **ss_parse (sci_idx, line_ptr, argc_ptr)      argv = (char **) malloc (sizeof(char *));      if (argv == (char **)NULL) { -	ss_error(sci_idx, errno, "Can't allocate storage"); +	if (!quiet) +	    ss_error(sci_idx, errno, "Can't allocate storage");  	*argc_ptr = 0; -	return(argv); +	*argv_ptr = argv; +	return(ENOMEM);      }      *argv = (char *)NULL; @@ -102,11 +122,13 @@ char **ss_parse (sci_idx, line_ptr, argc_ptr)  	}  	while (parse_mode == QUOTED_STRING) {  	    if (*line_ptr == '\0') { -		ss_error (sci_idx, 0, -			  "Unbalanced quotes in command line"); +		if (!quiet) +		    ss_error (sci_idx, 0, +			"Unbalanced quotes in command line");  		free (argv);  		*argc_ptr = 0; -		return NULL; +		*argv_ptr = NULL; +		return (-1);  	    }  	    else if (*line_ptr == '"') {  		if (*++line_ptr == '"') { @@ -133,5 +155,6 @@ end_of_line:  		    argv[i] ? argv[i] : "<NULL>");      }  #endif -    return(argv); +    *argv_ptr = argv; +    return(0);  } | 
