Annotation of embedaddon/ntp/sntp/libopts/pgusage.c, revision 1.1

1.1     ! misho       1: 
        !             2: /**
        !             3:  * \file pgusage.c
        !             4:  *
        !             5:  * Time-stamp:      "2011-03-25 17:54:41 bkorb"
        !             6:  *
        !             7:  *   Automated Options Paged Usage module.
        !             8:  *
        !             9:  *  This routine will run run-on options through a pager so the
        !            10:  *  user may examine, print or edit them at their leisure.
        !            11:  *
        !            12:  *  This file is part of AutoOpts, a companion to AutoGen.
        !            13:  *  AutoOpts is free software.
        !            14:  *  AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved
        !            15:  *
        !            16:  *  AutoOpts is available under any one of two licenses.  The license
        !            17:  *  in use must be one of these two and the choice is under the control
        !            18:  *  of the user of the license.
        !            19:  *
        !            20:  *   The GNU Lesser General Public License, version 3 or later
        !            21:  *      See the files "COPYING.lgplv3" and "COPYING.gplv3"
        !            22:  *
        !            23:  *   The Modified Berkeley Software Distribution License
        !            24:  *      See the file "COPYING.mbsd"
        !            25:  *
        !            26:  *  These files have the following md5sums:
        !            27:  *
        !            28:  *  43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3
        !            29:  *  06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3
        !            30:  *  66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
        !            31:  */
        !            32: 
        !            33: /*=export_func  optionPagedUsage
        !            34:  * private:
        !            35:  *
        !            36:  * what:  Decipher a boolean value
        !            37:  * arg:   + tOptions* + pOpts    + program options descriptor +
        !            38:  * arg:   + tOptDesc* + pOptDesc + the descriptor for this arg +
        !            39:  *
        !            40:  * doc:
        !            41:  *  Run the usage output through a pager.
        !            42:  *  This is very handy if it is very long.
        !            43:  *  This is disabled on platforms without a working fork() function.
        !            44: =*/
        !            45: void
        !            46: optionPagedUsage(tOptions* pOptions, tOptDesc* pOD)
        !            47: {
        !            48: #if ! defined(HAVE_WORKING_FORK)
        !            49:     if ((pOD->fOptState & OPTST_RESET) != 0)
        !            50:         return;
        !            51: 
        !            52:     (*pOptions->pUsageProc)(pOptions, EXIT_SUCCESS);
        !            53: #else
        !            54:     static pid_t     my_pid;
        !            55:     char zPageUsage[ 1024 ];
        !            56: 
        !            57:     /*
        !            58:      *  IF we are being called after the usage proc is done
        !            59:      *     (and thus has called "exit(2)")
        !            60:      *  THEN invoke the pager to page through the usage file we created.
        !            61:      */
        !            62:     switch (pagerState) {
        !            63:     case PAGER_STATE_INITIAL:
        !            64:     {
        !            65:         if ((pOD->fOptState & OPTST_RESET) != 0)
        !            66:             return;
        !            67: 
        !            68:         my_pid  = getpid();
        !            69: #ifdef HAVE_SNPRINTF
        !            70:         snprintf(zPageUsage, sizeof(zPageUsage), "/tmp/use.%lu", (tAoUL)my_pid);
        !            71: #else
        !            72:         sprintf(zPageUsage, "/tmp/use.%lu", (tAoUL)my_pid);
        !            73: #endif
        !            74:         unlink(zPageUsage);
        !            75: 
        !            76:         /*
        !            77:          *  Set usage output to this temporary file
        !            78:          */
        !            79:         option_usage_fp = fopen(zPageUsage, "w" FOPEN_BINARY_FLAG);
        !            80:         if (option_usage_fp == NULL)
        !            81:             _exit(EXIT_FAILURE);
        !            82: 
        !            83:         pagerState = PAGER_STATE_READY;
        !            84: 
        !            85:         /*
        !            86:          *  Set up so this routine gets called during the exit logic
        !            87:          */
        !            88:         atexit((void(*)(void))optionPagedUsage);
        !            89: 
        !            90:         /*
        !            91:          *  The usage procedure will now put the usage information into
        !            92:          *  the temporary file we created above.
        !            93:          */
        !            94:         (*pOptions->pUsageProc)(pOptions, EXIT_SUCCESS);
        !            95: 
        !            96:         /* NOTREACHED */
        !            97:         _exit(EXIT_FAILURE);
        !            98:     }
        !            99: 
        !           100:     case PAGER_STATE_READY:
        !           101:     {
        !           102:         tSCC zPage[]  = "%1$s /tmp/use.%2$lu ; rm -f /tmp/use.%2$lu";
        !           103:         tCC* pzPager  = (tCC*)getenv("PAGER");
        !           104: 
        !           105:         /*
        !           106:          *  Use the "more(1)" program if "PAGER" has not been defined
        !           107:          */
        !           108:         if (pzPager == NULL)
        !           109:             pzPager = "more";
        !           110: 
        !           111:         /*
        !           112:          *  Page the file and remove it when done.
        !           113:          */
        !           114: #ifdef HAVE_SNPRINTF
        !           115:         snprintf(zPageUsage, sizeof(zPageUsage), zPage, pzPager, (tAoUL)my_pid);
        !           116: #else
        !           117:         sprintf(zPageUsage, zPage, pzPager, (tAoUL)my_pid);
        !           118: #endif
        !           119:         fclose(stderr);
        !           120:         dup2(STDOUT_FILENO, STDERR_FILENO);
        !           121: 
        !           122:         (void)system(zPageUsage);
        !           123:     }
        !           124: 
        !           125:     case PAGER_STATE_CHILD:
        !           126:         /*
        !           127:          *  This is a child process used in creating shell script usage.
        !           128:          */
        !           129:         break;
        !           130:     }
        !           131: #endif
        !           132: }
        !           133: 
        !           134: /*
        !           135:  * Local Variables:
        !           136:  * mode: C
        !           137:  * c-file-style: "stroustrup"
        !           138:  * indent-tabs-mode: nil
        !           139:  * End:
        !           140:  * end of autoopts/pgusage.c */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>