void
optionFileCheck(tOptions* pOpts, tOptDesc* pOD,
teOptFileType ftype, tuFileMode mode)
{
if (pOpts <= OPTPROC_EMIT_LIMIT) {
if (pOpts != OPTPROC_EMIT_USAGE)
return;
switch (ftype & FTYPE_MODE_EXIST_MASK) {
case FTYPE_MODE_MUST_NOT_EXIST:
fputs(zFileCannotExist, option_usage_fp);
break;
case FTYPE_MODE_MUST_EXIST:
fputs(zFileMustExist, option_usage_fp);
break;
}
return;
}
if ((pOD->fOptState & OPTST_RESET) != 0) {
if (pOD->optCookie != NULL)
AGFREE(pOD->optCookie);
return;
}
{
struct stat sb;
errno = 0;
switch (ftype & FTYPE_MODE_EXIST_MASK) {
case FTYPE_MODE_MUST_NOT_EXIST:
if ( (stat(pOD->optArg.argString, &sb) == 0)
|| (errno != ENOENT) ){
if (errno == 0)
errno = EINVAL;
fprintf(stderr, zFSOptError, errno, strerror(errno),
zFSOptErrNoExist, pOD->optArg.argString, pOD->pz_Name);
pOpts->pUsageProc(pOpts, EXIT_FAILURE);
}
default:
case FTYPE_MODE_MAY_EXIST:
{
char * p = strrchr(pOD->optArg.argString, DIRCH);
if (p != NULL)
*p = NUL;
if ( (stat(pOD->optArg.argString, &sb) != 0)
|| (errno = EINVAL, ! S_ISDIR(sb.st_mode)) ){
fprintf(stderr, zFSOptError, errno, strerror(errno),
zFSOptErrMayExist, pOD->optArg.argString, pOD->pz_Name);
pOpts->pUsageProc(pOpts, EXIT_FAILURE);
}
if (p != NULL)
*p = DIRCH;
break;
}
case FTYPE_MODE_MUST_EXIST:
if ( (stat(pOD->optArg.argString, &sb) != 0)
|| (errno = EINVAL, ! S_ISREG(sb.st_mode)) ){
fprintf(stderr, zFSOptError, errno, strerror(errno),
zFSOptErrMustExist, pOD->optArg.argString,
pOD->pz_Name);
pOpts->pUsageProc(pOpts, EXIT_FAILURE);
}
break;
}
}
switch (ftype & FTYPE_MODE_OPEN_MASK) {
default:
case FTYPE_MODE_NO_OPEN:
break;
case FTYPE_MODE_OPEN_FD:
{
int fd = open(pOD->optArg.argString, mode.file_flags);
if (fd < 0) {
fprintf(stderr, zFSOptError, errno, strerror(errno),
zFSOptErrOpen, pOD->optArg.argString, pOD->pz_Name);
pOpts->pUsageProc(pOpts, EXIT_FAILURE);
}
if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
pOD->optCookie = (void *)pOD->optArg.argString;
else
AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
pOD->optArg.argFd = fd;
pOD->fOptState &= ~OPTST_ALLOC_ARG;
break;
}
case FTYPE_MODE_FOPEN_FP:
{
FILE* fp = fopen(pOD->optArg.argString, mode.file_mode);
if (fp == NULL) {
fprintf(stderr, zFSOptError, errno, strerror(errno),
zFSOptErrFopen, pOD->optArg.argString, pOD->pz_Name);
pOpts->pUsageProc(pOpts, EXIT_FAILURE);
}
if ((pOD->fOptState & OPTST_ALLOC_ARG) != 0)
pOD->optCookie = (void *)pOD->optArg.argString;
else
AGDUPSTR(pOD->optCookie, pOD->optArg.argString, "file name");
pOD->optArg.argFp = fp;
pOD->fOptState &= ~OPTST_ALLOC_ARG;
break;
}
}
}