⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bfile.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C++; tab-width: 8; c-basic-offset: 8 -*- *//*  * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is the Netscape Portable Runtime (NSPR). *  * The Initial Developer of the Original Code is Netscape * Communications Corporation.  Portions created by Netscape are  * Copyright (C) 1998-2000 Netscape Communications Corporation.  All * Rights Reserved. *  * Contributor(s): *  * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable  * instead of those above.  If you wish to allow use of your  * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL.  If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. */#include "primpl.h"/*** Global lock variable used to bracket calls into rusty libraries that** aren't thread safe (like libc, libX, etc).*/static PRLock *_pr_rename_lock = NULL; void_MD_InitIO (void){}PRStatus_MD_open_dir (_MDDir *md,const char *name){int err;	md->d = opendir(name);	if (!md->d) {		err = _MD_ERRNO();		_PR_MD_MAP_OPENDIR_ERROR(err);		return PR_FAILURE;	}	return PR_SUCCESS;}char*_MD_read_dir (_MDDir *md, PRIntn flags){struct dirent *de;int err;	for (;;) {		/*		 * XXX: readdir() is not MT-safe		 */		de = readdir(md->d);		if (!de) {			err = _MD_ERRNO();			_PR_MD_MAP_READDIR_ERROR(err);			return 0;		}		if ((flags & PR_SKIP_DOT) &&		    (de->d_name[0] == '.') && (de->d_name[1] == 0))			continue;		if ((flags & PR_SKIP_DOT_DOT) &&		    (de->d_name[0] == '.') && (de->d_name[1] == '.') &&		    (de->d_name[2] == 0))			continue;		if ((flags & PR_SKIP_HIDDEN) && (de->d_name[1] == '.'))			continue;		break;	}	return de->d_name;}PRInt32_MD_close_dir (_MDDir *md){int rv = 0, err;	if (md->d) {		rv = closedir(md->d);		if (rv == -1) {			err = _MD_ERRNO();			_PR_MD_MAP_CLOSEDIR_ERROR(err);		}	}	return(rv);}void_MD_make_nonblock (PRFileDesc *fd){	int blocking = 1;	setsockopt(fd->secret->md.osfd, SOL_SOCKET, SO_NONBLOCK, &blocking, sizeof(blocking));}PRStatus_MD_set_fd_inheritable (PRFileDesc *fd, PRBool inheritable){        int rv;	        rv = fcntl(fd->secret->md.osfd, F_SETFD, inheritable ? 0 : FD_CLOEXEC);        if (-1 == rv) {                PR_SetError(PR_UNKNOWN_ERROR, _MD_ERRNO());                return PR_FAILURE;        }        return PR_SUCCESS;}void_MD_init_fd_inheritable (PRFileDesc *fd, PRBool imported){	if (imported) {		fd->secret->inheritable = _PR_TRI_UNKNOWN;	} else {		int flags = fcntl(fd->secret->md.osfd, F_GETFD, 0);		if (flags == -1) {			PR_SetError(PR_UNKNOWN_ERROR, _MD_ERRNO());			return;		}		fd->secret->inheritable = (flags & FD_CLOEXEC) ? 			_PR_TRI_TRUE : _PR_TRI_FALSE;	}}void_MD_query_fd_inheritable (PRFileDesc *fd){	int flags;		PR_ASSERT(_PR_TRI_UNKNOWN == fd->secret->inheritable);	flags = fcntl(fd->secret->md.osfd, F_GETFD, 0);	PR_ASSERT(-1 != flags);	fd->secret->inheritable = (flags & FD_CLOEXEC) ?		_PR_TRI_FALSE : _PR_TRI_TRUE;}PRInt32_MD_open (const char *name, PRIntn flags, PRIntn mode){	PRInt32 osflags;	PRInt32 rv, err;	if (flags & PR_RDWR) {		osflags = O_RDWR;	} else if (flags & PR_WRONLY) {		osflags = O_WRONLY;	} else {		osflags = O_RDONLY;	}        if (flags & PR_APPEND)                osflags |= O_APPEND;        if (flags & PR_TRUNCATE)                osflags |= O_TRUNC;        if (flags & PR_SYNC) {/* Ummmm.  BeOS doesn't appear to   support sync in any way shape or   form. */		return PR_NOT_IMPLEMENTED_ERROR;        }	/*	** On creations we hold the 'create' lock in order to enforce	** the semantics of PR_Rename. (see the latter for more details)	*/	if (flags & PR_CREATE_FILE)	{		osflags |= O_CREAT ;		if (NULL !=_pr_rename_lock)		    PR_Lock(_pr_rename_lock);	}        rv = open(name, osflags, mode);        if (rv < 0) {                err = _MD_ERRNO();                _PR_MD_MAP_OPEN_ERROR(err);        }                                                                          if ((flags & PR_CREATE_FILE) && (NULL !=_pr_rename_lock))        PR_Unlock(_pr_rename_lock);        return rv;}PRInt32_MD_close_file (PRInt32 osfd){PRInt32 rv, err;	rv = close(osfd);	if (rv == -1) {		err = _MD_ERRNO();		_PR_MD_MAP_CLOSE_ERROR(err);	}	return(rv);}PRInt32_MD_read (PRFileDesc *fd, void *buf, PRInt32 amount){    PRInt32 rv, err;    PRInt32 osfd = fd->secret->md.osfd;    rv = read( osfd, buf, amount );    if (rv < 0) {	err = _MD_ERRNO();	_PR_MD_MAP_READ_ERROR(err);    }    return(rv);}PRInt32_MD_write (PRFileDesc *fd, const void *buf, PRInt32 amount){    PRInt32 rv, err;    PRInt32 osfd = fd->secret->md.osfd;    rv = write( osfd, buf, amount );    if( rv < 0 ) {	err = _MD_ERRNO();	_PR_MD_MAP_WRITE_ERROR(err);    }    return( rv );}#ifndef BONE_VERSION /* Writev moves to bnet.c with BONE */PRInt32_MD_writev (PRFileDesc *fd, const PRIOVec *iov, PRInt32 iov_size,	    PRIntervalTime timeout){    return PR_NOT_IMPLEMENTED_ERROR;}#endifPRInt32_MD_lseek (PRFileDesc *fd, PRInt32 offset, int whence){PRInt32 rv, err;    rv = lseek (fd->secret->md.osfd, offset, whence);    if (rv == -1) {        err = _MD_ERRNO();	_PR_MD_MAP_LSEEK_ERROR(err);    }    return( rv );}PRInt64_MD_lseek64 (PRFileDesc *fd, PRInt64 offset, int whence){PRInt32 rv, err;/* According to the BeOS headers, lseek accepts a * variable of type off_t for the offset, and off_t * is defined to be a 64-bit value.  So no special * cracking needs to be done on "offset". */    rv = lseek (fd->secret->md.osfd, offset, whence);    if (rv == -1) {        err = _MD_ERRNO();	_PR_MD_MAP_LSEEK_ERROR(err);    }    return( rv );}PRInt32_MD_fsync (PRFileDesc *fd){PRInt32 rv, err;    rv = fsync(fd->secret->md.osfd);    if (rv == -1) {	err = _MD_ERRNO();	_PR_MD_MAP_FSYNC_ERROR(err);    }    return(rv);}PRInt32_MD_delete (const char *name){PRInt32 rv, err;    rv = unlink(name);    if (rv == -1)    {	err = _MD_ERRNO();        _PR_MD_MAP_UNLINK_ERROR(err);    }    return (rv);}PRInt32_MD_getfileinfo (const char *fn, PRFileInfo *info){struct stat sb;PRInt32 rv, err;PRInt64 s, s2us;	rv = stat(fn, &sb);	if (rv < 0) {		err = _MD_ERRNO();		_PR_MD_MAP_STAT_ERROR(err);	} else if (info) {		if (S_IFREG & sb.st_mode)			info->type = PR_FILE_FILE;		else if (S_IFDIR & sb.st_mode)			info->type = PR_FILE_DIRECTORY;		else			info->type = PR_FILE_OTHER;		/* Must truncate file size for the 32 bit		   version */		info->size = (sb.st_size & 0xffffffff);		LL_I2L(s, sb.st_mtime);		LL_I2L(s2us, PR_USEC_PER_SEC);		LL_MUL(s, s, s2us);		info->modifyTime = s;		LL_I2L(s, sb.st_ctime);		LL_MUL(s, s, s2us);		info->creationTime = s;	}	return rv;}PRInt32_MD_getfileinfo64 (const char *fn, PRFileInfo64 *info){struct stat sb;PRInt32 rv, err;PRInt64 s, s2us;	rv = stat(fn, &sb);	if (rv < 0) {		err = _MD_ERRNO();		_PR_MD_MAP_STAT_ERROR(err);	} else if (info) {		if (S_IFREG & sb.st_mode)			info->type = PR_FILE_FILE;		else if (S_IFDIR & sb.st_mode)			info->type = PR_FILE_DIRECTORY;		else			info->type = PR_FILE_OTHER;			/* For the 64 bit version we can use		 * the native st_size without modification		 */		info->size = sb.st_size;		LL_I2L(s, sb.st_mtime);		LL_I2L(s2us, PR_USEC_PER_SEC);		LL_MUL(s, s, s2us);		info->modifyTime = s;		LL_I2L(s, sb.st_ctime);		LL_MUL(s, s, s2us);		info->creationTime = s;	}	return rv;}PRInt32_MD_getopenfileinfo (const PRFileDesc *fd, PRFileInfo *info){        struct stat sb;        PRInt64 s, s2us;        PRInt32 rv, err;        rv = fstat(fd->secret->md.osfd, &sb);        if (rv < 0) {                        err = _MD_ERRNO();                        _PR_MD_MAP_FSTAT_ERROR(err);        } else if (info) {                if (info) {                        if (S_IFREG & sb.st_mode)                                info->type = PR_FILE_FILE ;                        else if (S_IFDIR & sb.st_mode)                                info->type = PR_FILE_DIRECTORY;                        else                                info->type = PR_FILE_OTHER;			/* Use lower 32 bits of file size */                        info->size = ( sb.st_size & 0xffffffff);                        LL_I2L(s, sb.st_mtime);                        LL_I2L(s2us, PR_USEC_PER_SEC);                        LL_MUL(s, s, s2us);                        info->modifyTime = s;                        LL_I2L(s, sb.st_ctime);                        LL_MUL(s, s, s2us);                        info->creationTime = s;                }        }        return rv;}PRInt32_MD_getopenfileinfo64 (const PRFileDesc *fd, PRFileInfo64 *info){        struct stat sb;        PRInt64 s, s2us;        PRInt32 rv, err;        rv = fstat(fd->secret->md.osfd, &sb);        if (rv < 0) {                        err = _MD_ERRNO();                        _PR_MD_MAP_FSTAT_ERROR(err);        } else if (info) {                if (info) {                        if (S_IFREG & sb.st_mode)                                info->type = PR_FILE_FILE ;                        else if (S_IFDIR & sb.st_mode)                                info->type = PR_FILE_DIRECTORY;                        else                                info->type = PR_FILE_OTHER;                        info->size = sb.st_size;                        LL_I2L(s, sb.st_mtime);                        LL_I2L(s2us, PR_USEC_PER_SEC);                        LL_MUL(s, s, s2us);                        info->modifyTime = s;                        LL_I2L(s, sb.st_ctime);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -