From 6b7d09485ebcce46219c0a9a80f1d9d98676f2b4 Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Sat, 13 Jan 2018 18:13:27 +0100 Subject: [PATCH] ocpasswd: removed dependency on autogen The complexity of its command line options didn't require the linking to yet another library. Signed-off-by: Nikos Mavrogiannopoulos --- Makefile.am | 6 +- configure.ac | 6 +- src/Makefile.am | 15 +- src/ocpasswd/ocpasswd-args.c.in | 948 -------------------------------- src/ocpasswd/ocpasswd-args.h.in | 215 -------- src/ocpasswd/ocpasswd.c | 134 ++++- 6 files changed, 113 insertions(+), 1211 deletions(-) delete mode 100644 src/ocpasswd/ocpasswd-args.c.in delete mode 100644 src/ocpasswd/ocpasswd-args.h.in diff --git a/Makefile.am b/Makefile.am index 8641fa4f..69396421 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,8 +38,6 @@ ChangeLog: files-update: cp -f $(builddir)/src/ocserv-args.c $(srcdir)/src/ocserv-args.c.in cp -f $(builddir)/src/ocserv-args.h $(srcdir)/src/ocserv-args.h.in - cp -f $(builddir)/src/ocpasswd-args.c $(srcdir)/src/ocpasswd/ocpasswd-args.c.in - cp -f $(builddir)/src/ocpasswd-args.h $(srcdir)/src/ocpasswd/ocpasswd-args.h.in files-compare: @echo "*****************************************************************" @@ -48,8 +46,6 @@ files-compare: @echo "*****************************************************************" cmp $(srcdir)/src/ocserv-args.c.in $(builddir)/src/ocserv-args.c cmp $(srcdir)/src/ocserv-args.h.in $(builddir)/src/ocserv-args.h - cmp $(srcdir)/src/ocpasswd/ocpasswd-args.c.in $(builddir)/src/ocpasswd-args.c - cmp $(srcdir)/src/ocpasswd/ocpasswd-args.h.in $(builddir)/src/ocpasswd-args.h dist-hook: files-compare ChangeLog mv ChangeLog $(distdir) @@ -59,7 +55,7 @@ dist-hook: files-compare ChangeLog @echo "check fails upgrade the included libopts." @echo "*****************************************************************" test "$(SKIP_LIBOPTS_CHECK)" = "1" || test "`autoopts-config libsrc|cut -d '-' -f 2|sed 's/.tar.gz//'`" = "`cat $(srcdir)/libopts/autoopts/options.h |grep OPTIONS_VERSION_STRING|cut -d '"' -f 2|sed 's/:/./g'`" - for dir in $(distdir)/src/ $(distdir)/src/ocpasswd/;do \ + for dir in $(distdir)/src/;do \ ( cd $$dir && for i in *args.def;do \ $(AUTOGEN) $$i; \ done && \ diff --git a/configure.ac b/configure.ac index 5ef8f2d4..ee6e6aa4 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ(2.61) -AC_INIT([ocserv], [0.11.10], [nmav@gnutls.org]) +AC_INIT([ocserv], [0.11.10], [openconnect-devel@lists.infradead.org]) PKG_PROG_PKG_CONFIG AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) @@ -536,9 +536,7 @@ AC_SUBST([ROOTGID], [$gid]) LIBOPTS_CHECK([libopts]) if test "$NEED_LIBOPTS_DIR" = "true";then dnl create libopts-generated files - AC_CONFIG_LINKS([src/ocpasswd-args.c:src/ocpasswd/ocpasswd-args.c.in - src/ocpasswd-args.h:src/ocpasswd/ocpasswd-args.h.in - src/ocserv-args.c:src/ocserv-args.c.in + AC_CONFIG_LINKS([src/ocserv-args.c:src/ocserv-args.c.in src/ocserv-args.h:src/ocserv-args.h.in]) AC_SUBST([AUTOGEN], [:]) enable_local_libopts=yes diff --git a/src/Makefile.am b/src/Makefile.am index 02f360fc..0591bda9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -115,27 +115,16 @@ occtl_occtl_LDADD = ../gl/libgnu.a libcommon.a $(LIBREADLINE_LIBS) \ # Ocpasswd -EXTRA_DIST += ocpasswd/ocpasswd-args.def ocpasswd/ocpasswd-args.c.in ocpasswd/ocpasswd-args.h.in - -BUILT_SOURCES += ocpasswd-args.c ocpasswd-args.h +EXTRA_DIST += ocpasswd/ocpasswd-args.def bin_PROGRAMS += ocpasswd/ocpasswd -noinst_LIBRARIES += libcmd-ocpasswd.a -libcmd_ocpasswd_a_SOURCES = ocpasswd/ocpasswd-args.def ocpasswd-args.c ocpasswd-args.h - ocpasswd_ocpasswd_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/ocpasswd ocpasswd_ocpasswd_SOURCES = ocpasswd/ocpasswd.c -ocpasswd_ocpasswd_LDADD = ../gl/libgnu.a $(NEEDED_LIBOPTS) libcmd-ocpasswd.a +ocpasswd_ocpasswd_LDADD = ../gl/libgnu.a ocpasswd_ocpasswd_LDADD += $(LIBGNUTLS_LIBS) $(LIBCRYPT) $(CODE_COVERAGE_LDFLAGS) \ $(LIBNETTLE_LIBS) -ocpasswd-args.stamp: $(srcdir)/ocpasswd/ocpasswd-args.def $(builddir)/version.inc - $(AUTOGEN) $< - touch $@ -ocpasswd-args.h: ocpasswd-args.stamp -ocpasswd-args.c: ocpasswd-args.stamp - # libcommon # Files common to ocserv and occtl. diff --git a/src/ocpasswd/ocpasswd-args.c.in b/src/ocpasswd/ocpasswd-args.c.in deleted file mode 100644 index 6620f38c..00000000 --- a/src/ocpasswd/ocpasswd-args.c.in +++ /dev/null @@ -1,948 +0,0 @@ -/* -*- buffer-read-only: t -*- vi: set ro: - * - * DO NOT EDIT THIS FILE (ocpasswd-args.c) - * - * It has been AutoGen-ed - * From the definitions ocpasswd/ocpasswd-args.def - * and the template file options - * - * Generated from AutoOpts 41:1:16 templates. - * - * AutoOpts is a copyrighted work. This source file is not encumbered - * by AutoOpts licensing, but is provided under the licensing terms chosen - * by the ocpasswd author or copyright holder. AutoOpts is - * licensed under the terms of the LGPL. The redistributable library - * (``libopts'') is licensed under the terms of either the LGPL or, at the - * users discretion, the BSD license. See the AutoOpts and/or libopts sources - * for details. - * - * The ocpasswd program is copyrighted and licensed - * under the following terms: - * - * Copyright (C) 2013-2017 Nikos Mavrogiannopoulos, all rights reserved. - * This is free software. It is licensed for use, modification and - * redistribution under the terms of the GNU General Public License, - * version 2 - * - * ocpasswd is free software: you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License, - * as published by the Free Software Foundation. - * - * ocpasswd is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License, - * version 2, along with this program. - * If not, see . - */ - -#ifndef __doxygen__ -#define OPTION_CODE_COMPILE 1 -#include "ocpasswd-args.h" -#include - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -extern FILE * option_usage_fp; -#define zCopyright (ocpasswd_opt_strs+0) -#define zLicenseDescrip (ocpasswd_opt_strs+263) - - -#ifndef NULL -# define NULL 0 -#endif - -/** - * static const strings for ocpasswd options - */ -static char const ocpasswd_opt_strs[1518] = -/* 0 */ "ocpasswd 0.11.10\n" - "Copyright (C) 2013-2017 Nikos Mavrogiannopoulos, all rights reserved.\n" - "This is free software. It is licensed for use, modification and\n" - "redistribution under the terms of the GNU General Public License,\n" - "version 2 \n\0" -/* 263 */ "ocpasswd is free software: you can redistribute it and/or modify it under\n" - "the terms of version 2 of the GNU General Public License, as published by\n" - "the Free Software Foundation.\n\n" - "ocpasswd is distributed in the hope that it will be useful, but WITHOUT ANY\n" - "WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n" - "FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\n" - "details.\n\n" - "You should have received a copy of the GNU General Public License, version\n" - "2, along with this program. If not, see .\n\0" -/* 822 */ "Password file\0" -/* 836 */ "PASSWD\0" -/* 843 */ "passwd\0" -/* 850 */ "User's group name\0" -/* 868 */ "GROUPNAME\0" -/* 878 */ "groupname\0" -/* 888 */ "Delete user\0" -/* 900 */ "DELETE\0" -/* 907 */ "delete\0" -/* 914 */ "Lock user\0" -/* 924 */ "LOCK\0" -/* 929 */ "lock\0" -/* 934 */ "Unlock user\0" -/* 946 */ "UNLOCK\0" -/* 953 */ "unlock\0" -/* 960 */ "display extended usage information and exit\0" -/* 1004 */ "help\0" -/* 1009 */ "extended usage information passed thru pager\0" -/* 1054 */ "more-help\0" -/* 1064 */ "output version information and exit\0" -/* 1100 */ "version\0" -/* 1108 */ "OCPASSWD\0" -/* 1117 */ "ocpasswd - OpenConnect server password utility\n" - "Usage: %s [ - [] | --[{=| }] ]... [username]\n\0" -/* 1233 */ "openconnect-devel@lists.infradead.org\0" -/* 1271 */ "\n\0" -/* 1273 */ "This program is openconnect password (ocpasswd) utility. It allows the\n" - "generation and handling of a 'plain' password file used by ocserv.\n\0" -/* 1413 */ "ocpasswd 0.11.10\0" -/* 1430 */ "Usage: ocpasswd -c [passwd] [options] username\n" - "ocpasswd --help for usage instructions.\n"; - -/** - * passwd option description: - */ -/** Descriptive text for the passwd option */ -#define PASSWD_DESC (ocpasswd_opt_strs+822) -/** Upper-cased name for the passwd option */ -#define PASSWD_NAME (ocpasswd_opt_strs+836) -/** Name string for the passwd option */ -#define PASSWD_name (ocpasswd_opt_strs+843) -/** Compiled in flag settings for the passwd option */ -#define PASSWD_FLAGS (OPTST_DISABLED \ - | OPTST_SET_ARGTYPE(OPARG_TYPE_FILE)) - -/** - * groupname option description: - */ -/** Descriptive text for the groupname option */ -#define GROUPNAME_DESC (ocpasswd_opt_strs+850) -/** Upper-cased name for the groupname option */ -#define GROUPNAME_NAME (ocpasswd_opt_strs+868) -/** Name string for the groupname option */ -#define GROUPNAME_name (ocpasswd_opt_strs+878) -/** Compiled in flag settings for the groupname option */ -#define GROUPNAME_FLAGS (OPTST_DISABLED \ - | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)) - -/** - * delete option description: - */ -/** Descriptive text for the delete option */ -#define DELETE_DESC (ocpasswd_opt_strs+888) -/** Upper-cased name for the delete option */ -#define DELETE_NAME (ocpasswd_opt_strs+900) -/** Name string for the delete option */ -#define DELETE_name (ocpasswd_opt_strs+907) -/** Compiled in flag settings for the delete option */ -#define DELETE_FLAGS (OPTST_DISABLED) - -/** - * lock option description: - */ -/** Descriptive text for the lock option */ -#define LOCK_DESC (ocpasswd_opt_strs+914) -/** Upper-cased name for the lock option */ -#define LOCK_NAME (ocpasswd_opt_strs+924) -/** Name string for the lock option */ -#define LOCK_name (ocpasswd_opt_strs+929) -/** Compiled in flag settings for the lock option */ -#define LOCK_FLAGS (OPTST_DISABLED) - -/** - * unlock option description: - */ -/** Descriptive text for the unlock option */ -#define UNLOCK_DESC (ocpasswd_opt_strs+934) -/** Upper-cased name for the unlock option */ -#define UNLOCK_NAME (ocpasswd_opt_strs+946) -/** Name string for the unlock option */ -#define UNLOCK_name (ocpasswd_opt_strs+953) -/** Compiled in flag settings for the unlock option */ -#define UNLOCK_FLAGS (OPTST_DISABLED) - -/* - * Help/More_Help/Version option descriptions: - */ -#define HELP_DESC (ocpasswd_opt_strs+960) -#define HELP_name (ocpasswd_opt_strs+1004) -#ifdef HAVE_WORKING_FORK -#define MORE_HELP_DESC (ocpasswd_opt_strs+1009) -#define MORE_HELP_name (ocpasswd_opt_strs+1054) -#define MORE_HELP_FLAGS (OPTST_IMM | OPTST_NO_INIT) -#else -#define MORE_HELP_DESC HELP_DESC -#define MORE_HELP_name HELP_name -#define MORE_HELP_FLAGS (OPTST_OMITTED | OPTST_NO_INIT) -#endif -#ifdef NO_OPTIONAL_OPT_ARGS -# define VER_FLAGS (OPTST_IMM | OPTST_NO_INIT) -#else -# define VER_FLAGS (OPTST_SET_ARGTYPE(OPARG_TYPE_STRING) | \ - OPTST_ARG_OPTIONAL | OPTST_IMM | OPTST_NO_INIT) -#endif -#define VER_DESC (ocpasswd_opt_strs+1064) -#define VER_name (ocpasswd_opt_strs+1100) -/** - * Declare option callback procedures - */ -extern tOptProc - optionBooleanVal, optionNestedVal, optionNumericVal, - optionPagedUsage, optionPrintVersion, optionResetOpt, - optionStackArg, optionTimeDate, optionTimeVal, - optionUnstackArg, optionVendorOption; -static tOptProc - doOptPasswd, doUsageOpt; -#define VER_PROC optionPrintVersion - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** - * Define the ocpasswd Option Descriptions. - * This is an array of OPTION_CT entries, one for each - * option that the ocpasswd program responds to. - */ -static tOptDesc optDesc[OPTION_CT] = { - { /* entry idx, value */ 0, VALUE_OPT_PASSWD, - /* equiv idx, value */ 0, VALUE_OPT_PASSWD, - /* equivalenced to */ NO_EQUIVALENT, - /* min, max, act ct */ 0, 1, 0, - /* opt state flags */ PASSWD_FLAGS, 0, - /* last opt argumnt */ { NULL }, /* --passwd */ - /* arg list/cookie */ NULL, - /* must/cannot opts */ NULL, NULL, - /* option proc */ doOptPasswd, - /* desc, NAME, name */ PASSWD_DESC, PASSWD_NAME, PASSWD_name, - /* disablement strs */ NULL, NULL }, - - { /* entry idx, value */ 1, VALUE_OPT_GROUPNAME, - /* equiv idx, value */ 1, VALUE_OPT_GROUPNAME, - /* equivalenced to */ NO_EQUIVALENT, - /* min, max, act ct */ 0, 1, 0, - /* opt state flags */ GROUPNAME_FLAGS, 0, - /* last opt argumnt */ { NULL }, /* --groupname */ - /* arg list/cookie */ NULL, - /* must/cannot opts */ NULL, NULL, - /* option proc */ NULL, - /* desc, NAME, name */ GROUPNAME_DESC, GROUPNAME_NAME, GROUPNAME_name, - /* disablement strs */ NULL, NULL }, - - { /* entry idx, value */ 2, VALUE_OPT_DELETE, - /* equiv idx, value */ 2, VALUE_OPT_DELETE, - /* equivalenced to */ NO_EQUIVALENT, - /* min, max, act ct */ 0, 1, 0, - /* opt state flags */ DELETE_FLAGS, 0, - /* last opt argumnt */ { NULL }, /* --delete */ - /* arg list/cookie */ NULL, - /* must/cannot opts */ NULL, NULL, - /* option proc */ NULL, - /* desc, NAME, name */ DELETE_DESC, DELETE_NAME, DELETE_name, - /* disablement strs */ NULL, NULL }, - - { /* entry idx, value */ 3, VALUE_OPT_LOCK, - /* equiv idx, value */ 3, VALUE_OPT_LOCK, - /* equivalenced to */ NO_EQUIVALENT, - /* min, max, act ct */ 0, 1, 0, - /* opt state flags */ LOCK_FLAGS, 0, - /* last opt argumnt */ { NULL }, /* --lock */ - /* arg list/cookie */ NULL, - /* must/cannot opts */ NULL, NULL, - /* option proc */ NULL, - /* desc, NAME, name */ LOCK_DESC, LOCK_NAME, LOCK_name, - /* disablement strs */ NULL, NULL }, - - { /* entry idx, value */ 4, VALUE_OPT_UNLOCK, - /* equiv idx, value */ 4, VALUE_OPT_UNLOCK, - /* equivalenced to */ NO_EQUIVALENT, - /* min, max, act ct */ 0, 1, 0, - /* opt state flags */ UNLOCK_FLAGS, 0, - /* last opt argumnt */ { NULL }, /* --unlock */ - /* arg list/cookie */ NULL, - /* must/cannot opts */ NULL, NULL, - /* option proc */ NULL, - /* desc, NAME, name */ UNLOCK_DESC, UNLOCK_NAME, UNLOCK_name, - /* disablement strs */ NULL, NULL }, - - { /* entry idx, value */ INDEX_OPT_VERSION, VALUE_OPT_VERSION, - /* equiv idx value */ NO_EQUIVALENT, VALUE_OPT_VERSION, - /* equivalenced to */ NO_EQUIVALENT, - /* min, max, act ct */ 0, 1, 0, - /* opt state flags */ VER_FLAGS, AOUSE_VERSION, - /* last opt argumnt */ { NULL }, - /* arg list/cookie */ NULL, - /* must/cannot opts */ NULL, NULL, - /* option proc */ VER_PROC, - /* desc, NAME, name */ VER_DESC, NULL, VER_name, - /* disablement strs */ NULL, NULL }, - - - - { /* entry idx, value */ INDEX_OPT_HELP, VALUE_OPT_HELP, - /* equiv idx value */ NO_EQUIVALENT, VALUE_OPT_HELP, - /* equivalenced to */ NO_EQUIVALENT, - /* min, max, act ct */ 0, 1, 0, - /* opt state flags */ OPTST_IMM | OPTST_NO_INIT, AOUSE_HELP, - /* last opt argumnt */ { NULL }, - /* arg list/cookie */ NULL, - /* must/cannot opts */ NULL, NULL, - /* option proc */ doUsageOpt, - /* desc, NAME, name */ HELP_DESC, NULL, HELP_name, - /* disablement strs */ NULL, NULL }, - - { /* entry idx, value */ INDEX_OPT_MORE_HELP, VALUE_OPT_MORE_HELP, - /* equiv idx value */ NO_EQUIVALENT, VALUE_OPT_MORE_HELP, - /* equivalenced to */ NO_EQUIVALENT, - /* min, max, act ct */ 0, 1, 0, - /* opt state flags */ MORE_HELP_FLAGS, AOUSE_MORE_HELP, - /* last opt argumnt */ { NULL }, - /* arg list/cookie */ NULL, - /* must/cannot opts */ NULL, NULL, - /* option proc */ optionPagedUsage, - /* desc, NAME, name */ MORE_HELP_DESC, NULL, MORE_HELP_name, - /* disablement strs */ NULL, NULL } -}; - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** Reference to the upper cased version of ocpasswd. */ -#define zPROGNAME (ocpasswd_opt_strs+1108) -/** Reference to the title line for ocpasswd usage. */ -#define zUsageTitle (ocpasswd_opt_strs+1117) -/** There is no ocpasswd configuration file. */ -#define zRcName NULL -/** There are no directories to search for ocpasswd config files. */ -#define apzHomeList NULL -/** The ocpasswd program bug email address. */ -#define zBugsAddr (ocpasswd_opt_strs+1233) -/** Clarification/explanation of what ocpasswd does. */ -#define zExplain (ocpasswd_opt_strs+1271) -/** Extra detail explaining what ocpasswd does. */ -#define zDetail (ocpasswd_opt_strs+1273) -/** The full version string for ocpasswd. */ -#define zFullVersion (ocpasswd_opt_strs+1413) -/* extracted from optcode.tlib near line 364 */ - -#if defined(ENABLE_NLS) -# define OPTPROC_BASE OPTPROC_TRANSLATE | OPTPROC_NXLAT_OPT - static tOptionXlateProc translate_option_strings; -#else -# define OPTPROC_BASE OPTPROC_NONE -# define translate_option_strings NULL -#endif /* ENABLE_NLS */ - -#define ocpasswd_full_usage (NULL) -#define ocpasswd_short_usage (ocpasswd_opt_strs+1430) - -#endif /* not defined __doxygen__ */ - -/* - * Create the static procedure(s) declared above. - */ -/** - * The callout function that invokes the optionUsage function. - * - * @param[in] opts the AutoOpts option description structure - * @param[in] od the descriptor for the "help" (usage) option. - * @noreturn - */ -static void -doUsageOpt(tOptions * opts, tOptDesc * od) -{ - int ex_code; - ex_code = OCPASSWD_EXIT_SUCCESS; - optionUsage(&ocpasswdOptions, ex_code); - /* NOTREACHED */ - exit(OCPASSWD_EXIT_FAILURE); - (void)opts; - (void)od; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** - * Code to handle the passwd option. - * - * @param[in] pOptions the ocpasswd options data structure - * @param[in,out] pOptDesc the option descriptor for this option. - */ -static void -doOptPasswd(tOptions* pOptions, tOptDesc* pOptDesc) -{ - static teOptFileType const type = - FTYPE_MODE_MAY_EXIST + FTYPE_MODE_NO_OPEN; - static tuFileMode mode; -#ifndef O_CLOEXEC -# define O_CLOEXEC 0 -#endif - mode.file_flags = O_CLOEXEC; - - /* - * This function handles special invalid values for "pOptions" - */ - optionFileCheck(pOptions, pOptDesc, type, mode); -} -/* extracted from optmain.tlib near line 1250 */ - -/** - * The directory containing the data associated with ocpasswd. - */ -#ifndef PKGDATADIR -# define PKGDATADIR "" -#endif - -/** - * Information about the person or institution that packaged ocpasswd - * for the current distribution. - */ -#ifndef WITH_PACKAGER -# define ocpasswd_packager_info NULL -#else -/** Packager information for ocpasswd. */ -static char const ocpasswd_packager_info[] = - "Packaged by " WITH_PACKAGER - -# ifdef WITH_PACKAGER_VERSION - " ("WITH_PACKAGER_VERSION")" -# endif - -# ifdef WITH_PACKAGER_BUG_REPORTS - "\nReport ocpasswd bugs to " WITH_PACKAGER_BUG_REPORTS -# endif - "\n"; -#endif -#ifndef __doxygen__ - -#endif /* __doxygen__ */ -/** - * The option definitions for ocpasswd. The one structure that - * binds them all. - */ -tOptions ocpasswdOptions = { - OPTIONS_STRUCT_VERSION, - 0, NULL, /* original argc + argv */ - ( OPTPROC_BASE - + OPTPROC_ERRSTOP - + OPTPROC_SHORTOPT - + OPTPROC_LONGOPT - + OPTPROC_NO_REQ_OPT - + OPTPROC_REORDER - + OPTPROC_GNUUSAGE - + OPTPROC_MISUSE ), - 0, NULL, /* current option index, current option */ - NULL, NULL, zPROGNAME, - zRcName, zCopyright, zLicenseDescrip, - zFullVersion, apzHomeList, zUsageTitle, - zExplain, zDetail, optDesc, - zBugsAddr, /* address to send bugs to */ - NULL, NULL, /* extensions/saved state */ - optionUsage, /* usage procedure */ - translate_option_strings, /* translation procedure */ - /* - * Indexes to special options - */ - { INDEX_OPT_MORE_HELP, /* more-help option index */ - NO_EQUIVALENT, /* save option index */ - NO_EQUIVALENT, /* '-#' option index */ - NO_EQUIVALENT /* index of default opt */ - }, - 8 /* full option count */, 5 /* user option count */, - ocpasswd_full_usage, ocpasswd_short_usage, - NULL, NULL, - PKGDATADIR, ocpasswd_packager_info -}; - -#if ENABLE_NLS -/** - * This code is designed to translate translatable option text for the - * ocpasswd program. These translations happen upon entry - * to optionProcess(). - */ -#include -#include -#include -#include -#ifdef HAVE_DCGETTEXT -# include -#endif -#include - -static char * AO_gettext(char const * pz); -static void coerce_it(void ** s); - -/** - * AutoGen specific wrapper function for gettext. It relies on the macro _() - * to convert from English to the target language, then strdup-duplicates the - * result string. It tries the "libopts" domain first, then whatever has been - * set via the \a textdomain(3) call. - * - * @param[in] pz the input text used as a lookup key. - * @returns the translated text (if there is one), - * or the original text (if not). - */ -static char * -AO_gettext(char const * pz) -{ - char * res; - if (pz == NULL) - return NULL; -#ifdef HAVE_DCGETTEXT - /* - * While processing the option_xlateable_txt data, try to use the - * "libopts" domain. Once we switch to the option descriptor data, - * do *not* use that domain. - */ - if (option_xlateable_txt.field_ct != 0) { - res = dgettext("libopts", pz); - if (res == pz) - res = (char *)VOIDP(_(pz)); - } else - res = (char *)VOIDP(_(pz)); -#else - res = (char *)VOIDP(_(pz)); -#endif - if (res == pz) - return res; - res = strdup(res); - if (res == NULL) { - fputs(_("No memory for duping translated strings\n"), stderr); - exit(OCPASSWD_EXIT_FAILURE); - } - return res; -} - -/** - * All the pointers we use are marked "* const", but they are stored in - * writable memory. Coerce the mutability and set the pointer. - */ -static void coerce_it(void ** s) { *s = AO_gettext(*s); -} - -/** - * Translate all the translatable strings in the ocpasswdOptions - * structure defined above. This is done only once. - */ -static void -translate_option_strings(void) -{ - tOptions * const opts = &ocpasswdOptions; - - /* - * Guard against re-translation. It won't work. The strings will have - * been changed by the first pass through this code. One shot only. - */ - if (option_xlateable_txt.field_ct != 0) { - /* - * Do the translations. The first pointer follows the field count - * field. The field count field is the size of a pointer. - */ - char ** ppz = (char**)VOIDP(&(option_xlateable_txt)); - int ix = option_xlateable_txt.field_ct; - - do { - ppz++; /* skip over field_ct */ - *ppz = AO_gettext(*ppz); - } while (--ix > 0); - /* prevent re-translation and disable "libopts" domain lookup */ - option_xlateable_txt.field_ct = 0; - - coerce_it(VOIDP(&(opts->pzCopyright))); - coerce_it(VOIDP(&(opts->pzCopyNotice))); - coerce_it(VOIDP(&(opts->pzFullVersion))); - coerce_it(VOIDP(&(opts->pzUsageTitle))); - coerce_it(VOIDP(&(opts->pzExplain))); - coerce_it(VOIDP(&(opts->pzDetail))); - { - tOptDesc * od = opts->pOptDesc; - for (ix = opts->optCt; ix > 0; ix--, od++) - coerce_it(VOIDP(&(od->pzText))); - } - } -} -#endif /* ENABLE_NLS */ - -#ifdef DO_NOT_COMPILE_THIS_CODE_IT_IS_FOR_GETTEXT -/** I18N function strictly for xgettext. Do not compile. */ -static void bogus_function(void) { - /* TRANSLATORS: - - The following dummy function was crated solely so that xgettext can - extract the correct strings. These strings are actually referenced - by a field name in the ocpasswdOptions structure noted in the - comments below. The literal text is defined in ocpasswd_opt_strs. - - NOTE: the strings below are segmented with respect to the source string - ocpasswd_opt_strs. The strings above are handed off for translation - at run time a paragraph at a time. Consequently, they are presented here - for translation a paragraph at a time. - - ALSO: often the description for an option will reference another option - by name. These are set off with apostrophe quotes (I hope). Do not - translate option names. - */ - /* referenced via ocpasswdOptions.pzCopyright */ - puts(_("ocpasswd 0.11.10\n\ -Copyright (C) 2013-2017 Nikos Mavrogiannopoulos, all rights reserved.\n\ -This is free software. It is licensed for use, modification and\n\ -redistribution under the terms of the GNU General Public License,\n\ -version 2 \n")); - - /* referenced via ocpasswdOptions.pzCopyNotice */ - puts(_("ocpasswd is free software: you can redistribute it and/or modify it under\n\ -the terms of version 2 of the GNU General Public License, as published by\n\ -the Free Software Foundation.\n\n")); - puts(_("ocpasswd is distributed in the hope that it will be useful, but WITHOUT ANY\n\ -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n\ -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\n\ -details.\n\n")); - puts(_("You should have received a copy of the GNU General Public License, version\n\ -2, along with this program. If not, see .\n")); - - /* referenced via ocpasswdOptions.pOptDesc->pzText */ - puts(_("Password file")); - - /* referenced via ocpasswdOptions.pOptDesc->pzText */ - puts(_("User's group name")); - - /* referenced via ocpasswdOptions.pOptDesc->pzText */ - puts(_("Delete user")); - - /* referenced via ocpasswdOptions.pOptDesc->pzText */ - puts(_("Lock user")); - - /* referenced via ocpasswdOptions.pOptDesc->pzText */ - puts(_("Unlock user")); - - /* referenced via ocpasswdOptions.pOptDesc->pzText */ - puts(_("display extended usage information and exit")); - - /* referenced via ocpasswdOptions.pOptDesc->pzText */ - puts(_("extended usage information passed thru pager")); - - /* referenced via ocpasswdOptions.pOptDesc->pzText */ - puts(_("output version information and exit")); - - /* referenced via ocpasswdOptions.pzUsageTitle */ - puts(_("ocpasswd - OpenConnect server password utility\n\ -Usage: %s [ - [] | --[{=| }] ]... [username]\n")); - - /* referenced via ocpasswdOptions.pzExplain */ - puts(_("\n")); - - /* referenced via ocpasswdOptions.pzDetail */ - puts(_("This program is openconnect password (ocpasswd) utility. It allows the\n\ -generation and handling of a 'plain' password file used by ocserv.\n")); - - /* referenced via ocpasswdOptions.pzFullVersion */ - puts(_("ocpasswd 0.11.10")); - - /* referenced via ocpasswdOptions.pzFullUsage */ - puts(_("<<>>")); - - /* referenced via ocpasswdOptions.pzShortUsage */ - puts(_("Usage: ocpasswd -c [passwd] [options] username\n\ -ocpasswd --help for usage instructions.\n")); - /* LIBOPTS-MESSAGES: */ -#line 67 "../autoopts.c" - puts(_("allocation of %d bytes failed\n")); -#line 93 "../autoopts.c" - puts(_("allocation of %d bytes failed\n")); -#line 53 "../init.c" - puts(_("AutoOpts function called without option descriptor\n")); -#line 86 "../init.c" - puts(_("\tThis exceeds the compiled library version: ")); -#line 84 "../init.c" - puts(_("Automated Options Processing Error!\n" - "\t%s called AutoOpts function with structure version %d:%d:%d.\n")); -#line 80 "../autoopts.c" - puts(_("realloc of %d bytes at 0x%p failed\n")); -#line 88 "../init.c" - puts(_("\tThis is less than the minimum library version: ")); -#line 121 "../version.c" - puts(_("Automated Options version %s\n" - "\tCopyright (C) 1999-2014 by Bruce Korb - all rights reserved\n")); -#line 87 "../makeshell.c" - puts(_("(AutoOpts bug): %s.\n")); -#line 90 "../reset.c" - puts(_("optionResetOpt() called, but reset-option not configured")); -#line 295 "../usage.c" - puts(_("could not locate the 'help' option")); -#line 336 "../autoopts.c" - puts(_("optionProcess() was called with invalid data")); -#line 751 "../usage.c" - puts(_("invalid argument type specified")); -#line 598 "../find.c" - puts(_("defaulted to option with optional arg")); -#line 76 "../alias.c" - puts(_("aliasing option is out of range.")); -#line 235 "../enum.c" - puts(_("%s error: the keyword '%s' is ambiguous for %s\n")); -#line 108 "../find.c" - puts(_(" The following options match:\n")); -#line 293 "../find.c" - puts(_("%s: ambiguous option name: %s (matches %d options)\n")); -#line 161 "../check.c" - puts(_("%s: Command line arguments required\n")); -#line 43 "../alias.c" - puts(_("%d %s%s options allowed\n")); -#line 94 "../makeshell.c" - puts(_("%s error %d (%s) calling %s for '%s'\n")); -#line 306 "../makeshell.c" - puts(_("interprocess pipe")); -#line 168 "../version.c" - puts(_("error: version option argument '%c' invalid. Use:\n" - "\t'v' - version only\n" - "\t'c' - version and copyright\n" - "\t'n' - version and full copyright notice\n")); -#line 58 "../check.c" - puts(_("%s error: the '%s' and '%s' options conflict\n")); -#line 217 "../find.c" - puts(_("%s: The '%s' option has been disabled.")); -#line 430 "../find.c" - puts(_("%s: The '%s' option has been disabled.")); -#line 38 "../alias.c" - puts(_("-equivalence")); -#line 469 "../find.c" - puts(_("%s: illegal option -- %c\n")); -#line 110 "../reset.c" - puts(_("%s: illegal option -- %c\n")); -#line 271 "../find.c" - puts(_("%s: illegal option -- %s\n")); -#line 755 "../find.c" - puts(_("%s: illegal option -- %s\n")); -#line 118 "../reset.c" - puts(_("%s: illegal option -- %s\n")); -#line 335 "../find.c" - puts(_("%s: unknown vendor extension option -- %s\n")); -#line 160 "../enum.c" - puts(_(" or an integer from %d through %d\n")); -#line 170 "../enum.c" - puts(_(" or an integer from %d through %d\n")); -#line 750 "../usage.c" - puts(_("%s error: invalid option descriptor for %s\n")); -#line 1084 "../usage.c" - puts(_("%s error: invalid option descriptor for %s\n")); -#line 385 "../find.c" - puts(_("%s: invalid option name: %s\n")); -#line 527 "../find.c" - puts(_("%s: The '%s' option requires an argument.\n")); -#line 156 "../autoopts.c" - puts(_("(AutoOpts bug): Equivalenced option '%s' was equivalenced to both\n" - "\t'%s' and '%s'.")); -#line 94 "../check.c" - puts(_("%s error: The %s option is required\n")); -#line 632 "../find.c" - puts(_("%s: The '%s' option cannot have an argument.\n")); -#line 151 "../check.c" - puts(_("%s: Command line arguments are not allowed.\n")); -#line 536 "../save.c" - puts(_("error %d (%s) creating %s\n")); -#line 235 "../enum.c" - puts(_("%s error: '%s' does not match any %s keywords.\n")); -#line 93 "../reset.c" - puts(_("%s error: The '%s' option requires an argument.\n")); -#line 186 "../save.c" - puts(_("error %d (%s) stat-ing %s\n")); -#line 239 "../save.c" - puts(_("error %d (%s) stat-ing %s\n")); -#line 143 "../restore.c" - puts(_("%s error: no saved option state\n")); -#line 231 "../autoopts.c" - puts(_("'%s' is not a command line option.\n")); -#line 113 "../time.c" - puts(_("%s error: '%s' is not a recognizable date/time.\n")); -#line 131 "../save.c" - puts(_("'%s' not defined\n")); -#line 50 "../time.c" - puts(_("%s error: '%s' is not a recognizable time duration.\n")); -#line 92 "../check.c" - puts(_("%s error: The %s option must appear %d times.\n")); -#line 165 "../numeric.c" - puts(_("%s error: '%s' is not a recognizable number.\n")); -#line 201 "../enum.c" - puts(_("%s error: %s exceeds %s keyword count\n")); -#line 333 "../usage.c" - puts(_("Try '%s %s' for more information.\n")); -#line 45 "../alias.c" - puts(_("one %s%s option allowed\n")); -#line 208 "../makeshell.c" - puts(_("standard output")); -#line 943 "../makeshell.c" - puts(_("standard output")); -#line 277 "../usage.c" - puts(_("standard output")); -#line 418 "../usage.c" - puts(_("standard output")); -#line 628 "../usage.c" - puts(_("standard output")); -#line 175 "../version.c" - puts(_("standard output")); -#line 277 "../usage.c" - puts(_("standard error")); -#line 418 "../usage.c" - puts(_("standard error")); -#line 628 "../usage.c" - puts(_("standard error")); -#line 175 "../version.c" - puts(_("standard error")); -#line 208 "../makeshell.c" - puts(_("write")); -#line 943 "../makeshell.c" - puts(_("write")); -#line 276 "../usage.c" - puts(_("write")); -#line 417 "../usage.c" - puts(_("write")); -#line 627 "../usage.c" - puts(_("write")); -#line 174 "../version.c" - puts(_("write")); -#line 60 "../numeric.c" - puts(_("%s error: %s option value %ld is out of range.\n")); -#line 44 "../check.c" - puts(_("%s error: %s option requires the %s option\n")); -#line 130 "../save.c" - puts(_("%s warning: cannot save options - %s not regular file\n")); -#line 185 "../save.c" - puts(_("%s warning: cannot save options - %s not regular file\n")); -#line 238 "../save.c" - puts(_("%s warning: cannot save options - %s not regular file\n")); -#line 257 "../save.c" - puts(_("%s warning: cannot save options - %s not regular file\n")); -#line 535 "../save.c" - puts(_("%s warning: cannot save options - %s not regular file\n")); - /* END-LIBOPTS-MESSAGES */ - - /* USAGE-TEXT: */ -#line 876 "../usage.c" - puts(_("\t\t\t\t- an alternate for '%s'\n")); -#line 1151 "../usage.c" - puts(_("Version, usage and configuration options:")); -#line 927 "../usage.c" - puts(_("\t\t\t\t- default option for unnamed options\n")); -#line 840 "../usage.c" - puts(_("\t\t\t\t- disabled as '--%s'\n")); -#line 1120 "../usage.c" - puts(_(" --- %-14s %s\n")); -#line 1118 "../usage.c" - puts(_("This option has been disabled")); -#line 867 "../usage.c" - puts(_("\t\t\t\t- enabled by default\n")); -#line 40 "../alias.c" - puts(_("%s error: only ")); -#line 1197 "../usage.c" - puts(_(" - examining environment variables named %s_*\n")); -#line 168 "../file.c" - puts(_("\t\t\t\t- file must not pre-exist\n")); -#line 172 "../file.c" - puts(_("\t\t\t\t- file must pre-exist\n")); -#line 383 "../usage.c" - puts(_("Options are specified by doubled hyphens and their name or by a single\n" - "hyphen and the flag character.\n")); -#line 921 "../makeshell.c" - puts(_("\n" - "= = = = = = = =\n\n" - "This incarnation of genshell will produce\n" - "a shell script to parse the options for %s:\n\n")); -#line 167 "../enum.c" - puts(_(" or an integer mask with any of the lower %d bits set\n")); -#line 900 "../usage.c" - puts(_("\t\t\t\t- is a set membership option\n")); -#line 921 "../usage.c" - puts(_("\t\t\t\t- must appear between %d and %d times\n")); -#line 385 "../usage.c" - puts(_("Options are specified by single or double hyphens and their name.\n")); -#line 907 "../usage.c" - puts(_("\t\t\t\t- may appear multiple times\n")); -#line 894 "../usage.c" - puts(_("\t\t\t\t- may not be preset\n")); -#line 1312 "../usage.c" - puts(_(" Arg Option-Name Description\n")); -#line 1248 "../usage.c" - puts(_(" Flg Arg Option-Name Description\n")); -#line 1306 "../usage.c" - puts(_(" Flg Arg Option-Name Description\n")); -#line 1307 "../usage.c" - puts(_(" %3s %s")); -#line 1313 "../usage.c" - puts(_(" %3s %s")); -#line 390 "../usage.c" - puts(_("The '-#' option may omit the hash char\n")); -#line 386 "../usage.c" - puts(_("All arguments are named options.\n")); -#line 974 "../usage.c" - puts(_(" - reading file %s")); -#line 412 "../usage.c" - puts(_("\n" - "Please send bug reports to: <%s>\n")); -#line 100 "../version.c" - puts(_("\n" - "Please send bug reports to: <%s>\n")); -#line 129 "../version.c" - puts(_("\n" - "Please send bug reports to: <%s>\n")); -#line 906 "../usage.c" - puts(_("\t\t\t\t- may NOT appear - preset only\n")); -#line 947 "../usage.c" - puts(_("\n" - "The following option preset mechanisms are supported:\n")); -#line 1195 "../usage.c" - puts(_("\n" - "The following option preset mechanisms are supported:\n")); -#line 685 "../usage.c" - puts(_("prohibits these options:\n")); -#line 680 "../usage.c" - puts(_("prohibits the option '%s'\n")); -#line 81 "../numeric.c" - puts(_("%s%ld to %ld")); -#line 79 "../numeric.c" - puts(_("%sgreater than or equal to %ld")); -#line 75 "../numeric.c" - puts(_("%s%ld exactly")); -#line 68 "../numeric.c" - puts(_("%sit must lie in one of the ranges:\n")); -#line 68 "../numeric.c" - puts(_("%sit must be in the range:\n")); -#line 88 "../numeric.c" - puts(_(", or\n")); -#line 66 "../numeric.c" - puts(_("%sis scalable with a suffix: k/K/m/M/g/G/t/T\n")); -#line 77 "../numeric.c" - puts(_("%sless than or equal to %ld")); -#line 393 "../usage.c" - puts(_("Operands and options may be intermixed. They will be reordered.\n")); -#line 655 "../usage.c" - puts(_("requires the option '%s'\n")); -#line 658 "../usage.c" - puts(_("requires these options:\n")); -#line 1324 "../usage.c" - puts(_(" Arg Option-Name Req? Description\n")); -#line 1318 "../usage.c" - puts(_(" Flg Arg Option-Name Req? Description\n")); -#line 168 "../enum.c" - puts(_("or you may use a numeric representation. Preceding these with a '!'\n" - "will clear the bits, specifying 'none' will clear all bits, and 'all'\n" - "will set them all. Multiple entries may be passed as an option\n" - "argument list.\n")); -#line 913 "../usage.c" - puts(_("\t\t\t\t- may appear up to %d times\n")); -#line 77 "../enum.c" - puts(_("The valid \"%s\" option keywords are:\n")); -#line 1155 "../usage.c" - puts(_("The next option supports vendor supported extra options:")); -#line 776 "../usage.c" - puts(_("These additional options are:")); - /* END-USAGE-TEXT */ -} -#endif /* uncompilable code */ -#ifdef __cplusplus -} -#endif -/* ocpasswd-args.c ends here */ diff --git a/src/ocpasswd/ocpasswd-args.h.in b/src/ocpasswd/ocpasswd-args.h.in deleted file mode 100644 index 9a01dca0..00000000 --- a/src/ocpasswd/ocpasswd-args.h.in +++ /dev/null @@ -1,215 +0,0 @@ -/* -*- buffer-read-only: t -*- vi: set ro: - * - * DO NOT EDIT THIS FILE (ocpasswd-args.h) - * - * It has been AutoGen-ed - * From the definitions ocpasswd/ocpasswd-args.def - * and the template file options - * - * Generated from AutoOpts 41:1:16 templates. - * - * AutoOpts is a copyrighted work. This header file is not encumbered - * by AutoOpts licensing, but is provided under the licensing terms chosen - * by the ocpasswd author or copyright holder. AutoOpts is - * licensed under the terms of the LGPL. The redistributable library - * (``libopts'') is licensed under the terms of either the LGPL or, at the - * users discretion, the BSD license. See the AutoOpts and/or libopts sources - * for details. - * - * The ocpasswd program is copyrighted and licensed - * under the following terms: - * - * Copyright (C) 2013-2017 Nikos Mavrogiannopoulos, all rights reserved. - * This is free software. It is licensed for use, modification and - * redistribution under the terms of the GNU General Public License, - * version 2 - * - * ocpasswd is free software: you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License, - * as published by the Free Software Foundation. - * - * ocpasswd is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License, - * version 2, along with this program. - * If not, see . - */ -/** - * This file contains the programmatic interface to the Automated - * Options generated for the ocpasswd program. - * These macros are documented in the AutoGen info file in the - * "AutoOpts" chapter. Please refer to that doc for usage help. - */ -#ifndef AUTOOPTS_OCPASSWD_ARGS_H_GUARD -#define AUTOOPTS_OCPASSWD_ARGS_H_GUARD 1 -#include "config.h" -#include - -/** - * Ensure that the library used for compiling this generated header is at - * least as new as the version current when the header template was released - * (not counting patch version increments). Also ensure that the oldest - * tolerable version is at least as old as what was current when the header - * template was released. - */ -#define AO_TEMPLATE_VERSION 167937 -#if (AO_TEMPLATE_VERSION < OPTIONS_MINIMUM_VERSION) \ - || (AO_TEMPLATE_VERSION > OPTIONS_STRUCT_VERSION) -# error option template version mismatches autoopts/options.h header - Choke Me. -#endif - -/** - * Enumeration of each option type for ocpasswd - */ -typedef enum { - INDEX_OPT_PASSWD = 0, - INDEX_OPT_GROUPNAME = 1, - INDEX_OPT_DELETE = 2, - INDEX_OPT_LOCK = 3, - INDEX_OPT_UNLOCK = 4, - INDEX_OPT_VERSION = 5, - INDEX_OPT_HELP = 6, - INDEX_OPT_MORE_HELP = 7 -} teOptIndex; -/** count of all options for ocpasswd */ -#define OPTION_CT 8 -/** ocpasswd version */ -#define OCPASSWD_VERSION "0.11.10" -/** Full ocpasswd version text */ -#define OCPASSWD_FULL_VERSION "ocpasswd 0.11.10" - -/** - * Interface defines for all options. Replace "n" with the UPPER_CASED - * option name (as in the teOptIndex enumeration above). - * e.g. HAVE_OPT(PASSWD) - */ -#define DESC(n) (ocpasswdOptions.pOptDesc[INDEX_OPT_## n]) -/** 'true' if an option has been specified in any way */ -#define HAVE_OPT(n) (! UNUSED_OPT(& DESC(n))) -/** The string argument to an option. The argument type must be \"string\". */ -#define OPT_ARG(n) (DESC(n).optArg.argString) -/** Mask the option state revealing how an option was specified. - * It will be one and only one of \a OPTST_SET, \a OPTST_PRESET, - * \a OPTST_DEFINED, \a OPTST_RESET or zero. - */ -#define STATE_OPT(n) (DESC(n).fOptState & OPTST_SET_MASK) -/** Count of option's occurrances *on the command line*. */ -#define COUNT_OPT(n) (DESC(n).optOccCt) -/** mask of \a OPTST_SET and \a OPTST_DEFINED. */ -#define ISSEL_OPT(n) (SELECTED_OPT(&DESC(n))) -/** 'true' if \a HAVE_OPT would yield 'false'. */ -#define ISUNUSED_OPT(n) (UNUSED_OPT(& DESC(n))) -/** 'true' if OPTST_DISABLED bit not set. */ -#define ENABLED_OPT(n) (! DISABLED_OPT(& DESC(n))) -/** number of stacked option arguments. - * Valid only for stacked option arguments. */ -#define STACKCT_OPT(n) (((tArgList*)(DESC(n).optCookie))->useCt) -/** stacked argument vector. - * Valid only for stacked option arguments. */ -#define STACKLST_OPT(n) (((tArgList*)(DESC(n).optCookie))->apzArgs) -/** Reset an option. */ -#define CLEAR_OPT(n) STMTS( \ - DESC(n).fOptState &= OPTST_PERSISTENT_MASK; \ - if ((DESC(n).fOptState & OPTST_INITENABLED) == 0) \ - DESC(n).fOptState |= OPTST_DISABLED; \ - DESC(n).optCookie = NULL ) -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/** - * Enumeration of ocpasswd exit codes - */ -typedef enum { - OCPASSWD_EXIT_SUCCESS = 0, - OCPASSWD_EXIT_FAILURE = 1, - OCPASSWD_EXIT_USAGE_ERROR = 64, - OCPASSWD_EXIT_LIBOPTS_FAILURE = 70 -} ocpasswd_exit_code_t; -/** - * Interface defines for specific options. - * @{ - */ -#define VALUE_OPT_PASSWD 'c' -#define VALUE_OPT_GROUPNAME 'g' -#define VALUE_OPT_DELETE 'd' -#define VALUE_OPT_LOCK 'l' -#define VALUE_OPT_UNLOCK 'u' -/** option flag (value) for help-value option */ -#define VALUE_OPT_HELP 'h' -/** option flag (value) for more-help-value option */ -#define VALUE_OPT_MORE_HELP '!' -/** option flag (value) for version-value option */ -#define VALUE_OPT_VERSION 'v' -/* - * Interface defines not associated with particular options - */ -#define ERRSKIP_OPTERR STMTS(ocpasswdOptions.fOptSet &= ~OPTPROC_ERRSTOP) -#define ERRSTOP_OPTERR STMTS(ocpasswdOptions.fOptSet |= OPTPROC_ERRSTOP) -#define RESTART_OPT(n) STMTS( \ - ocpasswdOptions.curOptIdx = (n); \ - ocpasswdOptions.pzCurOpt = NULL ) -#define START_OPT RESTART_OPT(1) -#define USAGE(c) (*ocpasswdOptions.pUsageProc)(&ocpasswdOptions, c) - -#ifdef __cplusplus -extern "C" { -#endif - - -/* * * * * * - * - * Declare the ocpasswd option descriptor. - */ -extern tOptions ocpasswdOptions; - -#if defined(ENABLE_NLS) -# ifndef _ -# include -# ifndef HAVE_GETTEXT - extern char * gettext(char const *); -# else -# include -# endif - -# ifndef ATTRIBUTE_FORMAT_ARG -# define ATTRIBUTE_FORMAT_ARG(_a) -# endif - -static inline char* aoGetsText(char const* pz) ATTRIBUTE_FORMAT_ARG(1); -static inline char* aoGetsText(char const* pz) { - if (pz == NULL) return NULL; - return (char*)gettext(pz); -} -# define _(s) aoGetsText(s) -# endif /* _() */ - -# define OPT_NO_XLAT_CFG_NAMES STMTS(ocpasswdOptions.fOptSet |= \ - OPTPROC_NXLAT_OPT_CFG;) -# define OPT_NO_XLAT_OPT_NAMES STMTS(ocpasswdOptions.fOptSet |= \ - OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG;) - -# define OPT_XLAT_CFG_NAMES STMTS(ocpasswdOptions.fOptSet &= \ - ~(OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG);) -# define OPT_XLAT_OPT_NAMES STMTS(ocpasswdOptions.fOptSet &= \ - ~OPTPROC_NXLAT_OPT;) - -#else /* ENABLE_NLS */ -# define OPT_NO_XLAT_CFG_NAMES -# define OPT_NO_XLAT_OPT_NAMES - -# define OPT_XLAT_CFG_NAMES -# define OPT_XLAT_OPT_NAMES - -# ifndef _ -# define _(_s) _s -# endif -#endif /* ENABLE_NLS */ - -#ifdef __cplusplus -} -#endif -#endif /* AUTOOPTS_OCPASSWD_ARGS_H_GUARD */ - -/* ocpasswd-args.h ends here */ diff --git a/src/ocpasswd/ocpasswd.c b/src/ocpasswd/ocpasswd.c index de3b8396..2a910225 100644 --- a/src/ocpasswd/ocpasswd.c +++ b/src/ocpasswd/ocpasswd.c @@ -31,7 +31,7 @@ #include /* for random */ #include #include -#include "ocpasswd-args.h" +#include /* Gnulib portability files. */ #include @@ -354,13 +354,62 @@ unlock_user(const char *fpasswd, const char *username) free(tmp_passwd); } +static const struct option long_options[] = { + {"passwd", 1, 0, 'c'}, + {"groupname", 1, 0, 'g'}, + {"delete", 0, 0, 'd'}, + {"lock", 0, 0, 'l'}, + {"unlock", 0, 0, 'u'}, + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'v'}, + {NULL, 0, 0, 0} +}; + +static +void usage(void) +{ + fprintf(stderr, "ocpasswd - OpenConnect server password utility\n"); + fprintf(stderr, "Usage: ocpasswd [ - [] | --[{=| }] ]... [username]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " -c, --passwd=file Password file\n"); + fprintf(stderr, " -g, --groupname=str User's group name\n"); + fprintf(stderr, " -d, --delete Delete user\n"); + fprintf(stderr, " -l, --lock Lock user\n"); + fprintf(stderr, " -u, --unlock Unlock user\n"); + fprintf(stderr, " -v, --version output version information and exit\n"); + fprintf(stderr, " -h, --help display extended usage information and exit\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options are specified by doubled hyphens and their name or by a single\n"); + fprintf(stderr, "hyphen and the flag character.\n\n"); + fprintf(stderr, "This program is openconnect password (ocpasswd) utility. It allows the\n"); + fprintf(stderr, "generation and handling of a 'plain' password file used by ocserv.\n\n"); + fprintf(stderr, "Please send bug reports to: "PACKAGE_BUGREPORT"\n"); +} + +static +void version(void) +{ + fprintf(stderr, "ocpasswd - "VERSION"\n"); + fprintf(stderr, "Copyright (C) 2013-2017 Nikos Mavrogiannopoulos, all rights reserved.\n"); + fprintf(stderr, "This is free software. It is licensed for use, modification and\n"); + fprintf(stderr, "redistribution under the terms of the GNU General Public License,\n"); + fprintf(stderr, "version 2 \n\n"); + fprintf(stderr, "Please send bug reports to: "PACKAGE_BUGREPORT"\n"); +} + +#define FLAG_DELETE 1 +#define FLAG_LOCK (1<<1) +#define FLAG_UNLOCK (1<<2) + int main(int argc, char **argv) { - int ret, optct; - const char *username, *groupname, *fpasswd; - char* passwd; + int ret, c; + const char *username = NULL; + char *groupname = NULL, *fpasswd = NULL; + char* passwd = NULL; unsigned free_passwd = 0; size_t l, i; + unsigned flags = 0; if ((ret = gnutls_global_init()) < 0) { fprintf(stderr, "global_init: %s\n", gnutls_strerror(ret)); @@ -369,36 +418,67 @@ int main(int argc, char **argv) umask(066); - optct = optionProcess(&ocpasswdOptions, argc, argv); - argc -= optct; - argv += optct; + while (1) { + c = getopt_long(argc, argv, "c:g:dluvh", long_options, NULL); + if (c == -1) + break; - if (argc > 0) - username = argv[0]; - else { - optionUsage(&ocpasswdOptions, 1); + switch(c) { + case 'c': + fpasswd = strdup(optarg); + break; + case 'g': + groupname = strdup(optarg); + break; + case 'd': + if (flags) { + usage(); + exit(1); + } + flags |= FLAG_DELETE; + break; + case 'u': + if (flags) { + usage(); + exit(1); + } + flags |= FLAG_UNLOCK; + break; + case 'l': + if (flags) { + usage(); + exit(1); + } + flags |= FLAG_LOCK; + break; + case 'h': + usage(); + exit(0); + case 'v': + version(); + exit(0); + } + } + + if (optind < argc && argc-optind == 1) { + username = argv[optind++]; + } else { + usage(); exit(1); } - if (HAVE_OPT(PASSWD)) { - fpasswd = OPT_ARG(PASSWD); - } else { - fpasswd = DEFAULT_OCPASSWD; - } + if (!groupname) + groupname = strdup("*"); + if (!fpasswd) + fpasswd = strdup(DEFAULT_OCPASSWD); - if (HAVE_OPT(GROUPNAME)) - groupname = OPT_ARG(GROUPNAME); - else { - groupname = "*"; - } - - if (HAVE_OPT(LOCK)) + if (flags & FLAG_LOCK) { lock_user(fpasswd, username); - else if (HAVE_OPT(UNLOCK)) + } else if (flags & FLAG_UNLOCK) { unlock_user(fpasswd, username); - else if (HAVE_OPT(DELETE)) + } else if (flags & FLAG_DELETE) { delete_user(fpasswd, username); - else { /* set password */ + } else { /* set password */ if (isatty(STDIN_FILENO)) { char* p2; @@ -440,6 +520,8 @@ int main(int argc, char **argv) free(passwd); } + free(fpasswd); + free(groupname); gnutls_global_deinit(); return 0; }