1999-07-21 Norbert Warmuth <nwarmuth@privat.circular.de>
* popt.c, popt.h, poptconfig.c, popthelp.c, poptparse.c: updated to the version found in the popt module * features.inc: added report information for smbfs
Этот коммит содержится в:
родитель
fe6823576a
Коммит
4f5d4908f2
@ -1,3 +1,10 @@
|
||||
1999-07-21 Norbert Warmuth <nwarmuth@privat.circular.de>
|
||||
|
||||
* popt.c, popt.h, poptconfig.c, popthelp.c, poptparse.c: updated
|
||||
to the version found in the popt module
|
||||
|
||||
* features.inc: added report information for smbfs
|
||||
|
||||
1999-06-01 Robert Brady <rwb197@ecs.soton.ac.uk>
|
||||
|
||||
* file.c (move_dir_dir): Give an error when an attempt is made to
|
||||
|
@ -31,6 +31,9 @@ char *features =
|
||||
# ifdef USE_TERMNET
|
||||
" (with termnet support)"
|
||||
# endif
|
||||
# ifdef WITH_SMBFS
|
||||
", smbfs"
|
||||
# endif
|
||||
#endif
|
||||
#ifdef USE_EXT2FSLIB
|
||||
", undelfs"
|
||||
|
63
src/popt.c
63
src/popt.c
@ -41,20 +41,18 @@ void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) {
|
||||
con->execAbsolute = allowAbsolute;
|
||||
}
|
||||
|
||||
static void invokeCallbacks(poptContext con,
|
||||
enum poptCallbackReason reason,
|
||||
const struct poptOption * table,
|
||||
static void invokeCallbacks(poptContext con, const struct poptOption * table,
|
||||
int post) {
|
||||
const struct poptOption * opt = table;
|
||||
poptCallbackType cb;
|
||||
|
||||
while (opt->longName || opt->shortName || opt->arg) {
|
||||
if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
|
||||
invokeCallbacks(con, 0, opt->arg, post);
|
||||
invokeCallbacks(con, opt->arg, post);
|
||||
} else if (((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) &&
|
||||
((!post && (opt->argInfo & POPT_CBFLAG_PRE)) ||
|
||||
( post && (opt->argInfo & POPT_CBFLAG_POST)))) {
|
||||
cb = opt->arg;
|
||||
cb = (poptCallbackType)opt->arg;
|
||||
cb(con, post ? POPT_CALLBACK_REASON_POST : POPT_CALLBACK_REASON_PRE,
|
||||
NULL, NULL, opt->descrip);
|
||||
}
|
||||
@ -88,12 +86,14 @@ poptContext poptGetContext(char * name, int argc, char ** argv,
|
||||
if (name)
|
||||
con->appName = strcpy(malloc(strlen(name) + 1), name);
|
||||
|
||||
invokeCallbacks(con, 0, con->options, 0);
|
||||
invokeCallbacks(con, con->options, 0);
|
||||
|
||||
return con;
|
||||
}
|
||||
|
||||
void poptResetContext(poptContext con) {
|
||||
int i;
|
||||
|
||||
con->os = con->optionStack;
|
||||
con->os->currAlias = NULL;
|
||||
con->os->nextCharArg = NULL;
|
||||
@ -104,6 +104,10 @@ void poptResetContext(poptContext con) {
|
||||
con->nextLeftover = 0;
|
||||
con->restLeftover = 0;
|
||||
con->doExec = NULL;
|
||||
|
||||
for (i = 0; i < con->finalArgvCount; i++)
|
||||
free(con->finalArgv[i]);
|
||||
|
||||
con->finalArgvCount = 0;
|
||||
}
|
||||
|
||||
@ -156,7 +160,8 @@ static int handleAlias(poptContext con, char * longName, char shortName,
|
||||
if (con->os->currAlias && con->os->currAlias->longName && longName &&
|
||||
!strcmp(con->os->currAlias->longName, longName))
|
||||
return 0;
|
||||
if (con->os->currAlias && shortName == con->os->currAlias->shortName)
|
||||
if (con->os->currAlias && shortName &&
|
||||
shortName == con->os->currAlias->shortName)
|
||||
return 0;
|
||||
|
||||
i = con->numAliases - 1;
|
||||
@ -224,15 +229,17 @@ static void execCommand(poptContext con) {
|
||||
#ifdef __hpux
|
||||
setresuid(getuid(), getuid(),-1);
|
||||
#else
|
||||
#ifndef OS2_NT
|
||||
# if defined (HAVE_SETUID)
|
||||
setuid(getuid());
|
||||
# elif defined (HAVE_SETREUID)
|
||||
setreuid(getuid(), getuid()); /*hlauer: not portable to hpux9.01 */
|
||||
# else
|
||||
; /* Can't drop privileges */
|
||||
# endif
|
||||
|
||||
/*
|
||||
* XXX " ... on BSD systems setuid() should be preferred over setreuid()"
|
||||
* XXX sez' Timur Bakeyev <mc@bat.ru>
|
||||
* XXX from Norbert Warmuth <nwarmuth@privat.circular.de>
|
||||
*/
|
||||
#if defined(HAVE_SETUID)
|
||||
setuid(getuid());
|
||||
#elif defined (HAVE_SETREUID)
|
||||
setreuid(getuid(), getuid()); /*hlauer: not portable to hpux9.01 */
|
||||
#else
|
||||
; /* Can't drop privileges */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -241,7 +248,7 @@ static void execCommand(poptContext con) {
|
||||
|
||||
static const struct poptOption * findOption(const struct poptOption * table,
|
||||
const char * longName,
|
||||
const char shortName,
|
||||
char shortName,
|
||||
poptCallbackType * callback,
|
||||
void ** callbackData,
|
||||
int singleDash) {
|
||||
@ -249,6 +256,10 @@ static const struct poptOption * findOption(const struct poptOption * table,
|
||||
const struct poptOption * opt2;
|
||||
const struct poptOption * cb = NULL;
|
||||
|
||||
/* This happens when a single - is given */
|
||||
if (singleDash && !shortName && !*longName)
|
||||
shortName = '-';
|
||||
|
||||
while (opt->longName || opt->shortName || opt->arg) {
|
||||
if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
|
||||
opt2 = findOption(opt->arg, longName, shortName, callback,
|
||||
@ -274,7 +285,7 @@ static const struct poptOption * findOption(const struct poptOption * table,
|
||||
*callbackData = NULL;
|
||||
*callback = NULL;
|
||||
if (cb) {
|
||||
*callback = cb->arg;
|
||||
*callback = (poptCallbackType)cb->arg;
|
||||
if (!(cb->argInfo & POPT_CBFLAG_INC_DATA))
|
||||
*callbackData = cb->descrip;
|
||||
}
|
||||
@ -301,7 +312,7 @@ int poptGetNextOpt(poptContext con) {
|
||||
&& con->os > con->optionStack)
|
||||
con->os--;
|
||||
if (!con->os->nextCharArg && con->os->next == con->os->argc) {
|
||||
invokeCallbacks(con, 0, con->options, 1);
|
||||
invokeCallbacks(con, con->options, 1);
|
||||
if (con->doExec) execCommand(con);
|
||||
return -1;
|
||||
}
|
||||
@ -378,9 +389,11 @@ int poptGetNextOpt(poptContext con) {
|
||||
con->os->nextCharArg = origOptString;
|
||||
}
|
||||
|
||||
if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE)
|
||||
if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) {
|
||||
*((int *)opt->arg) = 1;
|
||||
else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) {
|
||||
} else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_VAL) {
|
||||
if (opt->arg) *((int *) opt->arg) = opt->val;
|
||||
} else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) {
|
||||
if (longArg) {
|
||||
con->os->nextArg = longArg;
|
||||
} else if (con->os->nextCharArg) {
|
||||
@ -405,7 +418,7 @@ int poptGetNextOpt(poptContext con) {
|
||||
case POPT_ARG_INT:
|
||||
case POPT_ARG_LONG:
|
||||
aLong = strtol(con->os->nextArg, &end, 0);
|
||||
if (*end)
|
||||
if (!(end && *end == '\0'))
|
||||
return POPT_ERROR_BADNUMBER;
|
||||
|
||||
if (aLong == LONG_MIN || aLong == LONG_MAX)
|
||||
@ -429,7 +442,7 @@ int poptGetNextOpt(poptContext con) {
|
||||
|
||||
if (cb)
|
||||
cb(con, POPT_CALLBACK_REASON_OPTION, opt, con->os->nextArg, cbData);
|
||||
else if (opt->val)
|
||||
else if (opt->val && ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_VAL))
|
||||
done = 1;
|
||||
|
||||
if ((con->finalArgvCount + 2) >= (con->finalArgvAlloced)) {
|
||||
@ -446,7 +459,8 @@ int poptGetNextOpt(poptContext con) {
|
||||
else
|
||||
sprintf(con->finalArgv[i], "-%c", opt->shortName);
|
||||
|
||||
if (opt->arg && (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE)
|
||||
if (opt->arg && (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE
|
||||
&& (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_VAL)
|
||||
con->finalArgv[con->finalArgvCount++] = strdup(con->os->nextArg);
|
||||
}
|
||||
|
||||
@ -499,6 +513,7 @@ void poptFreeContext(poptContext con) {
|
||||
if (con->appName) free(con->appName);
|
||||
if (con->aliases) free(con->aliases);
|
||||
if (con->otherHelp) free(con->otherHelp);
|
||||
if (con->execPath) free(con->execPath);
|
||||
free(con);
|
||||
}
|
||||
|
||||
|
11
src/popt.h
11
src/popt.h
@ -5,6 +5,10 @@
|
||||
#ifndef H_POPT
|
||||
#define H_POPT
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdio.h> /* for FILE * */
|
||||
|
||||
#define POPT_OPTION_DEPTH 10
|
||||
@ -22,6 +26,7 @@
|
||||
for this table and any
|
||||
included tables; arg points
|
||||
to the domain string */
|
||||
#define POPT_ARG_VAL 7 /* arg should take value val */
|
||||
#define POPT_ARG_MASK 0x0000FFFF
|
||||
#define POPT_ARGFLAG_ONEDASH 0x80000000 /* allow -longoption */
|
||||
#define POPT_ARGFLAG_DOC_HIDDEN 0x40000000 /* don't show in help/usage */
|
||||
@ -103,7 +108,7 @@ int poptReadConfigFile(poptContext con, char * fn);
|
||||
int poptReadDefaultConfig(poptContext con, int useEnv);
|
||||
/* argv should be freed -- this allows ', ", and \ quoting, but ' is treated
|
||||
the same as " and both may include \ quotes */
|
||||
int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr);
|
||||
int poptParseArgvString(const char * s, int * argcPtr, char *** argvPtr);
|
||||
const char * poptStrerror(const int error);
|
||||
void poptSetExecPath(poptContext con, const char * path, int allowAbsolute);
|
||||
void poptPrintHelp(poptContext con, FILE * f, int flags);
|
||||
@ -111,4 +116,8 @@ void poptPrintUsage(poptContext con, FILE * f, int flags);
|
||||
void poptSetOtherOptionHelp(poptContext con, const char * text);
|
||||
const char * poptGetInvocationName(poptContext con);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -87,7 +87,7 @@ int poptReadConfigFile(poptContext con, char * fn) {
|
||||
lseek(fd, 0, 0);
|
||||
|
||||
file = alloca(fileLength + 1);
|
||||
if ((fd = read(fd, file, fileLength)) != fileLength) {
|
||||
if (read(fd, file, fileLength) != fileLength) {
|
||||
rc = errno;
|
||||
close(fd);
|
||||
errno = rc;
|
||||
|
@ -13,6 +13,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
#include <alloca.h>
|
||||
#endif
|
||||
|
||||
#include "popt.h"
|
||||
#include "poptint.h"
|
||||
|
||||
@ -27,7 +31,7 @@ static void displayArgs(poptContext con, enum poptCallbackReason foo,
|
||||
}
|
||||
|
||||
struct poptOption poptHelpOptions[] = {
|
||||
{ NULL, '\0', POPT_ARG_CALLBACK, &displayArgs, '\0', NULL },
|
||||
{ NULL, '\0', POPT_ARG_CALLBACK, (void *)&displayArgs, '\0', NULL },
|
||||
{ "help", '?', 0, NULL, '?', N_("Show this help message") },
|
||||
{ "usage", '\0', 0, NULL, 'u', N_("Display brief usage message") },
|
||||
{ NULL, '\0', 0, NULL, 0 }
|
||||
@ -69,10 +73,12 @@ static void singleOptionHelp(FILE * f, int maxLeftCol,
|
||||
int helpLength;
|
||||
const char * ch;
|
||||
char format[10];
|
||||
char * left = alloca(maxLeftCol + 1);
|
||||
char * left;
|
||||
const char * argDescrip = getArgDescrip(opt, translation_domain);
|
||||
|
||||
left = malloc(maxLeftCol + 1);
|
||||
*left = '\0';
|
||||
|
||||
if (opt->longName && opt->shortName)
|
||||
sprintf(left, "-%c, --%s", opt->shortName, opt->longName);
|
||||
else if (opt->shortName)
|
||||
@ -89,7 +95,7 @@ static void singleOptionHelp(FILE * f, int maxLeftCol,
|
||||
fprintf(f," %-*s ", maxLeftCol, left);
|
||||
else {
|
||||
fprintf(f," %s\n", left);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
helpLength = strlen(help);
|
||||
@ -108,6 +114,9 @@ static void singleOptionHelp(FILE * f, int maxLeftCol,
|
||||
}
|
||||
|
||||
if (helpLength) fprintf(f, "%s\n", help);
|
||||
|
||||
out:
|
||||
free(left);
|
||||
}
|
||||
|
||||
static int maxArgWidth(const struct poptOption * opt,
|
||||
@ -233,7 +242,7 @@ static int singleOptionUsage(FILE * f, int cursor,
|
||||
return cursor + len + 1;
|
||||
}
|
||||
|
||||
int singleTableUsage(FILE * f, int cursor, const struct poptOption * table,
|
||||
static int singleTableUsage(FILE * f, int cursor, const struct poptOption * table,
|
||||
const char *translation_domain) {
|
||||
const struct poptOption * opt;
|
||||
|
||||
@ -261,7 +270,7 @@ static int showShortOptions(const struct poptOption * opt, FILE * f,
|
||||
|
||||
if (!str) {
|
||||
str = s;
|
||||
memset(str, 0, sizeof(str));
|
||||
memset(str, 0, sizeof(s));
|
||||
}
|
||||
|
||||
while (opt->longName || opt->shortName || opt->arg) {
|
||||
|
@ -10,25 +10,44 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* AIX requires this to be the first thing in the file. */
|
||||
#ifndef __GNUC__
|
||||
# if HAVE_ALLOCA_H
|
||||
# include <alloca.h>
|
||||
# else
|
||||
# ifdef _AIX
|
||||
#pragma alloca
|
||||
# else
|
||||
# ifndef alloca /* predefined by HP cc +Olibcalls */
|
||||
char *alloca ();
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
#elif defined(__GNUC__) && defined(__STRICT_ANSI__)
|
||||
#define alloca __builtin_alloca
|
||||
#endif
|
||||
|
||||
#include "popt.h"
|
||||
|
||||
int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr) {
|
||||
char * buf = strcpy(alloca(strlen(s) + 1), s);
|
||||
char * bufStart = buf;
|
||||
char * src, * dst;
|
||||
#define POPT_ARGV_ARRAY_GROW_DELTA 5
|
||||
|
||||
int poptParseArgvString(const char * s, int * argcPtr, char *** argvPtr) {
|
||||
char * buf, * bufStart, * dst;
|
||||
const char * src;
|
||||
char quote = '\0';
|
||||
int argvAlloced = 5;
|
||||
int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA;
|
||||
char ** argv = malloc(sizeof(*argv) * argvAlloced);
|
||||
char ** argv2;
|
||||
int argc = 0;
|
||||
int i;
|
||||
int i, buflen;
|
||||
|
||||
buflen = strlen(s) + 1;
|
||||
bufStart = buf = alloca(buflen);
|
||||
memset(buf, '\0', buflen);
|
||||
|
||||
src = s;
|
||||
dst = buf;
|
||||
argv[argc] = buf;
|
||||
|
||||
memset(buf, '\0', strlen(s) + 1);
|
||||
|
||||
while (*src) {
|
||||
if (quote == *src) {
|
||||
quote = '\0';
|
||||
@ -46,7 +65,7 @@ int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr) {
|
||||
if (*argv[argc]) {
|
||||
buf++, argc++;
|
||||
if (argc == argvAlloced) {
|
||||
argvAlloced += 5;
|
||||
argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA;
|
||||
argv = realloc(argv, sizeof(*argv) * argvAlloced);
|
||||
}
|
||||
argv[argc] = buf;
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user