Annotation of embedaddon/ntp/sntp/libopts/pgusage.c, revision 1.1.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>