cdrtools/libschily/diropen.c

87 lines
1.7 KiB
C
Raw Permalink Normal View History

2025-06-15 04:19:58 +08:00
/* @(#)diropen.c 1.2 12/12/02 Copyright 2011-2012 J. Schilling */
/*
* open a directory and call fdsetname() if needed
*
* Copyright (c) 2011-2012 J. Schilling
*/
/*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* See the file CDDL.Schily.txt in this distribution for details.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file CDDL.Schily.txt from this distribution.
*/
#include <schily/unistd.h>
#include <schily/types.h>
#include <schily/fcntl.h>
#include <schily/errno.h>
#include <schily/standard.h>
#include <schily/schily.h>
LOCAL int __diropen __PR((const char *name, int oflag));
LOCAL int
__diropen(name, oflag)
const char *name;
int oflag;
{
int f = open(name, oflag);
#if O_DIRECTORY == 0
struct stat sb;
#endif
if (f < 0)
return (f);
#if O_DIRECTORY == 0
fstat(f, &sb);
if (!S_ISDIR(sb.st_mode)) {
close(f);
seterrno(ENOTDIR);
return (-1);
}
#endif
#ifndef HAVE_FCHDIR
if (fdsetname(f, name) < 0) {
close(f);
f = -1;
}
#endif
return (f);
}
/*
* Open for search only, which is sufficient for fchdir() and fstat().
* This avoids permission errors when trying to open a non-readable dir.
*/
EXPORT int
diropen(name)
const char *name;
{
return (__diropen(name, O_SEARCH|O_DIRECTORY|O_NDELAY));
}
/*
* Open for reading (e.g. needed for readdir())
*/
EXPORT int
dirrdopen(name)
const char *name;
{
return (__diropen(name, O_RDONLY|O_DIRECTORY|O_NDELAY));
}
EXPORT int
dirclose(f)
int f;
{
#ifndef HAVE_FCHDIR
fdclosename(f);
#endif
return (close(f));
}