📄 fileops.cxx
字号:
/*========================================================================//// fileops.cxx//// Implementation of ISO C rename(),remove(),tmpnam(),tmpfile() functions////========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 2004 eCosCentric Ltd.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos 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 General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): jlarmour// Contributors: // Date: 2004-02-30// Purpose: Implementation of ISO C rename(),remove(),tmpnam(),tmpfile()// Description: // Usage: ////####DESCRIPTIONEND####//======================================================================*/// CONFIGURATION#include <pkgconf/system.h>#include <pkgconf/isoinfra.h>#include <pkgconf/libc_stdio.h> // Configuration header// INCLUDES#include <cyg/infra/cyg_type.h> // Common type definitions and support#include <cyg/infra/cyg_ass.h> // Common assertion functions#include <cyg/infra/cyg_trac.h> // Common tracing functions#include <stdio.h> // Header for this file#include <errno.h> // errno#ifdef CYGPKG_LIBC_STDIO_FILEIO // unix-y functions, e.g. stat,rmdir,unlink,...# include <unistd.h># include <fcntl.h># include <sys/stat.h>#endif#include <cyg/libc/stdio/io.hxx> // I/O definitions#ifdef CYGPKG_POSIX# include <pkgconf/posix.h># include <cyg/posix/export.h>#endif#if defined(CYGINT_ISO_EXIT) && (CYGINT_ISO_EXIT+0)# include <stdlib.h> // used by tmpfile() for atexit()#endif// DEFINES#ifdef CYGPKG_POSIX# define CYG_STDIO_FUNCTION_START() CYG_POSIX_FUNCTION_START()# define CYG_STDIO_FUNCTION_FINISH() CYG_POSIX_FUNCTION_FINISH()#else# define CYG_STDIO_FUNCTION_START() CYG_EMPTY_STATEMENT# define CYG_STDIO_FUNCTION_FINISH() CYG_EMPTY_STATEMENT#endif// Handle entry #define STDIO_ENTRY() \ CYG_REPORT_FUNCTYPE( "returning %d" ); \ CYG_STDIO_FUNCTION_START(); \#define STDIO_RETURN(err) \CYG_MACRO_START \ int __retval = 0; \ CYG_STDIO_FUNCTION_FINISH(); \ if( err != 0 ) __retval = -1, errno = err; \ CYG_REPORT_RETVAL( __retval ); \ return __retval; \CYG_MACRO_END#define STDIO_RETURN_VALUE(val) \CYG_MACRO_START \ CYG_STDIO_FUNCTION_FINISH(); \ CYG_REPORT_RETVAL( val ); \ return val; \CYG_MACRO_END// FUNCTIONS///////////////////////////////////////////////////////////////////////////// remove()__externC int remove( const char *path ) __THROW{ int ret; STDIO_ENTRY(); CYG_CHECK_DATA_PTR( path, "path pointer invalid" );#ifdef CYGPKG_LIBC_STDIO_FILEIO struct stat sbuf; ret = stat( path, &sbuf ); if (0 == ret) { if ( S_ISDIR(sbuf.st_mode) ) { ret = rmdir( path ); } else { ret = unlink( path ); } }#else // !defined(CYGPKG_LIBC_STDIO_FILEIO) ret = ENOSYS;#endif STDIO_RETURN(ret);} // remove()///////////////////////////////////////////////////////////////////////////// rename()//// The File I/O package supplies its own complete version of this, so we// only implement a dummy here.#ifndef CYGPKG_LIBC_STDIO_FILEIO__externC int rename( const char *oldname, const char *newname ) __THROW{ STDIO_ENTRY(); CYG_CHECK_DATA_PTR(oldname, "oldname pointer invalid"); CYG_CHECK_DATA_PTR(newname, "newname pointer invalid"); STDIO_RETURN(ENOSYS);}#endif // ifndef CYGPKG_LIBC_STDIO_FILEIO///////////////////////////////////////////////////////////////////////////// tmpnam()__externC char *tmpnam( char *s ) __THROW{ STDIO_ENTRY(); static char staticbuf[ L_tmpnam ];#if (TMP_MAX < 256) typedef cyg_uint8 counttype;#elif (TMP_MAX < 65536) typedef cyg_uint16 counttype;#else typedef cyg_ucount32 counttype;#endif static counttype count; counttype totaliters=0; int i; if ( NULL != s ) CYG_CHECK_DATA_PTR( s, "supplied string pointer invalid" ); else s = staticbuf; // start off by making it "tmp00000" etc. so we can fill backwards // from end without spaces s[0] = 't'; s[1] = 'm'; s[2] = 'p'; while (totaliters < TMP_MAX) { for (i=3; i < (L_tmpnam-1); i++) { s[i] = '0'; } s[i] = '\0'; counttype counttmp = count; for (i=(L_tmpnam-1); i>2; i--) { const char tohex[] = "0123456789abcdef"; s[i] = tohex[counttmp & 0xf]; counttmp = counttmp >> 4; } count++; count %= TMP_MAX; // cycle round totaliters++; // s now points to a name candidate#ifdef CYGPKG_LIBC_STDIO_FILEIO int fd = open( s, O_RDONLY ); if (fd >= 0) close(fd); else if ( ENOENT == errno ) // we have a winner break;#else break; // no real filesystem, so just go with what we've come up with#endif } if ( totaliters == TMP_MAX ) // oops, looped right the way round s = NULL; STDIO_RETURN_VALUE( s );} // tmpnam()///////////////////////////////////////////////////////////////////////////// tmpfile()__externC FILE *tmpfile( void ) __THROW{ FILE *f; char fname[L_tmpnam]; char *s; STDIO_ENTRY(); s = tmpnam( fname ); if ( s == NULL) f = NULL; else { // fname is now a valid name to use f = fopen( fname, "wb+" );#ifdef CYGPKG_LIBC_STDIO_FILEIO // We can use remove which should mean the file is removed on program // exit.We ignore the return code though - the standard seems to // indicate that the return status from this function is solely // dictated by whether the file could be created. if (f) remove( fname );#endif } STDIO_RETURN_VALUE( f );} // tmpfile()///////////////////////////////////////////////////////////////////////////// EOF fileops.cxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -