1999-09-09 03:06:24 +08:00
|
|
|
/* $OpenLDAP$ */
|
1999-08-18 03:00:59 +08:00
|
|
|
/*
|
2003-01-04 04:20:47 +08:00
|
|
|
* Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
|
1999-08-18 03:00:59 +08:00
|
|
|
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
|
|
|
|
*/
|
1998-10-25 11:15:45 +08:00
|
|
|
/*
|
|
|
|
getopt.c
|
|
|
|
|
|
|
|
modified public-domain AT&T getopt(3)
|
|
|
|
modified by Kurt Zeilenga for inclusion into OpenLDAP
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "portable.h"
|
|
|
|
|
|
|
|
#ifndef HAVE_GETOPT
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include <ac/string.h>
|
|
|
|
#include <ac/unistd.h>
|
|
|
|
|
|
|
|
#ifdef HAVE_IO_H
|
|
|
|
#include <io.h>
|
|
|
|
#endif
|
|
|
|
|
2002-07-27 08:25:16 +08:00
|
|
|
#include "lutil.h"
|
|
|
|
|
1998-10-25 11:15:45 +08:00
|
|
|
#ifndef STDERR_FILENO
|
|
|
|
#define STDERR_FILENO 2
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int opterr = 1;
|
|
|
|
int optind = 1;
|
|
|
|
int optopt;
|
|
|
|
char * optarg;
|
|
|
|
|
2002-07-27 08:25:16 +08:00
|
|
|
#ifdef HAVE_EBCDIC
|
|
|
|
extern int _trans_argv;
|
|
|
|
#endif
|
|
|
|
|
1998-11-11 13:50:51 +08:00
|
|
|
static void ERR (char * const argv[], const char * s, char c)
|
1998-10-25 11:15:45 +08:00
|
|
|
{
|
|
|
|
#ifdef DF_TRACE_DEBUG
|
|
|
|
printf("DF_TRACE_DEBUG: static void ERR () in getopt.c\n");
|
|
|
|
#endif
|
|
|
|
if (opterr)
|
|
|
|
{
|
2002-07-27 08:25:16 +08:00
|
|
|
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);
|
1998-10-25 11:15:45 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-11-11 13:50:51 +08:00
|
|
|
int getopt (int argc, char * const argv [], const char * opts)
|
1998-10-25 11:15:45 +08:00
|
|
|
{
|
|
|
|
static int sp = 1, error = (int) '?';
|
|
|
|
static char sw = '-', eos = '\0', arg = ':';
|
|
|
|
register char c, * cp;
|
|
|
|
|
|
|
|
#ifdef DF_TRACE_DEBUG
|
|
|
|
printf("DF_TRACE_DEBUG: int getopt () in getopt.c\n");
|
2002-07-27 08:25:16 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_EBCDIC
|
|
|
|
if (_trans_argv) {
|
|
|
|
int i;
|
|
|
|
for (i=0; i<argc; i++) __etoa(argv[i]);
|
|
|
|
_trans_argv = 0;
|
|
|
|
}
|
1998-10-25 11:15:45 +08:00
|
|
|
#endif
|
|
|
|
if (sp == 1)
|
1999-10-28 15:18:48 +08:00
|
|
|
{
|
1998-10-25 11:15:45 +08:00
|
|
|
if (optind >= argc || argv[optind][0] != sw
|
|
|
|
|| argv[optind][1] == eos)
|
|
|
|
return EOF;
|
|
|
|
else if (strcmp(argv[optind],"--") == 0)
|
|
|
|
{
|
|
|
|
optind++;
|
|
|
|
return EOF;
|
|
|
|
}
|
1999-10-28 15:18:48 +08:00
|
|
|
}
|
1998-10-25 11:15:45 +08:00
|
|
|
c = argv[optind][sp];
|
|
|
|
optopt = (int) c;
|
|
|
|
if (c == arg || (cp = strchr(opts,c)) == NULL)
|
|
|
|
{
|
|
|
|
ERR(argv,": illegal option--",c);
|
|
|
|
if (argv[optind][++sp] == eos)
|
|
|
|
{
|
|
|
|
optind++;
|
|
|
|
sp = 1;
|
|
|
|
}
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
else if (*++cp == arg)
|
|
|
|
{
|
|
|
|
if (argv[optind][sp + 1] != eos)
|
|
|
|
optarg = &argv[optind++][sp + 1];
|
|
|
|
else if (++optind >= argc)
|
|
|
|
{
|
|
|
|
ERR(argv,": option requires an argument--",c);
|
|
|
|
sp = 1;
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
optarg = argv[optind++];
|
|
|
|
sp = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (argv[optind][++sp] == eos)
|
|
|
|
{
|
|
|
|
sp = 1;
|
|
|
|
optind++;
|
|
|
|
}
|
|
|
|
optarg = NULL;
|
|
|
|
}
|
|
|
|
return (int) c;
|
|
|
|
}
|
|
|
|
#endif /* HAVE_GETOPT */
|