1/* Change the protections of file relative to an open directory. 2 Copyright (C) 2006 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software Foundation, 16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 17 18/* written by Jim Meyering */ 19 20#include <config.h> 21 22#include "openat.h" 23#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */ 24#include "save-cwd.h" 25#include "openat-priv.h" 26 27#ifndef HAVE_LCHMOD 28/* Use a different name, to avoid conflicting with any 29 system-supplied declaration. */ 30# undef lchmod 31# define lchmod lchmod_rpl 32static int lchmod (char const *f, mode_t m) { errno = ENOSYS; return -1; } 33#endif 34 35/* Solaris 10 has no function like this. 36 Invoke chmod or lchmod on file, FILE, using mode MODE, in the directory 37 open on descriptor FD. If possible, do it without changing the 38 working directory. Otherwise, resort to using save_cwd/fchdir, 39 then mkdir/restore_cwd. If either the save_cwd or the restore_cwd 40 fails, then give a diagnostic and exit nonzero. 41 Note that an attempt to use a FLAG value of AT_SYMLINK_NOFOLLOW 42 on a system without lchmod support causes this function to fail. */ 43 44#define AT_FUNC_NAME fchmodat 45#define AT_FUNC_F1 lchmod 46#define AT_FUNC_F2 chmod 47#define AT_FUNC_USE_F1_COND flag == AT_SYMLINK_NOFOLLOW 48#define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, int flag 49#define AT_FUNC_POST_FILE_ARGS , mode 50#include "at-func.c" 51