fsaccess.c revision 258945
1239922Sgonzo/* 2239922Sgonzo * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") 3239922Sgonzo * Copyright (C) 2000, 2001 Internet Software Consortium. 4239922Sgonzo * 5239922Sgonzo * Permission to use, copy, modify, and/or distribute this software for any 6239922Sgonzo * purpose with or without fee is hereby granted, provided that the above 7239922Sgonzo * copyright notice and this permission notice appear in all copies. 8239922Sgonzo * 9239922Sgonzo * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10239922Sgonzo * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11239922Sgonzo * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12239922Sgonzo * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13239922Sgonzo * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14239922Sgonzo * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15239922Sgonzo * PERFORMANCE OF THIS SOFTWARE. 16239922Sgonzo */ 17239922Sgonzo 18239922Sgonzo/* $Id: fsaccess.c,v 1.13 2007/06/19 23:47:18 tbox Exp $ */ 19239922Sgonzo 20239922Sgonzo#include <config.h> 21239922Sgonzo 22239922Sgonzo#include <sys/types.h> 23239922Sgonzo#include <sys/stat.h> 24239922Sgonzo 25239922Sgonzo#include <errno.h> 26239922Sgonzo 27239922Sgonzo#include "errno2result.h" 28239922Sgonzo 29239922Sgonzo/*! \file 30239922Sgonzo * \brief 31239922Sgonzo * The OS-independent part of the API is in lib/isc. 32239922Sgonzo */ 33239922Sgonzo#include "../fsaccess.c" 34239922Sgonzo 35239922Sgonzoisc_result_t 36239922Sgonzoisc_fsaccess_set(const char *path, isc_fsaccess_t access) { 37239922Sgonzo struct stat statb; 38239922Sgonzo mode_t mode; 39239922Sgonzo isc_boolean_t is_dir = ISC_FALSE; 40239922Sgonzo isc_fsaccess_t bits; 41239922Sgonzo isc_result_t result; 42239922Sgonzo 43239922Sgonzo if (stat(path, &statb) != 0) 44239922Sgonzo return (isc__errno2result(errno)); 45239922Sgonzo 46239922Sgonzo if ((statb.st_mode & S_IFDIR) != 0) 47239922Sgonzo is_dir = ISC_TRUE; 48239922Sgonzo else if ((statb.st_mode & S_IFREG) == 0) 49239922Sgonzo return (ISC_R_INVALIDFILE); 50239922Sgonzo 51253006Srpaulo result = check_bad_bits(access, is_dir); 52239922Sgonzo if (result != ISC_R_SUCCESS) 53239922Sgonzo return (result); 54253006Srpaulo 55253006Srpaulo /* 56239922Sgonzo * Done with checking bad bits. Set mode_t. 57239922Sgonzo */ 58239922Sgonzo mode = 0; 59239922Sgonzo 60239922Sgonzo#define SET_AND_CLEAR1(modebit) \ 61239922Sgonzo if ((access & bits) != 0) { \ 62239922Sgonzo mode |= modebit; \ 63239922Sgonzo access &= ~bits; \ 64239922Sgonzo } 65239922Sgonzo#define SET_AND_CLEAR(user, group, other) \ 66239922Sgonzo SET_AND_CLEAR1(user); \ 67239922Sgonzo bits <<= STEP; \ 68239922Sgonzo SET_AND_CLEAR1(group); \ 69239922Sgonzo bits <<= STEP; \ 70253006Srpaulo SET_AND_CLEAR1(other); 71253006Srpaulo 72239922Sgonzo bits = ISC_FSACCESS_READ | ISC_FSACCESS_LISTDIRECTORY; 73239922Sgonzo 74253006Srpaulo SET_AND_CLEAR(S_IRUSR, S_IRGRP, S_IROTH); 75253006Srpaulo 76239922Sgonzo bits = ISC_FSACCESS_WRITE | 77239922Sgonzo ISC_FSACCESS_CREATECHILD | 78239922Sgonzo ISC_FSACCESS_DELETECHILD; 79239922Sgonzo 80239922Sgonzo SET_AND_CLEAR(S_IWUSR, S_IWGRP, S_IWOTH); 81239922Sgonzo 82239922Sgonzo bits = ISC_FSACCESS_EXECUTE | 83239922Sgonzo ISC_FSACCESS_ACCESSCHILD; 84239922Sgonzo 85239922Sgonzo SET_AND_CLEAR(S_IXUSR, S_IXGRP, S_IXOTH); 86239922Sgonzo 87239922Sgonzo INSIST(access == 0); 88239922Sgonzo 89239922Sgonzo if (chmod(path, mode) < 0) 90239922Sgonzo return (isc__errno2result(errno)); 91239922Sgonzo 92239922Sgonzo return (ISC_R_SUCCESS); 93239922Sgonzo} 94239922Sgonzo