1*385cc6b4SJerry Jelinek /****************************************************************************** 2*385cc6b4SJerry Jelinek * 3*385cc6b4SJerry Jelinek * Module Name: osunixdir - Unix directory access interfaces 4*385cc6b4SJerry Jelinek * 5*385cc6b4SJerry Jelinek *****************************************************************************/ 6*385cc6b4SJerry Jelinek 7*385cc6b4SJerry Jelinek /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9*385cc6b4SJerry Jelinek * All rights reserved. 10*385cc6b4SJerry Jelinek * 11*385cc6b4SJerry Jelinek * Redistribution and use in source and binary forms, with or without 12*385cc6b4SJerry Jelinek * modification, are permitted provided that the following conditions 13*385cc6b4SJerry Jelinek * are met: 14*385cc6b4SJerry Jelinek * 1. Redistributions of source code must retain the above copyright 15*385cc6b4SJerry Jelinek * notice, this list of conditions, and the following disclaimer, 16*385cc6b4SJerry Jelinek * without modification. 17*385cc6b4SJerry Jelinek * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*385cc6b4SJerry Jelinek * substantially similar to the "NO WARRANTY" disclaimer below 19*385cc6b4SJerry Jelinek * ("Disclaimer") and any redistribution must be conditioned upon 20*385cc6b4SJerry Jelinek * including a substantially similar Disclaimer requirement for further 21*385cc6b4SJerry Jelinek * binary redistribution. 22*385cc6b4SJerry Jelinek * 3. Neither the names of the above-listed copyright holders nor the names 23*385cc6b4SJerry Jelinek * of any contributors may be used to endorse or promote products derived 24*385cc6b4SJerry Jelinek * from this software without specific prior written permission. 25*385cc6b4SJerry Jelinek * 26*385cc6b4SJerry Jelinek * Alternatively, this software may be distributed under the terms of the 27*385cc6b4SJerry Jelinek * GNU General Public License ("GPL") version 2 as published by the Free 28*385cc6b4SJerry Jelinek * Software Foundation. 29*385cc6b4SJerry Jelinek * 30*385cc6b4SJerry Jelinek * NO WARRANTY 31*385cc6b4SJerry Jelinek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*385cc6b4SJerry Jelinek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*385cc6b4SJerry Jelinek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*385cc6b4SJerry Jelinek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*385cc6b4SJerry Jelinek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*385cc6b4SJerry Jelinek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*385cc6b4SJerry Jelinek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*385cc6b4SJerry Jelinek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*385cc6b4SJerry Jelinek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*385cc6b4SJerry Jelinek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*385cc6b4SJerry Jelinek * POSSIBILITY OF SUCH DAMAGES. 42*385cc6b4SJerry Jelinek */ 43*385cc6b4SJerry Jelinek 44*385cc6b4SJerry Jelinek #include "acpi.h" 45*385cc6b4SJerry Jelinek 46*385cc6b4SJerry Jelinek #include <stdio.h> 47*385cc6b4SJerry Jelinek #include <stdlib.h> 48*385cc6b4SJerry Jelinek #include <string.h> 49*385cc6b4SJerry Jelinek #include <dirent.h> 50*385cc6b4SJerry Jelinek #include <fnmatch.h> 51*385cc6b4SJerry Jelinek #include <sys/stat.h> 52*385cc6b4SJerry Jelinek 53*385cc6b4SJerry Jelinek /* 54*385cc6b4SJerry Jelinek * Allocated structure returned from OsOpenDirectory 55*385cc6b4SJerry Jelinek */ 56*385cc6b4SJerry Jelinek typedef struct ExternalFindInfo 57*385cc6b4SJerry Jelinek { 58*385cc6b4SJerry Jelinek char *DirPathname; 59*385cc6b4SJerry Jelinek DIR *DirPtr; 60*385cc6b4SJerry Jelinek char temp_buffer[256]; 61*385cc6b4SJerry Jelinek char *WildcardSpec; 62*385cc6b4SJerry Jelinek char RequestedFileType; 63*385cc6b4SJerry Jelinek 64*385cc6b4SJerry Jelinek } EXTERNAL_FIND_INFO; 65*385cc6b4SJerry Jelinek 66*385cc6b4SJerry Jelinek 67*385cc6b4SJerry Jelinek /******************************************************************************* 68*385cc6b4SJerry Jelinek * 69*385cc6b4SJerry Jelinek * FUNCTION: AcpiOsOpenDirectory 70*385cc6b4SJerry Jelinek * 71*385cc6b4SJerry Jelinek * PARAMETERS: DirPathname - Full pathname to the directory 72*385cc6b4SJerry Jelinek * WildcardSpec - string of the form "*.c", etc. 73*385cc6b4SJerry Jelinek * 74*385cc6b4SJerry Jelinek * RETURN: A directory "handle" to be used in subsequent search operations. 75*385cc6b4SJerry Jelinek * NULL returned on failure. 76*385cc6b4SJerry Jelinek * 77*385cc6b4SJerry Jelinek * DESCRIPTION: Open a directory in preparation for a wildcard search 78*385cc6b4SJerry Jelinek * 79*385cc6b4SJerry Jelinek ******************************************************************************/ 80*385cc6b4SJerry Jelinek 81*385cc6b4SJerry Jelinek void * 82*385cc6b4SJerry Jelinek AcpiOsOpenDirectory ( 83*385cc6b4SJerry Jelinek char *DirPathname, 84*385cc6b4SJerry Jelinek char *WildcardSpec, 85*385cc6b4SJerry Jelinek char RequestedFileType) 86*385cc6b4SJerry Jelinek { 87*385cc6b4SJerry Jelinek EXTERNAL_FIND_INFO *ExternalInfo; 88*385cc6b4SJerry Jelinek DIR *dir; 89*385cc6b4SJerry Jelinek 90*385cc6b4SJerry Jelinek 91*385cc6b4SJerry Jelinek /* Allocate the info struct that will be returned to the caller */ 92*385cc6b4SJerry Jelinek 93*385cc6b4SJerry Jelinek ExternalInfo = calloc (1, sizeof (EXTERNAL_FIND_INFO)); 94*385cc6b4SJerry Jelinek if (!ExternalInfo) 95*385cc6b4SJerry Jelinek { 96*385cc6b4SJerry Jelinek return (NULL); 97*385cc6b4SJerry Jelinek } 98*385cc6b4SJerry Jelinek 99*385cc6b4SJerry Jelinek /* Get the directory stream */ 100*385cc6b4SJerry Jelinek 101*385cc6b4SJerry Jelinek dir = opendir (DirPathname); 102*385cc6b4SJerry Jelinek if (!dir) 103*385cc6b4SJerry Jelinek { 104*385cc6b4SJerry Jelinek fprintf (stderr, "Cannot open directory - %s\n", DirPathname); 105*385cc6b4SJerry Jelinek free (ExternalInfo); 106*385cc6b4SJerry Jelinek return (NULL); 107*385cc6b4SJerry Jelinek } 108*385cc6b4SJerry Jelinek 109*385cc6b4SJerry Jelinek /* Save the info in the return structure */ 110*385cc6b4SJerry Jelinek 111*385cc6b4SJerry Jelinek ExternalInfo->WildcardSpec = WildcardSpec; 112*385cc6b4SJerry Jelinek ExternalInfo->RequestedFileType = RequestedFileType; 113*385cc6b4SJerry Jelinek ExternalInfo->DirPathname = DirPathname; 114*385cc6b4SJerry Jelinek ExternalInfo->DirPtr = dir; 115*385cc6b4SJerry Jelinek return (ExternalInfo); 116*385cc6b4SJerry Jelinek } 117*385cc6b4SJerry Jelinek 118*385cc6b4SJerry Jelinek 119*385cc6b4SJerry Jelinek /******************************************************************************* 120*385cc6b4SJerry Jelinek * 121*385cc6b4SJerry Jelinek * FUNCTION: AcpiOsGetNextFilename 122*385cc6b4SJerry Jelinek * 123*385cc6b4SJerry Jelinek * PARAMETERS: DirHandle - Created via AcpiOsOpenDirectory 124*385cc6b4SJerry Jelinek * 125*385cc6b4SJerry Jelinek * RETURN: Next filename matched. NULL if no more matches. 126*385cc6b4SJerry Jelinek * 127*385cc6b4SJerry Jelinek * DESCRIPTION: Get the next file in the directory that matches the wildcard 128*385cc6b4SJerry Jelinek * specification. 129*385cc6b4SJerry Jelinek * 130*385cc6b4SJerry Jelinek ******************************************************************************/ 131*385cc6b4SJerry Jelinek 132*385cc6b4SJerry Jelinek char * 133*385cc6b4SJerry Jelinek AcpiOsGetNextFilename ( 134*385cc6b4SJerry Jelinek void *DirHandle) 135*385cc6b4SJerry Jelinek { 136*385cc6b4SJerry Jelinek EXTERNAL_FIND_INFO *ExternalInfo = DirHandle; 137*385cc6b4SJerry Jelinek struct dirent *dir_entry; 138*385cc6b4SJerry Jelinek char *temp_str; 139*385cc6b4SJerry Jelinek int str_len; 140*385cc6b4SJerry Jelinek struct stat temp_stat; 141*385cc6b4SJerry Jelinek int err; 142*385cc6b4SJerry Jelinek 143*385cc6b4SJerry Jelinek 144*385cc6b4SJerry Jelinek while ((dir_entry = readdir (ExternalInfo->DirPtr))) 145*385cc6b4SJerry Jelinek { 146*385cc6b4SJerry Jelinek if (!fnmatch (ExternalInfo->WildcardSpec, dir_entry->d_name, 0)) 147*385cc6b4SJerry Jelinek { 148*385cc6b4SJerry Jelinek if (dir_entry->d_name[0] == '.') 149*385cc6b4SJerry Jelinek { 150*385cc6b4SJerry Jelinek continue; 151*385cc6b4SJerry Jelinek } 152*385cc6b4SJerry Jelinek 153*385cc6b4SJerry Jelinek str_len = strlen (dir_entry->d_name) + 154*385cc6b4SJerry Jelinek strlen (ExternalInfo->DirPathname) + 2; 155*385cc6b4SJerry Jelinek 156*385cc6b4SJerry Jelinek temp_str = calloc (str_len, 1); 157*385cc6b4SJerry Jelinek if (!temp_str) 158*385cc6b4SJerry Jelinek { 159*385cc6b4SJerry Jelinek fprintf (stderr, 160*385cc6b4SJerry Jelinek "Could not allocate buffer for temporary string\n"); 161*385cc6b4SJerry Jelinek return (NULL); 162*385cc6b4SJerry Jelinek } 163*385cc6b4SJerry Jelinek 164*385cc6b4SJerry Jelinek strcpy (temp_str, ExternalInfo->DirPathname); 165*385cc6b4SJerry Jelinek strcat (temp_str, "/"); 166*385cc6b4SJerry Jelinek strcat (temp_str, dir_entry->d_name); 167*385cc6b4SJerry Jelinek 168*385cc6b4SJerry Jelinek err = stat (temp_str, &temp_stat); 169*385cc6b4SJerry Jelinek if (err == -1) 170*385cc6b4SJerry Jelinek { 171*385cc6b4SJerry Jelinek fprintf (stderr, 172*385cc6b4SJerry Jelinek "Cannot stat file (should not happen) - %s\n", 173*385cc6b4SJerry Jelinek temp_str); 174*385cc6b4SJerry Jelinek free (temp_str); 175*385cc6b4SJerry Jelinek return (NULL); 176*385cc6b4SJerry Jelinek } 177*385cc6b4SJerry Jelinek 178*385cc6b4SJerry Jelinek free (temp_str); 179*385cc6b4SJerry Jelinek 180*385cc6b4SJerry Jelinek if ((S_ISDIR (temp_stat.st_mode) 181*385cc6b4SJerry Jelinek && (ExternalInfo->RequestedFileType == REQUEST_DIR_ONLY)) 182*385cc6b4SJerry Jelinek || 183*385cc6b4SJerry Jelinek ((!S_ISDIR (temp_stat.st_mode) 184*385cc6b4SJerry Jelinek && ExternalInfo->RequestedFileType == REQUEST_FILE_ONLY))) 185*385cc6b4SJerry Jelinek { 186*385cc6b4SJerry Jelinek /* copy to a temp buffer because dir_entry struct is on the stack */ 187*385cc6b4SJerry Jelinek 188*385cc6b4SJerry Jelinek strcpy (ExternalInfo->temp_buffer, dir_entry->d_name); 189*385cc6b4SJerry Jelinek return (ExternalInfo->temp_buffer); 190*385cc6b4SJerry Jelinek } 191*385cc6b4SJerry Jelinek } 192*385cc6b4SJerry Jelinek } 193*385cc6b4SJerry Jelinek 194*385cc6b4SJerry Jelinek return (NULL); 195*385cc6b4SJerry Jelinek } 196*385cc6b4SJerry Jelinek 197*385cc6b4SJerry Jelinek 198*385cc6b4SJerry Jelinek /******************************************************************************* 199*385cc6b4SJerry Jelinek * 200*385cc6b4SJerry Jelinek * FUNCTION: AcpiOsCloseDirectory 201*385cc6b4SJerry Jelinek * 202*385cc6b4SJerry Jelinek * PARAMETERS: DirHandle - Created via AcpiOsOpenDirectory 203*385cc6b4SJerry Jelinek * 204*385cc6b4SJerry Jelinek * RETURN: None. 205*385cc6b4SJerry Jelinek * 206*385cc6b4SJerry Jelinek * DESCRIPTION: Close the open directory and cleanup. 207*385cc6b4SJerry Jelinek * 208*385cc6b4SJerry Jelinek ******************************************************************************/ 209*385cc6b4SJerry Jelinek 210*385cc6b4SJerry Jelinek void 211*385cc6b4SJerry Jelinek AcpiOsCloseDirectory ( 212*385cc6b4SJerry Jelinek void *DirHandle) 213*385cc6b4SJerry Jelinek { 214*385cc6b4SJerry Jelinek EXTERNAL_FIND_INFO *ExternalInfo = DirHandle; 215*385cc6b4SJerry Jelinek 216*385cc6b4SJerry Jelinek 217*385cc6b4SJerry Jelinek /* Close the directory and free allocations */ 218*385cc6b4SJerry Jelinek 219*385cc6b4SJerry Jelinek closedir (ExternalInfo->DirPtr); 220*385cc6b4SJerry Jelinek free (DirHandle); 221*385cc6b4SJerry Jelinek } 222