1efcc2a30SJung-uk Kim /****************************************************************************** 2efcc2a30SJung-uk Kim * 3efcc2a30SJung-uk Kim * Module Name: aslfileio - File I/O support 4efcc2a30SJung-uk Kim * 5efcc2a30SJung-uk Kim *****************************************************************************/ 6efcc2a30SJung-uk Kim 7efcc2a30SJung-uk Kim /* 8f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, Intel Corp. 9efcc2a30SJung-uk Kim * All rights reserved. 10efcc2a30SJung-uk Kim * 11efcc2a30SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12efcc2a30SJung-uk Kim * modification, are permitted provided that the following conditions 13efcc2a30SJung-uk Kim * are met: 14efcc2a30SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15efcc2a30SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16efcc2a30SJung-uk Kim * without modification. 17efcc2a30SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18efcc2a30SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19efcc2a30SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20efcc2a30SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21efcc2a30SJung-uk Kim * binary redistribution. 22efcc2a30SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23efcc2a30SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24efcc2a30SJung-uk Kim * from this software without specific prior written permission. 25efcc2a30SJung-uk Kim * 26efcc2a30SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27efcc2a30SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28efcc2a30SJung-uk Kim * Software Foundation. 29efcc2a30SJung-uk Kim * 30efcc2a30SJung-uk Kim * NO WARRANTY 31efcc2a30SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32efcc2a30SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33efcc2a30SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34efcc2a30SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35efcc2a30SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36efcc2a30SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37efcc2a30SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38efcc2a30SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39efcc2a30SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40efcc2a30SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41efcc2a30SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42efcc2a30SJung-uk Kim */ 43efcc2a30SJung-uk Kim 44efcc2a30SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 45313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 46efcc2a30SJung-uk Kim 47efcc2a30SJung-uk Kim #define _COMPONENT ACPI_COMPILER 48efcc2a30SJung-uk Kim ACPI_MODULE_NAME ("aslfileio") 49efcc2a30SJung-uk Kim 50efcc2a30SJung-uk Kim 51efcc2a30SJung-uk Kim /******************************************************************************* 52efcc2a30SJung-uk Kim * 53efcc2a30SJung-uk Kim * FUNCTION: FlFileError 54efcc2a30SJung-uk Kim * 55efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 56efcc2a30SJung-uk Kim * ErrorId - Index into error message array 57efcc2a30SJung-uk Kim * 58efcc2a30SJung-uk Kim * RETURN: None 59efcc2a30SJung-uk Kim * 60efcc2a30SJung-uk Kim * DESCRIPTION: Decode errno to an error message and add the entire error 61efcc2a30SJung-uk Kim * to the error log. 62efcc2a30SJung-uk Kim * 63efcc2a30SJung-uk Kim ******************************************************************************/ 64efcc2a30SJung-uk Kim 65efcc2a30SJung-uk Kim void 66efcc2a30SJung-uk Kim FlFileError ( 67efcc2a30SJung-uk Kim UINT32 FileId, 68efcc2a30SJung-uk Kim UINT8 ErrorId) 69efcc2a30SJung-uk Kim { 70efcc2a30SJung-uk Kim 711c0e1b6dSJung-uk Kim sprintf (MsgBuffer, "\"%s\" (%s) - %s", Gbl_Files[FileId].Filename, 721c0e1b6dSJung-uk Kim Gbl_Files[FileId].Description, strerror (errno)); 73f8146b88SJung-uk Kim 74efcc2a30SJung-uk Kim AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, MsgBuffer); 75efcc2a30SJung-uk Kim } 76efcc2a30SJung-uk Kim 77efcc2a30SJung-uk Kim 78efcc2a30SJung-uk Kim /******************************************************************************* 79efcc2a30SJung-uk Kim * 80efcc2a30SJung-uk Kim * FUNCTION: FlOpenFile 81efcc2a30SJung-uk Kim * 82efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 83efcc2a30SJung-uk Kim * Filename - file pathname to open 84efcc2a30SJung-uk Kim * Mode - Open mode for fopen 85efcc2a30SJung-uk Kim * 86efcc2a30SJung-uk Kim * RETURN: None 87efcc2a30SJung-uk Kim * 88efcc2a30SJung-uk Kim * DESCRIPTION: Open a file. 89efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 90efcc2a30SJung-uk Kim * 91efcc2a30SJung-uk Kim ******************************************************************************/ 92efcc2a30SJung-uk Kim 93efcc2a30SJung-uk Kim void 94efcc2a30SJung-uk Kim FlOpenFile ( 95efcc2a30SJung-uk Kim UINT32 FileId, 96efcc2a30SJung-uk Kim char *Filename, 97efcc2a30SJung-uk Kim char *Mode) 98efcc2a30SJung-uk Kim { 99efcc2a30SJung-uk Kim FILE *File; 100efcc2a30SJung-uk Kim 101efcc2a30SJung-uk Kim 1021c0e1b6dSJung-uk Kim Gbl_Files[FileId].Filename = Filename; 1031c0e1b6dSJung-uk Kim Gbl_Files[FileId].Handle = NULL; 1041c0e1b6dSJung-uk Kim 105efcc2a30SJung-uk Kim File = fopen (Filename, Mode); 106efcc2a30SJung-uk Kim if (!File) 107efcc2a30SJung-uk Kim { 108efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_OPEN); 109efcc2a30SJung-uk Kim AslAbort (); 110efcc2a30SJung-uk Kim } 111efcc2a30SJung-uk Kim 112efcc2a30SJung-uk Kim Gbl_Files[FileId].Handle = File; 113efcc2a30SJung-uk Kim } 114efcc2a30SJung-uk Kim 115efcc2a30SJung-uk Kim 116efcc2a30SJung-uk Kim /******************************************************************************* 117efcc2a30SJung-uk Kim * 118efcc2a30SJung-uk Kim * FUNCTION: FlGetFileSize 119efcc2a30SJung-uk Kim * 120efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 121efcc2a30SJung-uk Kim * 122efcc2a30SJung-uk Kim * RETURN: File Size 123efcc2a30SJung-uk Kim * 124313a0c13SJung-uk Kim * DESCRIPTION: Get current file size. Uses common seek-to-EOF function. 125313a0c13SJung-uk Kim * File must be open. Aborts compiler on error. 126efcc2a30SJung-uk Kim * 127efcc2a30SJung-uk Kim ******************************************************************************/ 128efcc2a30SJung-uk Kim 129efcc2a30SJung-uk Kim UINT32 130efcc2a30SJung-uk Kim FlGetFileSize ( 131efcc2a30SJung-uk Kim UINT32 FileId) 132efcc2a30SJung-uk Kim { 133efcc2a30SJung-uk Kim UINT32 FileSize; 134efcc2a30SJung-uk Kim 135efcc2a30SJung-uk Kim 136313a0c13SJung-uk Kim FileSize = CmGetFileSize (Gbl_Files[FileId].Handle); 137313a0c13SJung-uk Kim if (FileSize == ACPI_UINT32_MAX) 138313a0c13SJung-uk Kim { 139313a0c13SJung-uk Kim AslAbort(); 140313a0c13SJung-uk Kim } 141efcc2a30SJung-uk Kim 142efcc2a30SJung-uk Kim return (FileSize); 143efcc2a30SJung-uk Kim } 144efcc2a30SJung-uk Kim 145efcc2a30SJung-uk Kim 146efcc2a30SJung-uk Kim /******************************************************************************* 147efcc2a30SJung-uk Kim * 148efcc2a30SJung-uk Kim * FUNCTION: FlReadFile 149efcc2a30SJung-uk Kim * 150efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 151efcc2a30SJung-uk Kim * Buffer - Where to place the data 152efcc2a30SJung-uk Kim * Length - Amount to read 153efcc2a30SJung-uk Kim * 154efcc2a30SJung-uk Kim * RETURN: Status. AE_ERROR indicates EOF. 155efcc2a30SJung-uk Kim * 156efcc2a30SJung-uk Kim * DESCRIPTION: Read data from an open file. 157efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 158efcc2a30SJung-uk Kim * 159efcc2a30SJung-uk Kim ******************************************************************************/ 160efcc2a30SJung-uk Kim 161efcc2a30SJung-uk Kim ACPI_STATUS 162efcc2a30SJung-uk Kim FlReadFile ( 163efcc2a30SJung-uk Kim UINT32 FileId, 164efcc2a30SJung-uk Kim void *Buffer, 165efcc2a30SJung-uk Kim UINT32 Length) 166efcc2a30SJung-uk Kim { 167efcc2a30SJung-uk Kim UINT32 Actual; 168efcc2a30SJung-uk Kim 169efcc2a30SJung-uk Kim 170efcc2a30SJung-uk Kim /* Read and check for error */ 171efcc2a30SJung-uk Kim 172efcc2a30SJung-uk Kim Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle); 173efcc2a30SJung-uk Kim if (Actual < Length) 174efcc2a30SJung-uk Kim { 175efcc2a30SJung-uk Kim if (feof (Gbl_Files[FileId].Handle)) 176efcc2a30SJung-uk Kim { 177efcc2a30SJung-uk Kim /* End-of-file, just return error */ 178efcc2a30SJung-uk Kim 179efcc2a30SJung-uk Kim return (AE_ERROR); 180efcc2a30SJung-uk Kim } 181efcc2a30SJung-uk Kim 182efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_READ); 183efcc2a30SJung-uk Kim AslAbort (); 184efcc2a30SJung-uk Kim } 185efcc2a30SJung-uk Kim 186efcc2a30SJung-uk Kim return (AE_OK); 187efcc2a30SJung-uk Kim } 188efcc2a30SJung-uk Kim 189efcc2a30SJung-uk Kim 190efcc2a30SJung-uk Kim /******************************************************************************* 191efcc2a30SJung-uk Kim * 192efcc2a30SJung-uk Kim * FUNCTION: FlWriteFile 193efcc2a30SJung-uk Kim * 194efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 195efcc2a30SJung-uk Kim * Buffer - Data to write 196efcc2a30SJung-uk Kim * Length - Amount of data to write 197efcc2a30SJung-uk Kim * 198efcc2a30SJung-uk Kim * RETURN: None 199efcc2a30SJung-uk Kim * 200efcc2a30SJung-uk Kim * DESCRIPTION: Write data to an open file. 201efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 202efcc2a30SJung-uk Kim * 203efcc2a30SJung-uk Kim ******************************************************************************/ 204efcc2a30SJung-uk Kim 205efcc2a30SJung-uk Kim void 206efcc2a30SJung-uk Kim FlWriteFile ( 207efcc2a30SJung-uk Kim UINT32 FileId, 208efcc2a30SJung-uk Kim void *Buffer, 209efcc2a30SJung-uk Kim UINT32 Length) 210efcc2a30SJung-uk Kim { 211efcc2a30SJung-uk Kim UINT32 Actual; 212efcc2a30SJung-uk Kim 213efcc2a30SJung-uk Kim 214efcc2a30SJung-uk Kim /* Write and check for error */ 215efcc2a30SJung-uk Kim 216efcc2a30SJung-uk Kim Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle); 217efcc2a30SJung-uk Kim if (Actual != Length) 218efcc2a30SJung-uk Kim { 219efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_WRITE); 220efcc2a30SJung-uk Kim AslAbort (); 221efcc2a30SJung-uk Kim } 2225ef50723SJung-uk Kim 2235ef50723SJung-uk Kim if ((FileId == ASL_FILE_PREPROCESSOR) && Gbl_PreprocessorOutputFlag) 2245ef50723SJung-uk Kim { 2255ef50723SJung-uk Kim /* Duplicate the output to the user preprocessor (.i) file */ 2265ef50723SJung-uk Kim 2275ef50723SJung-uk Kim Actual = fwrite ((char *) Buffer, 1, Length, 2285ef50723SJung-uk Kim Gbl_Files[ASL_FILE_PREPROCESSOR_USER].Handle); 2295ef50723SJung-uk Kim if (Actual != Length) 2305ef50723SJung-uk Kim { 2315ef50723SJung-uk Kim FlFileError (FileId, ASL_MSG_WRITE); 2325ef50723SJung-uk Kim AslAbort (); 2335ef50723SJung-uk Kim } 2345ef50723SJung-uk Kim } 235efcc2a30SJung-uk Kim } 236efcc2a30SJung-uk Kim 237efcc2a30SJung-uk Kim 238efcc2a30SJung-uk Kim /******************************************************************************* 239efcc2a30SJung-uk Kim * 240efcc2a30SJung-uk Kim * FUNCTION: FlPrintFile 241efcc2a30SJung-uk Kim * 242efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 243efcc2a30SJung-uk Kim * Format - Printf format string 244efcc2a30SJung-uk Kim * ... - Printf arguments 245efcc2a30SJung-uk Kim * 246efcc2a30SJung-uk Kim * RETURN: None 247efcc2a30SJung-uk Kim * 248efcc2a30SJung-uk Kim * DESCRIPTION: Formatted write to an open file. 249efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 250efcc2a30SJung-uk Kim * 251efcc2a30SJung-uk Kim ******************************************************************************/ 252efcc2a30SJung-uk Kim 253efcc2a30SJung-uk Kim void 254efcc2a30SJung-uk Kim FlPrintFile ( 255efcc2a30SJung-uk Kim UINT32 FileId, 256efcc2a30SJung-uk Kim char *Format, 257efcc2a30SJung-uk Kim ...) 258efcc2a30SJung-uk Kim { 259efcc2a30SJung-uk Kim INT32 Actual; 260efcc2a30SJung-uk Kim va_list Args; 261efcc2a30SJung-uk Kim 262efcc2a30SJung-uk Kim 263efcc2a30SJung-uk Kim va_start (Args, Format); 264efcc2a30SJung-uk Kim Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args); 265efcc2a30SJung-uk Kim va_end (Args); 266efcc2a30SJung-uk Kim 267efcc2a30SJung-uk Kim if (Actual == -1) 268efcc2a30SJung-uk Kim { 269efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_WRITE); 270efcc2a30SJung-uk Kim AslAbort (); 271efcc2a30SJung-uk Kim } 2725ef50723SJung-uk Kim 273f8146b88SJung-uk Kim if ((FileId == ASL_FILE_PREPROCESSOR) && 274f8146b88SJung-uk Kim Gbl_PreprocessorOutputFlag) 2755ef50723SJung-uk Kim { 2765ef50723SJung-uk Kim /* 2775ef50723SJung-uk Kim * Duplicate the output to the user preprocessor (.i) file, 2785ef50723SJung-uk Kim * except: no #line directives. 2795ef50723SJung-uk Kim */ 2805ef50723SJung-uk Kim if (!strncmp (Format, "#line", 5)) 2815ef50723SJung-uk Kim { 2825ef50723SJung-uk Kim return; 2835ef50723SJung-uk Kim } 2845ef50723SJung-uk Kim 2855ef50723SJung-uk Kim va_start (Args, Format); 2865ef50723SJung-uk Kim Actual = vfprintf (Gbl_Files[ASL_FILE_PREPROCESSOR_USER].Handle, 2875ef50723SJung-uk Kim Format, Args); 2885ef50723SJung-uk Kim va_end (Args); 2895ef50723SJung-uk Kim 2905ef50723SJung-uk Kim if (Actual == -1) 2915ef50723SJung-uk Kim { 2925ef50723SJung-uk Kim FlFileError (FileId, ASL_MSG_WRITE); 2935ef50723SJung-uk Kim AslAbort (); 2945ef50723SJung-uk Kim } 2955ef50723SJung-uk Kim } 296efcc2a30SJung-uk Kim } 297efcc2a30SJung-uk Kim 298efcc2a30SJung-uk Kim 299efcc2a30SJung-uk Kim /******************************************************************************* 300efcc2a30SJung-uk Kim * 301efcc2a30SJung-uk Kim * FUNCTION: FlSeekFile 302efcc2a30SJung-uk Kim * 303efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 304efcc2a30SJung-uk Kim * Offset - Absolute byte offset in file 305efcc2a30SJung-uk Kim * 306efcc2a30SJung-uk Kim * RETURN: None 307efcc2a30SJung-uk Kim * 308efcc2a30SJung-uk Kim * DESCRIPTION: Seek to absolute offset. 309efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 310efcc2a30SJung-uk Kim * 311efcc2a30SJung-uk Kim ******************************************************************************/ 312efcc2a30SJung-uk Kim 313efcc2a30SJung-uk Kim void 314efcc2a30SJung-uk Kim FlSeekFile ( 315efcc2a30SJung-uk Kim UINT32 FileId, 316efcc2a30SJung-uk Kim long Offset) 317efcc2a30SJung-uk Kim { 318efcc2a30SJung-uk Kim int Error; 319efcc2a30SJung-uk Kim 320efcc2a30SJung-uk Kim 321efcc2a30SJung-uk Kim Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET); 322efcc2a30SJung-uk Kim if (Error) 323efcc2a30SJung-uk Kim { 324efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_SEEK); 325efcc2a30SJung-uk Kim AslAbort (); 326efcc2a30SJung-uk Kim } 327efcc2a30SJung-uk Kim } 328efcc2a30SJung-uk Kim 329efcc2a30SJung-uk Kim 330efcc2a30SJung-uk Kim /******************************************************************************* 331efcc2a30SJung-uk Kim * 332efcc2a30SJung-uk Kim * FUNCTION: FlCloseFile 333efcc2a30SJung-uk Kim * 334efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 335efcc2a30SJung-uk Kim * 336efcc2a30SJung-uk Kim * RETURN: None 337efcc2a30SJung-uk Kim * 338efcc2a30SJung-uk Kim * DESCRIPTION: Close an open file. Aborts compiler on error 339efcc2a30SJung-uk Kim * 340efcc2a30SJung-uk Kim ******************************************************************************/ 341efcc2a30SJung-uk Kim 342efcc2a30SJung-uk Kim void 343efcc2a30SJung-uk Kim FlCloseFile ( 344efcc2a30SJung-uk Kim UINT32 FileId) 345efcc2a30SJung-uk Kim { 346efcc2a30SJung-uk Kim int Error; 347efcc2a30SJung-uk Kim 348efcc2a30SJung-uk Kim 349efcc2a30SJung-uk Kim if (!Gbl_Files[FileId].Handle) 350efcc2a30SJung-uk Kim { 351efcc2a30SJung-uk Kim return; 352efcc2a30SJung-uk Kim } 353efcc2a30SJung-uk Kim 354efcc2a30SJung-uk Kim Error = fclose (Gbl_Files[FileId].Handle); 355efcc2a30SJung-uk Kim if (Error) 356efcc2a30SJung-uk Kim { 357efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_CLOSE); 358efcc2a30SJung-uk Kim AslAbort (); 359efcc2a30SJung-uk Kim } 360efcc2a30SJung-uk Kim 361313a0c13SJung-uk Kim /* Do not clear/free the filename string */ 362313a0c13SJung-uk Kim 363efcc2a30SJung-uk Kim Gbl_Files[FileId].Handle = NULL; 364efcc2a30SJung-uk Kim return; 365efcc2a30SJung-uk Kim } 366efcc2a30SJung-uk Kim 367efcc2a30SJung-uk Kim 368efcc2a30SJung-uk Kim /******************************************************************************* 369efcc2a30SJung-uk Kim * 370efcc2a30SJung-uk Kim * FUNCTION: FlDeleteFile 371efcc2a30SJung-uk Kim * 372efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 373efcc2a30SJung-uk Kim * 374efcc2a30SJung-uk Kim * RETURN: None 375efcc2a30SJung-uk Kim * 376efcc2a30SJung-uk Kim * DESCRIPTION: Delete a file. 377efcc2a30SJung-uk Kim * 378efcc2a30SJung-uk Kim ******************************************************************************/ 379efcc2a30SJung-uk Kim 380efcc2a30SJung-uk Kim void 381efcc2a30SJung-uk Kim FlDeleteFile ( 382efcc2a30SJung-uk Kim UINT32 FileId) 383efcc2a30SJung-uk Kim { 384efcc2a30SJung-uk Kim ASL_FILE_INFO *Info = &Gbl_Files[FileId]; 385efcc2a30SJung-uk Kim 386efcc2a30SJung-uk Kim 387efcc2a30SJung-uk Kim if (!Info->Filename) 388efcc2a30SJung-uk Kim { 389efcc2a30SJung-uk Kim return; 390efcc2a30SJung-uk Kim } 391efcc2a30SJung-uk Kim 392efcc2a30SJung-uk Kim if (remove (Info->Filename)) 393efcc2a30SJung-uk Kim { 394efcc2a30SJung-uk Kim printf ("%s (%s file) ", 395efcc2a30SJung-uk Kim Info->Filename, Info->Description); 396efcc2a30SJung-uk Kim perror ("Could not delete"); 397efcc2a30SJung-uk Kim } 398efcc2a30SJung-uk Kim 399efcc2a30SJung-uk Kim Info->Filename = NULL; 400efcc2a30SJung-uk Kim return; 401efcc2a30SJung-uk Kim } 402