Go to the documentation of this file.
13 #if defined(__LCLINT__)
15 extern long long int strtoll(
const char *nptr,
char **endptr,
38 #if !defined(HAVE_STRERROR) && !defined(__LCLINT__)
42 extern char * sys_errlist[];
44 if ((0 <= errno) && (errno < sys_nerr))
45 return sys_errlist[errno];
47 return POPT_(
"unknown errno");
53 static void prtcon(
const char *msg,
poptContext con)
55 if (msg) fprintf(stderr,
"%s", msg);
56 fprintf(stderr,
"\tcon %p os %p nextCharArg \"%s\" nextArg \"%s\" argv[%d] \"%s\"\n",
68 if (con == NULL)
return;
79 if (con == NULL || opt == NULL)
return;
103 if (con == NULL || opt == NULL)
return;
126 const void * myData,
int shorty)
133 if (con == NULL || opt == NULL)
return;
139 if (opt->
arg != NULL)
149 if (cbopt == NULL || cbarg.
cb == NULL)
155 {
const void *cbData = (cbopt->
descrip ? cbopt->
descrip : myData);
170 const struct poptOption * options,
unsigned int flags)
174 if (argc < 1)
return NULL;
176 con = malloc(
sizeof(*con));
177 if (con == NULL)
return NULL;
178 memset(con, 0,
sizeof(*con));
205 if (getenv(
"POSIXLY_CORRECT") || getenv(
"POSIX_ME_HARDER"))
230 if (con == NULL)
return;
272 for (i = con->
numExecs - 1; i >= 0; i--) {
273 item = con->
execs + i;
287 if (con->
doExec == NULL) {
328 const char *
longName,
size_t longNameLen)
331 const char * optLongName = opt->
longName;
334 if (optLongName == NULL ||
longName == NULL)
338 if (optLongName[0] ==
'n' && optLongName[1] ==
'o') {
339 optLongName +=
sizeof(
"no") - 1;
340 if (optLongName[0] ==
'-')
345 longNameLen -=
sizeof(
"no") - 1;
352 rc = (int)(strlen(optLongName) == longNameLen);
354 rc = (int)(strncmp(optLongName,
longName, longNameLen) == 0);
360 const char *
longName,
size_t longNameLen,
362 const char * nextArg)
399 if (
longName == NULL && nextArg != NULL && *nextArg !=
'\0')
411 if (
longName && nextArg != NULL && *nextArg !=
'\0') {
412 av = malloc((ac + 1 + 1) *
sizeof(*av));
414 for (i = 0; i < ac; i++) {
429 return (rc ? rc : 1);
441 char *path = NULL, *s = NULL, *se;
444 if (argv0 == NULL)
return NULL;
448 if (strchr(argv0,
'/'))
451 if ((path = getenv(
"PATH")) == NULL || (path =
xstrdup(path)) == NULL)
455 if ((t = malloc(strlen(path) + strlen(argv0) +
sizeof(
"/"))) != NULL)
456 for (s = path; s && *s; s = se) {
459 if ((se = strchr(s,
':')))
466 if (!access(t, X_OK))
472 if (!(s && *s) && t != NULL)
495 if (item->
argv == NULL || item->
argc < 1 ||
499 argv = malloc(
sizeof(*argv) *
503 if (!strchr(item->
argv[0],
'/') && con->
execPath != NULL) {
504 char *s = malloc(strlen(con->
execPath) + strlen(item->
argv[0]) +
sizeof(
"/"));
511 if (argv[argc++] == NULL) {
516 if (item->
argc > 1) {
517 memcpy(argv + argc, item->
argv + 1,
sizeof(*argv) * (item->
argc - 1));
518 argc += (item->
argc - 1);
534 #if defined(hpux) || defined(__hpux)
535 rc = setresgid(getgid(), getgid(),-1);
537 rc = setresuid(getuid(), getuid(),-1);
545 #if defined(HAVE_SETUID)
546 rc = setgid(getgid());
548 rc = setuid(getuid());
550 #elif defined (HAVE_SETREUID)
551 rc = setregid(getgid(), getgid());
553 rc = setreuid(getuid(), getuid());
563 fprintf(stderr,
"==> execvp(%s) argv[%d]:", argv[0], argc);
564 for (avp = argv; *avp; avp++)
565 fprintf(stderr,
" '%s'", *avp);
566 fprintf(stderr,
"\n");
571 rc = execvp(argv[0], (
char *
const *)argv);
577 free((
void *)argv[0]);
586 const char *
longName,
size_t longNameLen,
589 const void ** callbackData,
608 if (
arg.ptr == NULL)
continue;
611 if (opt2 == NULL)
continue;
614 if (callback && *callback
615 && callbackData && *callbackData == NULL)
644 *callback = (cb ? cbarg.
cb : NULL);
655 unsigned argx,
int delete_arg)
663 if (os == NULL || con->
optionStack == NULL)
return NULL;
670 if (os->
argv != NULL)
671 for (i = os->
next; i < os->
argc; i++) {
675 if (*os->
argv[i] ==
'-')
682 if (os->
argb != NULL)
689 }
while (arg == NULL);
699 const char * a = NULL;
701 size_t tn = strlen(s) + 1;
704 if (con == NULL)
return NULL;
707 if (t == NULL)
return NULL;
709 while ((c = *s++) !=
'\0') {
717 if (!(s[0] ==
'#' && s[1] ==
':' && s[2] ==
'+'))
724 s +=
sizeof(
"#:+") - 1;
727 {
size_t pos = (size_t) (te - t);
728 if ((t = realloc(t, tn)) == NULL)
743 if ((te = realloc(t, (
size_t)(te - t))) == NULL)
781 if (*bitsp == NULL) {
797 size_t ns = (s ? strlen(s) : 0);
801 if (bits == NULL || ns == 0)
807 uint32_t h = h0 + ns * h1;
816 size_t ns = (s ? strlen(s) : 0);
821 if (bits == NULL || ns == 0)
827 uint32_t h = h0 + ns * h1;
844 memset(bits, 0, nw * nbw);
850 size_t ns = (s ? strlen(s) : 0);
854 if (bits == NULL || ns == 0)
860 uint32_t h = h0 + ns * h1;
880 for (i = 0; i < nw; i++) {
881 abits[i] &= bbits[i];
900 for (i = 0; i < nw; i++) {
901 abits[i] |= bbits[i];
929 UNUSED(
unsigned int argInfo),
const char * s)
935 if (bitsp == NULL || s == NULL || *s ==
'\0' ||
_poptBitsNew(bitsp))
940 while ((t = te) != NULL && *t) {
941 while (*te !=
'\0' && *te !=
',')
964 UNUSED(
unsigned int argInfo),
const char * val)
968 if (argvp == NULL || val == NULL)
973 while ((*argvp)[
argc] != NULL)
977 if ((*argvp =
xrealloc(*argvp, (
argc + 1 + 1) *
sizeof(**argvp))) != NULL) {
979 (*argvp)[
argc ] = NULL;
993 || (((
unsigned long long)arg) & (
sizeof(*arg)-1))
998 if (aLongLong != 0 &&
LF_ISSET(RANDOM)) {
999 #if defined(HAVE_SRANDOM)
1001 srandom((
unsigned)getpid());
1002 srandom((
unsigned)random());
1004 aLongLong = (
long long)(random() % (aLongLong > 0 ? aLongLong : -aLongLong));
1012 aLongLong = ~aLongLong;
1018 *(
unsigned long long *)arg |= (
unsigned long long)aLongLong;
1021 *(
unsigned long long *)arg &= (
unsigned long long)aLongLong;
1024 *(
unsigned long long *)arg ^= (
unsigned long long)aLongLong;
1036 if (arg == NULL || (((
unsigned long)arg) & (
sizeof(*arg)-1)))
1039 if (aLong != 0 &&
LF_ISSET(RANDOM)) {
1040 #if defined(HAVE_SRANDOM)
1042 srandom((
unsigned)getpid());
1043 srandom((
unsigned)random());
1045 aLong = random() % (aLong > 0 ? aLong : -aLong);
1055 case 0: *arg = aLong;
break;
1056 case POPT_ARGFLAG_OR: *(
unsigned long *)arg |= (
unsigned long)aLong;
break;
1057 case POPT_ARGFLAG_AND: *(
unsigned long *)arg &= (
unsigned long)aLong;
break;
1058 case POPT_ARGFLAG_XOR: *(
unsigned long *)arg ^= (
unsigned long)aLong;
break;
1069 if (arg == NULL || (((
unsigned long)arg) & (
sizeof(*arg)-1)))
1072 if (aLong != 0 &&
LF_ISSET(RANDOM)) {
1073 #if defined(HAVE_SRANDOM)
1075 srandom((
unsigned)getpid());
1076 srandom((
unsigned)random());
1078 aLong = random() % (aLong > 0 ? aLong : -aLong);
1088 case 0: *arg = (int) aLong;
break;
1089 case POPT_ARGFLAG_OR: *(
unsigned int *)arg |= (
unsigned int) aLong;
break;
1090 case POPT_ARGFLAG_AND: *(
unsigned int *)arg &= (
unsigned int) aLong;
break;
1091 case POPT_ARGFLAG_XOR: *(
unsigned int *)arg ^= (
unsigned int) aLong;
break;
1102 if (arg == NULL || (((
unsigned long)arg) & (
sizeof(*arg)-1)))
1105 if (aLong != 0 &&
LF_ISSET(RANDOM)) {
1106 #if defined(HAVE_SRANDOM)
1108 srandom((
unsigned)getpid());
1109 srandom((
unsigned)random());
1111 aLong = random() % (aLong > 0 ? aLong : -aLong);
1121 case 0: *arg = (short) aLong;
1123 case POPT_ARGFLAG_OR: *(
unsigned short *)arg |= (
unsigned short) aLong;
1144 unsigned int argInfo = opt->
argInfo;
1148 const char * longName = con->
os->
argv[con->
os->
next-1];
1149 while (*longName ==
'-') longName++;
1172 UNUSED(
unsigned int argInfo),
1178 *llp = strtoll(val, &end, 0);
1182 if (!(end && *end ==
'\0'))
1229 #if !defined(LLONG_MAX)
1230 # define LLONG_MAX 9223372036854775807LL
1231 # define LLONG_MIN (-LLONG_MAX - 1LL)
1238 rc = !(aNUM < (long long)LONG_MIN || aNUM > (
long long)LONG_MAX)
1243 rc = !(aNUM < (long long)INT_MIN || aNUM > (
long long)INT_MAX)
1248 rc = !(aNUM < (long long)SHRT_MIN || aNUM > (
long long)SHRT_MAX)
1258 double aDouble = 0.0;
1262 int saveerrno = errno;
1264 aDouble = strtod(con->
os->
nextArg, &end);
1265 if (errno == ERANGE) {
1282 #if !defined(DBL_EPSILON) && !defined(__LCLINT__)
1283 #define DBL_EPSILON 2.2204460492503131e-16
1285 #define POPT_ABS(a) ((((a) - 0.0) < DBL_EPSILON) ? -(a) : (a))
1290 arg.
floatp[0] = (float) aDouble;
1300 fprintf(stdout,
POPT_(
"option type (%u) not implemented in popt\n"),
1317 const char * origOptString = NULL;
1319 const void * cbData = NULL;
1320 const char * longArg = NULL;
1344 const char * optString;
1345 size_t optStringLen;
1355 if (con->
os->
argv != NULL)
1358 if (origOptString == NULL)
1362 (*origOptString ==
'-' && origOptString[1] ==
'\0'))
1376 optString = origOptString;
1378 if (optString[0] ==
'\0')
1381 if (optString[1] ==
'-' && !optString[2]) {
1389 if (*optString ==
'-')
1395 for (oe = optString; *oe && *oe !=
'='; oe++)
1397 optStringLen = (size_t)(oe - optString);
1402 if (
handleAlias(con, optString, optStringLen,
'\0', longArg)) {
1435 if (
handleAlias(con, NULL, 0, *nextCharArg, nextCharArg + 1))
1441 if (*nextCharArg !=
'\0')
1453 if (*nextCharArg !=
'\0')
1454 con->
os->
nextCharArg = nextCharArg + (int)(*nextCharArg ==
'=');
1496 &&
F_ISSET(opt, STRIP) && canstrip)
1501 if (con->
os->
argv != NULL) {
1534 {
char *s = malloc((opt->
longName ? strlen(opt->
longName) : 0) +
sizeof(
"--"));
1561 return (opt ? opt->
val : -1);
1576 const char * ret = NULL;
1584 const char * ret = NULL;
1608 if (items != NULL) {
1610 while (--nitems >= 0) {
1619 items =
_free(items);
1626 if (con == NULL)
return con;
1653 if (con == NULL)
return 1;
1655 memset(item, 0,
sizeof(*item));
1656 item->option.longName = alias.
longName;
1657 item->option.shortName = alias.
shortName;
1659 item->option.arg = 0;
1660 item->option.val = 0;
1661 item->option.descrip = NULL;
1662 item->option.argDescrip = NULL;
1663 item->argc = alias.
argc;
1664 item->argv = alias.
argv;
1673 if (con == NULL)
return 1;
1677 items = &con->
execs;
1689 *items = realloc((*items), ((*nitems) + 1) *
sizeof(**items));
1690 if ((*items) == NULL)
1693 item = (*items) + (*nitems);
1734 return POPT_(
"missing argument");
1736 return POPT_(
"unknown option");
1738 return POPT_(
"mutually exclusive logical operations requested");
1740 return POPT_(
"opt->arg should not be NULL");
1742 return POPT_(
"aliases nested too deeply");
1744 return POPT_(
"error in parameter quoting");
1746 return POPT_(
"invalid numeric value");
1748 return POPT_(
"number too large or too small");
1750 return POPT_(
"memory allocation failed");
1752 return POPT_(
"config file failed sanity test");
1756 return POPT_(
"no context");
1758 return POPT_(
"unknown error");
1790 return ((con && con->
os->
argv) ? con->
os->
argv[0] :
"");
1801 for (i = 1; i <
argc; i++) {
1806 for (i = 1; i <
argc; i++) {
1809 argv[j] = (j < numargs) ?
argv[i] : NULL;
int poptBitsArgs(poptContext con, poptBits *ap)
char * poptGetOptArg(poptContext con)
#define POPT_OPTION_DEPTH
#define poptSubstituteHelpI18N(opt)
#define POPT_ARG_INCLUDE_TABLE
static char * stpcpy(char *dest, const char *src)
#define POPT_ERROR_OPTSTOODEEP
@ POPT_CALLBACK_REASON_PRE
int poptBitsUnion(poptBits *ap, const poptBits b)
static const char * findProgramPath(const char *argv0)
Return absolute path to executable by searching PATH.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static const char * findNextArg(poptContext con, unsigned argx, int delete_arg)
int poptSaveInt(int *arg, unsigned int argInfo, long aLong)
Save an integer, performing logical operation with value.
#define POPT_CONTEXT_POSIXMEHARDER
static int _poptBitsNew(poptBits *bitsp)
#define POPT_ARG_MAINCALL
poptContext poptFreeContext(poptContext con)
static int poptParseInteger(long long *llp, unsigned int argInfo, const char *val)
Parse an integer expression.
#define POPT_ERROR_NULLARG
void poptResetContext(poptContext con)
#define poptArgType(_opt)
static poptItem poptFreeItems(poptItem items, int nitems)
#define POPT_ERROR_BADOPT
int poptBitsClr(poptBits bits)
void(* poptCallbackType)(poptContext con, enum poptCallbackReason reason, const struct poptOption *opt, const char *arg, const void *data)
int poptAddAlias(poptContext con, struct poptAlias alias, int flags)
static void invokeCallbacksOPTION(poptContext con, const struct poptOption *opt, const struct poptOption *myOpt, const void *myData, int shorty)
static const char * expandNextArg(poptContext con, const char *s)
int poptStrippedArgv(poptContext con, int argc, char **argv)
#define POPT_CONTEXT_ARG_OPTS
int poptBitsIntersect(poptBits *ap, const poptBits b)
static const struct poptOption * findOption(const struct poptOption *opt, const char *longName, size_t longNameLen, char shortName, poptCallbackType *callback, const void **callbackData, unsigned int argInfo)
int poptDupArgv(int argc, const char **argv, int *argcPtr, const char ***argvPtr)
#define POPT_ARGFLAG_ONEDASH
@ POPT_CALLBACK_REASON_OPTION
static unsigned int poptArgInfo(poptContext con, const struct poptOption *opt)
Return argInfo field, handling POPT_ARGFLAG_TOGGLE overrides.
void * xrealloc(void *ptr, size_t size)
#define POPT_ARGFLAG_DOC_HIDDEN
int poptStuffArgs(poptContext con, const char **argv)
#define POPT_ERROR_OVERFLOW
#define CBF_ISSET(_opt, _FLAG)
@ POPT_CALLBACK_REASON_POST
#define POPT_ARG_CALLBACK
int poptSaveLongLong(long long *arg, unsigned int argInfo, long long aLongLong)
Save a long long, performing logical operation with value.
#define F_ISSET(_opt, _FLAG)
#define POPT_CONTEXT_NO_EXEC
#define POPT_ARG_LONGLONG
static char * strerror(int errno)
#define POPT_ERROR_NOCONTEXT
#define POPT_BADOPTION_NOALIAS
int poptBitsDel(poptBits bits, const char *s)
int(* maincall)(int argc, const char **argv)
int poptBitsAdd(poptBits bits, const char *s)
struct optionStackEntry * os
static void invokeCallbacksPRE(poptContext con, const struct poptOption *opt)
int poptSaveString(const char ***argvp, unsigned int argInfo, const char *val)
Add a string to an argv array.
static int handleAlias(poptContext con, const char *longName, size_t longNameLen, char shortName, const char *nextArg)
unsigned int _poptArgMask
const char ** poptGetArgs(poptContext con)
const char * poptGetArg(poptContext con)
static int execCommand(poptContext con)
#define POPT_ERROR_BADCONFIG
#define POPT_ERROR_BADOPERATION
int poptAddItem(poptContext con, poptItem newItem, int flags)
int poptSaveBits(poptBits *bitsp, unsigned int argInfo, const char *s)
Save a string into a bit set (experimental).
int poptSaveLong(long *arg, unsigned int argInfo, long aLong)
Save a long, performing logical operation with value.
static void cleanOSE(struct optionStackEntry *os)
#define POPT_CONTEXT_KEEP_FIRST
static int poptSaveArg(poptContext con, const struct poptOption *opt)
Save the option argument through the (*opt->arg) pointer.
void poptSetExecPath(poptContext con, const char *path, int allowAbsolute)
void poptJlu32lpair(const void *key, size_t size, uint32_t *pc, uint32_t *pb)
#define POPT_ERROR_BADNUMBER
struct optionStackEntry optionStack[POPT_OPTION_DEPTH]
static void invokeCallbacksPOST(poptContext con, const struct poptOption *opt)
int poptSaveShort(short *arg, unsigned int argInfo, long aLong)
Save a short integer, performing logical operation with value.
#define POPT_ERROR_MALLOC
poptContext poptGetContext(const char *name, int argc, const char **argv, const struct poptOption *options, unsigned int flags)
const char * poptGetInvocationName(poptContext con)
const struct poptOption * options
const char * poptStrerror(const int error)
static int handleExec(poptContext con, const char *longName, char shortName)
const char * poptPeekArg(poptContext con)
int poptGetNextOpt(poptContext con)
const char * poptBadOption(poptContext con, unsigned int flags)
char * xstrdup(const char *str)
int poptBitsChk(poptBits bits, const char *s)
static void poptStripArg(poptContext con, int which)
#define POPT_ERROR_BADQUOTE
static int longOptionStrcmp(const struct poptOption *opt, const char *longName, size_t longNameLen)
Compare long option for equality, adjusting for POPT_ARGFLAG_TOGGLE.
unsigned int _poptGroupMask
Generated for popt by
1.8.17