summaryrefslogtreecommitdiff
path: root/usr/src/lib/krb5/ss/parse.c
diff options
context:
space:
mode:
author <Mark.Phalan@Sun.COM>2008-11-05 10:43:38 +0100
committer <Mark.Phalan@Sun.COM>2008-11-05 10:43:38 +0100
commit6d0847464d3fec218788a8cefc60dc6947328332 (patch)
tree649cd4a0d28e33c65cfc223a2a5b484fbd914507 /usr/src/lib/krb5/ss/parse.c
parentdd9ccd46893ed9c4247368a00a0253d45a26311c (diff)
downloadillumos-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.c45
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);
}