X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fgetopt.c;h=5e4e02273c3c9ac327666da239a6289246bfeac9;hb=f2a02b90edde2dbecb342f040603ffac72d99c36;hp=2294dcf519dfc69cbf7ab741ddfb8c002de82b45;hpb=e4f6d548773d1a79d9ca6fa82b6c486fbdc0c47b;p=openldap
diff --git a/libraries/liblutil/getopt.c b/libraries/liblutil/getopt.c
index 2294dcf519..5e4e02273c 100644
--- a/libraries/liblutil/getopt.c
+++ b/libraries/liblutil/getopt.c
@@ -1,13 +1,24 @@
-/*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* getopt.c -- replacement getopt(3) routines */
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software .
+ *
+ * Copyright 1998-2007 The OpenLDAP Foundation.
+ * Portions Copyright 1998-2003 Kurt D. Zeilenga.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * .
+ */
+/* This work is based upon the public-domain getopt(3) routines
+ * developed by AT&T. Modified by Kurt D. Zeilenga for inclusion
+ * into OpenLDAP Software. Significant contributors include:
+ * Howard Chu
*/
-/*
- getopt.c
-
- modified public-domain AT&T getopt(3)
- modified by Kurt Zeilenga for inclusion into OpenLDAP
-*/
#include "portable.h"
@@ -22,6 +33,8 @@
#include
#endif
+#include "lutil.h"
+
#ifndef STDERR_FILENO
#define STDERR_FILENO 2
#endif
@@ -31,20 +44,27 @@ int optind = 1;
int optopt;
char * optarg;
+#ifdef HAVE_EBCDIC
+extern int _trans_argv;
+#endif
+
static void ERR (char * const argv[], const char * s, char c)
{
- char errbuf[2];
-
#ifdef DF_TRACE_DEBUG
printf("DF_TRACE_DEBUG: static void ERR () in getopt.c\n");
#endif
if (opterr)
{
- errbuf[0] = c;
- errbuf[1] = '\n';
- (void) write(STDERR_FILENO,argv[0],strlen(argv[0]));
- (void) write(STDERR_FILENO,s,strlen(s));
- (void) write(STDERR_FILENO,errbuf,sizeof errbuf);
+ char *ptr, outbuf[4096];
+
+ ptr = lutil_strncopy(outbuf, argv[0], sizeof(outbuf) - 2);
+ ptr = lutil_strncopy(ptr, s, sizeof(outbuf)-2 -(ptr-outbuf));
+ *ptr++ = c;
+ *ptr++ = '\n';
+#ifdef HAVE_EBCDIC
+ __atoe_l(outbuf, ptr - outbuf);
+#endif
+ (void) write(STDERR_FILENO,outbuf,ptr - outbuf);
}
}
@@ -56,8 +76,17 @@ int getopt (int argc, char * const argv [], const char * opts)
#ifdef DF_TRACE_DEBUG
printf("DF_TRACE_DEBUG: int getopt () in getopt.c\n");
+#endif
+
+#ifdef HAVE_EBCDIC
+ if (_trans_argv) {
+ int i;
+ for (i=0; i= argc || argv[optind][0] != sw
|| argv[optind][1] == eos)
return EOF;
@@ -66,11 +95,12 @@ printf("DF_TRACE_DEBUG: int getopt () in getopt.c\n");
optind++;
return EOF;
}
+ }
c = argv[optind][sp];
optopt = (int) c;
if (c == arg || (cp = strchr(opts,c)) == NULL)
{
- ERR(argv,": illegal option--",c);
+ ERR(argv,_(": illegal option--"),c);
if (argv[optind][++sp] == eos)
{
optind++;
@@ -84,7 +114,7 @@ printf("DF_TRACE_DEBUG: int getopt () in getopt.c\n");
optarg = &argv[optind++][sp + 1];
else if (++optind >= argc)
{
- ERR(argv,": option requires an argument--",c);
+ ERR(argv,_(": option requires an argument--"),c);
sp = 1;
return error;
}