Annotation of embedaddon/ntp/sntp/libopts/file.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /**
                      3:  * \file file.c
                      4:  *
                      5:  *  Time-stamp:      "2010-07-10 11:00:59 bkorb"
                      6:  *
                      7:  *  This file is part of AutoOpts, a companion to AutoGen.
                      8:  *  AutoOpts is free software.
                      9:  *  AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved
                     10:  *
                     11:  *  AutoOpts is available under any one of two licenses.  The license
                     12:  *  in use must be one of these two and the choice is under the control
                     13:  *  of the user of the license.
                     14:  *
                     15:  *   The GNU Lesser General Public License, version 3 or later
                     16:  *      See the files "COPYING.lgplv3" and "COPYING.gplv3"
                     17:  *
                     18:  *   The Modified Berkeley Software Distribution License
                     19:  *      See the file "COPYING.mbsd"
                     20:  *
                     21:  *  These files have the following md5sums:
                     22:  *
                     23:  *  43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3
                     24:  *  06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3
                     25:  *  66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
                     26:  */
                     27: 
                     28: /*=export_func  optionFileCheck
                     29:  * private:
                     30:  *
                     31:  * what:  Decipher a boolean value
                     32:  * arg:   + tOptions*     + pOpts    + program options descriptor  +
                     33:  * arg:   + tOptDesc*     + pOptDesc + the descriptor for this arg +
                     34:  * arg:   + teOptFileType + ftype    + File handling type          +
                     35:  * arg:   + tuFileMode    + mode     + file open mode (if needed)  +
                     36:  *
                     37:  * doc:
                     38:  *   Make sure the named file conforms with the file type mode.
                     39:  *   The mode specifies if the file must exist, must not exist or may
                     40:  *   (or may not) exist.  The mode may also specify opening the
                     41:  *   file: don't, open just the descriptor (fd), or open as a stream
                     42:  *   (FILE* pointer).
                     43: =*/
                     44: void
                     45: optionFileCheck(tOptions* pOpts, tOptDesc* pOD,
                     46:                 teOptFileType ftype, tuFileMode mode)
                     47: {
                     48:     if (pOpts <= OPTPROC_EMIT_LIMIT) {
                     49:         if (pOpts != OPTPROC_EMIT_USAGE)
                     50:             return;
                     51: 
                     52:         switch (ftype & FTYPE_MODE_EXIST_MASK) {
                     53:         case FTYPE_MODE_MUST_NOT_EXIST:
                     54:             fputs(zFileCannotExist, option_usage_fp);
                     55:             break;
                     56: 
                     57:         case FTYPE_MODE_MUST_EXIST:
                     58:             fputs(zFileMustExist, option_usage_fp);
                     59:             break;
                     60:         }
                     61:         return;
                     62:     }
                     63: 
                     64:     if ((pOD->fOptState & OPTST_RESET) != 0) {
                     65:         if (pOD->optCookie != NULL)
                     66:             AGFREE(pOD->optCookie);
                     67:         return;
                     68:     }
                     69: 
                     70:     {
                     71:         struct stat sb;
                     72: 
                     73:         errno = 0;
                     74: 
                     75:         switch (ftype & FTYPE_MODE_EXIST_MASK) {
                     76:         case FTYPE_MODE_MUST_NOT_EXIST:
                     77:             if (  (stat(pOD->optArg.argString, &sb) == 0)
                     78:                || (errno != ENOENT) ){
                     79:                 if (errno == 0)
                     80:                     errno = EINVAL;
                     81:                 fprintf(stderr, zFSOptError, errno, strerror(errno),
                     82:                         zFSOptErrNoExist, pOD->optArg.argString, pOD->pz_Name);
                     83:                 pOpts->pUsageProc(pOpts, EXIT_FAILURE);
                     84:                 /* NOTREACHED */
                     85:             }
                     86:             /* FALLTHROUGH */
                     87: 
                     88:         default:
                     89:         case FTYPE_MODE_MAY_EXIST:
                     90:         {
                     91:             char * p = strrchr(pOD->optArg.argString, DIRCH);
                     92:             if (p == NULL)
                     93:                 break; /* assume "." always exists. */
                     94: 
                     95:             *p = NUL;
                     96:             if (  (stat(pOD->optArg.argString, &sb) != 0)
                     97:                || (errno = EINVAL, ! S_ISDIR(sb.st_mode)) ){
                     98:                 fprintf(stderr, zFSOptError, errno, strerror(errno),
                     99:                         zFSOptErrMayExist, pOD->optArg.argString, pOD->pz_Name);
                    100:                 pOpts->pUsageProc(pOpts, EXIT_FAILURE);
                    101:                 /* NOTREACHED */
                    102:             }
                    103:             if (p != NULL)
                    104:                 *p = DIRCH;
                    105:             break;
                    106:         }
                    107: 
                    108:         case FTYPE_MODE_MUST_EXIST:
                    109:             if (  (stat(pOD->optArg.argString, &sb) != 0)
                    110:                || (errno = EINVAL, ! S_ISREG(sb.st_mode)) ){
                    111:                 fprintf(stderr, zFSOptError, errno, strerror(errno),
                    112:                         zFSOptErrMustExist, pOD->optArg.argString,
                    113:                         pOD->pz_Name);
                    114:                 pOpts->pUsageProc(pOpts, EXIT_FAILURE);
                    115:                 /* NOTREACHED */
                    116:             }
                    117:             break;
                    118:         }
                    119:     }
                    120: 
                    121:     switch (ftype & FTYPE_MODE_OPEN_MASK) {
                    122:     default:
                    123:     case FTYPE_MODE_NO_OPEN:
                    124:         break;
                    125: 
                    126:     case FTYPE_MODE_OPEN_FD:
                    127:     {
                    128:         int fd = open(pOD->optArg.argString, mode.file_flags);
                    129:         if (fd < 0) {
                    130:             fprintf(stderr, zFSOptError, errno, strerror(errno),
                    131:                     zFSOptErrOpen, pOD->optArg.argString, pOD->pz_Name);
                    132:             pOpts->pUsageProc(pOpts, EXIT_FAILURE);
                    133:             /* NOTREACHED */
                    134:         }
                    135: 
                    136:         if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
                    137:             pOD->optCookie = (void *)pOD->optArg.argString;
                    138:         else
                    139:             AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
                    140: 
                    141:         pOD->optArg.argFd = fd;
                    142:         pOD->fOptState &= ~OPTST_ALLOC_ARG;
                    143:         break;
                    144:     }
                    145: 
                    146:     case FTYPE_MODE_FOPEN_FP:
                    147:     {
                    148:         FILE* fp = fopen(pOD->optArg.argString, mode.file_mode);
                    149:         if (fp == NULL) {
                    150:             fprintf(stderr, zFSOptError, errno, strerror(errno),
                    151:                     zFSOptErrFopen, pOD->optArg.argString, pOD->pz_Name);
                    152:             pOpts->pUsageProc(pOpts, EXIT_FAILURE);
                    153:             /* NOTREACHED */
                    154:         }
                    155: 
                    156:         if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
                    157:             pOD->optCookie = (void *)pOD->optArg.argString;
                    158:         else
                    159:             AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
                    160: 
                    161:         pOD->optArg.argFp = fp;
                    162:         pOD->fOptState &= ~OPTST_ALLOC_ARG;
                    163:         break;
                    164:     }
                    165:     }
                    166: }
                    167: /*
                    168:  * Local Variables:
                    169:  * mode: C
                    170:  * c-file-style: "stroustrup"
                    171:  * indent-tabs-mode: nil
                    172:  * End:
                    173:  * end of autoopts/file.c */

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