-
Simon McVittie authored
This is useful in the same situations rewinddir() is. My use-case right now is to remove some of the files from a directory, then go back through the directory removing symlinks that pointed to those files. Signed-off-by:
Simon McVittie <smcv@collabora.com> Forwarded: https://gitlab.gnome.org/GNOME/libglnx/-/merge_requests/25
Simon McVittie authoredThis is useful in the same situations rewinddir() is. My use-case right now is to remove some of the files from a directory, then go back through the directory removing symlinks that pointed to those files. Signed-off-by:
Simon McVittie <smcv@collabora.com> Forwarded: https://gitlab.gnome.org/GNOME/libglnx/-/merge_requests/25
glnx-dirfd.c 13.16 KiB
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2014,2015 Colin Walters <walters@verbum.org>.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <string.h>
#include <glnx-dirfd.h>
#include <glnx-fdio.h>
#include <glnx-errors.h>
#include <glnx-local-alloc.h>
#include <glnx-shutil.h>
/**
* glnx_opendirat_with_errno:
* @dfd: File descriptor for origin directory
* @name: Pathname, relative to @dfd
* @follow: Whether or not to follow symbolic links
*
* Use openat() to open a directory, using a standard set of flags.
* This function sets errno.
*/
int
glnx_opendirat_with_errno (int dfd,
const char *path,
gboolean follow)
{
int flags = O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC | O_NOCTTY;
if (!follow)
flags |= O_NOFOLLOW;
dfd = glnx_dirfd_canonicalize (dfd);
return openat (dfd, path, flags);
}
/**
* glnx_opendirat:
* @dfd: File descriptor for origin directory
* @path: Pathname, relative to @dfd
* @follow: Whether or not to follow symbolic links
* @error: Error
*
* Use openat() to open a directory, using a standard set of flags.
*/
gboolean
glnx_opendirat (int dfd,
const char *path,
gboolean follow,
int *out_fd,
GError **error)
{
int ret = glnx_opendirat_with_errno (dfd, path, follow);