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