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

📄 bfile.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                        LL_MUL(s, s, s2us);                        info->creationTime = s;                }        }        return rv;}PRInt32_MD_rename (const char *from, const char *to){    PRInt32 rv = -1, err;    /*    ** This is trying to enforce the semantics of WINDOZE' rename    ** operation. That means one is not allowed to rename over top    ** of an existing file. Holding a lock across these two function    ** and the open function is known to be a bad idea, but ....    */    if (NULL != _pr_rename_lock)        PR_Lock(_pr_rename_lock);    if (0 == access(to, F_OK))        PR_SetError(PR_FILE_EXISTS_ERROR, 0);    else    {            rv = rename(from, to);            if (rv < 0) {                    err = _MD_ERRNO();                    _PR_MD_MAP_RENAME_ERROR(err);            }    }    if (NULL != _pr_rename_lock)        PR_Unlock(_pr_rename_lock);    return rv; }PRInt32_MD_access (const char *name, PRIntn how){PRInt32 rv, err;int amode;	switch (how) {		case PR_ACCESS_WRITE_OK:			amode = W_OK;			break;		case PR_ACCESS_READ_OK:			amode = R_OK;			break;		case PR_ACCESS_EXISTS:			amode = F_OK;			break;		default:			PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);			rv = -1;			goto done;	}	rv = access(name, amode);	if (rv < 0) {		err = _MD_ERRNO();		_PR_MD_MAP_ACCESS_ERROR(err);	}done:	return(rv);}PRInt32_MD_stat (const char *name, struct stat *buf){    return PR_NOT_IMPLEMENTED_ERROR;}PRInt32_MD_mkdir (const char *name, PRIntn mode){    status_t rv;    int err;    /*    ** This lock is used to enforce rename semantics as described    ** in PR_Rename. Look there for more fun details.    */    if (NULL !=_pr_rename_lock)        PR_Lock(_pr_rename_lock);    rv = mkdir(name, mode);    if (rv < 0) {	err = _MD_ERRNO();	_PR_MD_MAP_MKDIR_ERROR(err);    }    if (NULL !=_pr_rename_lock)        PR_Unlock(_pr_rename_lock);    return rv; }PRInt32_MD_rmdir (const char *name){int rv, err;        rv = rmdir(name);        if (rv == -1) {                        err = _MD_ERRNO();                        _PR_MD_MAP_RMDIR_ERROR(err);        }        return rv;}PRInt32_MD_pr_poll(PRPollDesc *pds, PRIntn npds, PRIntervalTime timeout){	PRInt32 rv = 0;	PRThread *me = _PR_MD_CURRENT_THREAD();	/*	 * This code is almost a duplicate of w32poll.c's _PR_MD_PR_POLL().	 */	fd_set rd, wt, ex;	PRFileDesc *bottom;	PRPollDesc *pd, *epd;	PRInt32 maxfd = -1, ready, err;	PRIntervalTime remaining, elapsed, start;	struct timeval tv, *tvp = NULL;	if (_PR_PENDING_INTERRUPT(me))	{		me->flags &= ~_PR_INTERRUPT;		PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);		return -1;	}	if (0 == npds) {		PR_Sleep(timeout);		return rv;	}	FD_ZERO(&rd);	FD_ZERO(&wt);	FD_ZERO(&ex);	ready = 0;	for (pd = pds, epd = pd + npds; pd < epd; pd++)	{		PRInt16 in_flags_read = 0, in_flags_write = 0;		PRInt16 out_flags_read = 0, out_flags_write = 0; 				if ((NULL != pd->fd) && (0 != pd->in_flags))		{			if (pd->in_flags & PR_POLL_READ)			{				in_flags_read = (pd->fd->methods->poll)(pd->fd, pd->in_flags & ~PR_POLL_WRITE, &out_flags_read);			}			if (pd->in_flags & PR_POLL_WRITE)			{				in_flags_write = (pd->fd->methods->poll)(pd->fd, pd->in_flags & ~PR_POLL_READ, &out_flags_write);			}			if ((0 != (in_flags_read & out_flags_read))			    || (0 != (in_flags_write & out_flags_write)))			{				/* this one's ready right now */				if (0 == ready)				{					/*					 * We will have to return without calling the					 * system poll/select function.  So zero the					 * out_flags fields of all the poll descriptors					 * before this one. 					 */					PRPollDesc *prev;					for (prev = pds; prev < pd; prev++)					{						prev->out_flags = 0;					}				}				ready += 1;				pd->out_flags = out_flags_read | out_flags_write;			}			else			{				pd->out_flags = 0;  /* pre-condition */								/* make sure this is an NSPR supported stack */				bottom = PR_GetIdentitiesLayer(pd->fd, PR_NSPR_IO_LAYER);				PR_ASSERT(NULL != bottom);  /* what to do about that? */				if ((NULL != bottom)				    && (_PR_FILEDESC_OPEN == bottom->secret->state))				{					if (0 == ready)					{						PRInt32 osfd = bottom->secret->md.osfd; 						if (osfd > maxfd) maxfd = osfd;						if (in_flags_read & PR_POLL_READ)						{							pd->out_flags |= _PR_POLL_READ_SYS_READ;							FD_SET(osfd, &rd);						}						if (in_flags_read & PR_POLL_WRITE)						{							pd->out_flags |= _PR_POLL_READ_SYS_WRITE;							FD_SET(osfd, &wt);						}						if (in_flags_write & PR_POLL_READ)						{							pd->out_flags |= _PR_POLL_WRITE_SYS_READ;							FD_SET(osfd, &rd);						}						if (in_flags_write & PR_POLL_WRITE)						{							pd->out_flags |= _PR_POLL_WRITE_SYS_WRITE;							FD_SET(osfd, &wt);						}						if (pd->in_flags & PR_POLL_EXCEPT) FD_SET(osfd, &ex);					}				}				else				{					if (0 == ready)					{						PRPollDesc *prev;						for (prev = pds; prev < pd; prev++)						{							prev->out_flags = 0;						}					}					ready += 1;  /* this will cause an abrupt return */					pd->out_flags = PR_POLL_NVAL;  /* bogii */				}			}		}	}	if (0 != ready) return ready;  /* no need to block */	remaining = timeout;	start = PR_IntervalNow();  retry:	if (timeout != PR_INTERVAL_NO_TIMEOUT)	{		PRInt32 ticksPerSecond = PR_TicksPerSecond();		tv.tv_sec = remaining / ticksPerSecond;		tv.tv_usec = remaining - (ticksPerSecond * tv.tv_sec);		tv.tv_usec = (PR_USEC_PER_SEC * tv.tv_usec) / ticksPerSecond;		tvp = &tv;	}		ready = _MD_SELECT(maxfd + 1, &rd, &wt, &ex, tvp);		if (ready == -1 && errno == EINTR)	{		if (timeout == PR_INTERVAL_NO_TIMEOUT) goto retry;		else		{			elapsed = (PRIntervalTime) (PR_IntervalNow() - start);			if (elapsed > timeout) ready = 0;  /* timed out */			else			{				remaining = timeout - elapsed;				goto retry; 			}		}	} 	/*	** Now to unravel the select sets back into the client's poll	** descriptor list. Is this possibly an area for pissing away	** a few cycles or what?	*/	if (ready > 0)	{		ready = 0;		for (pd = pds, epd = pd + npds; pd < epd; pd++)		{			PRInt16 out_flags = 0;			if ((NULL != pd->fd) && (0 != pd->in_flags))			{				PRInt32 osfd;				bottom = PR_GetIdentitiesLayer(pd->fd, PR_NSPR_IO_LAYER);				PR_ASSERT(NULL != bottom);								osfd = bottom->secret->md.osfd; 								if (FD_ISSET(osfd, &rd))				{					if (pd->out_flags & _PR_POLL_READ_SYS_READ)						out_flags |= PR_POLL_READ;					if (pd->out_flags & _PR_POLL_WRITE_SYS_READ)						out_flags |= PR_POLL_WRITE;				}				if (FD_ISSET(osfd, &wt))				{					if (pd->out_flags & _PR_POLL_READ_SYS_WRITE)						out_flags |= PR_POLL_READ;					if (pd->out_flags & _PR_POLL_WRITE_SYS_WRITE)						out_flags |= PR_POLL_WRITE;				}				if (FD_ISSET(osfd, &ex)) out_flags |= PR_POLL_EXCEPT;/* Workaround for nonblocking connects under net_server */#ifndef BONE_VERSION 						if (out_flags)				{					/* check if it is a pending connect */					int i = 0, j = 0;					PR_Lock( _connectLock );					for( i = 0; i < connectCount; i++ ) 					{						if(connectList[i].osfd == osfd)						{							int connectError;							int connectResult;												connectResult = connect(connectList[i].osfd,							                        &connectList[i].addr,							                        connectList[i].addrlen);							connectError = errno;												if(connectResult < 0 ) 							{								if(connectError == EINTR || connectError == EWOULDBLOCK ||					  		   connectError == EINPROGRESS || connectError == EALREADY)								{									break;								}							}												if(i == (connectCount - 1))							{								connectList[i].osfd = -1;							} else {								for(j = i; j < connectCount; j++ )								{									memcpy( &connectList[j], &connectList[j+1],									        sizeof(connectList[j]));								}							}							connectCount--;												bottom->secret->md.connectReturnValue = connectResult;							bottom->secret->md.connectReturnError = connectError;							bottom->secret->md.connectValueValid = PR_TRUE;							break;						}					}					PR_Unlock( _connectLock );				}#endif			}			pd->out_flags = out_flags;			if (out_flags) ready++;		}		PR_ASSERT(ready > 0);	}	else if (ready < 0)	{ 		err = _MD_ERRNO();		if (err == EBADF)		{			/* Find the bad fds */			ready = 0;			for (pd = pds, epd = pd + npds; pd < epd; pd++)			{				pd->out_flags = 0;				if ((NULL != pd->fd) && (0 != pd->in_flags))				{					bottom = PR_GetIdentitiesLayer(pd->fd, PR_NSPR_IO_LAYER);					if (fcntl(bottom->secret->md.osfd, F_GETFL, 0) == -1)					{						pd->out_flags = PR_POLL_NVAL;						ready++;					}				}			}			PR_ASSERT(ready > 0);		}		else _PR_MD_MAP_SELECT_ERROR(err);	}		return ready;}  /* _MD_pr_poll *//* * File locking. */PRStatus_MD_lockfile (PRInt32 osfd){    PRInt32 rv;    struct flock linfo;    linfo.l_type =     linfo.l_whence = SEEK_SET;    linfo.l_start = 0;    linfo.l_len = 0;    rv = fcntl(osfd, F_SETLKW, &linfo);    if (rv == 0)	return PR_SUCCESS;    _PR_MD_MAP_FLOCK_ERROR(_MD_ERRNO());    return PR_FAILURE;}PRStatus_MD_tlockfile (PRInt32 osfd){    PRInt32 rv;    struct flock linfo;    linfo.l_type =     linfo.l_whence = SEEK_SET;    linfo.l_start = 0;    linfo.l_len = 0;    rv = fcntl(osfd, F_SETLK, &linfo);    if (rv == 0)	return PR_SUCCESS;    _PR_MD_MAP_FLOCK_ERROR(_MD_ERRNO());    return PR_FAILURE;}PRStatus_MD_unlockfile (PRInt32 osfd){    PRInt32 rv;    struct flock linfo;    linfo.l_type =     linfo.l_whence = SEEK_SET;    linfo.l_start = 0;    linfo.l_len = 0;    rv = fcntl(osfd, F_UNLCK, &linfo);    if (rv == 0)	return PR_SUCCESS;    _PR_MD_MAP_FLOCK_ERROR(_MD_ERRNO());    return PR_FAILURE;}

⌨️ 快捷键说明

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