mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
- Simplified the fcntl() code to use the varargs functions more carefully.
Also, the file descriptor duplication code no longer uses a goto to deliver its result. git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@14834 87f5fb63-7c3d-0410-a384-fd976d0f7a62
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fcntl_fcntl.c,v 1.7 2005-02-18 18:53:16 obarthel Exp $
|
* $Id: fcntl_fcntl.c,v 1.8 2005-02-20 09:03:02 obarthel Exp $
|
||||||
*
|
*
|
||||||
* :ts=4
|
* :ts=4
|
||||||
*
|
*
|
||||||
@ -47,6 +47,7 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
DECLARE_UTILITYBASE();
|
DECLARE_UTILITYBASE();
|
||||||
struct file_hook_message message;
|
struct file_hook_message message;
|
||||||
struct flock * l;
|
struct flock * l;
|
||||||
|
int vacant_slot;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
struct fd * fd;
|
struct fd * fd;
|
||||||
va_list arg;
|
va_list arg;
|
||||||
@ -91,15 +92,14 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
}
|
}
|
||||||
|
|
||||||
va_start(arg,cmd);
|
va_start(arg,cmd);
|
||||||
|
|
||||||
l = va_arg(arg,struct flock *);
|
l = va_arg(arg,struct flock *);
|
||||||
|
va_end(arg);
|
||||||
|
|
||||||
assert( l != NULL );
|
assert( l != NULL );
|
||||||
|
|
||||||
if(l->l_type < F_RDLCK || l->l_type > F_WRLCK)
|
if(l->l_type < F_RDLCK || l->l_type > F_WRLCK)
|
||||||
{
|
{
|
||||||
SHOWMSG("invalid flock type");
|
SHOWMSG("invalid flock type");
|
||||||
va_end(arg);
|
|
||||||
|
|
||||||
__set_errno(EINVAL);
|
__set_errno(EINVAL);
|
||||||
break;
|
break;
|
||||||
@ -108,17 +108,18 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
if(l->l_whence < SEEK_SET || l->l_whence > SEEK_END)
|
if(l->l_whence < SEEK_SET || l->l_whence > SEEK_END)
|
||||||
{
|
{
|
||||||
SHOWMSG("invalid flock offset");
|
SHOWMSG("invalid flock offset");
|
||||||
va_end(arg);
|
|
||||||
|
|
||||||
__set_errno(EINVAL);
|
__set_errno(EINVAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = __handle_record_locking(cmd,l,fd,&error);
|
if(__handle_record_locking(cmd,l,fd,&error) < 0)
|
||||||
if(result < 0)
|
{
|
||||||
__set_errno(error);
|
__set_errno(error);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
va_end(arg);
|
result = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -132,14 +133,14 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = 0;
|
|
||||||
|
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING))
|
||||||
SET_FLAG(result,O_NONBLOCK);
|
SET_FLAG(result,O_NONBLOCK);
|
||||||
|
|
||||||
if(FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO))
|
if(FLAG_IS_SET(fd->fd_Flags,FDF_ASYNC_IO))
|
||||||
SET_FLAG(result,O_ASYNC);
|
SET_FLAG(result,O_ASYNC);
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F_SETFL:
|
case F_SETFL:
|
||||||
@ -152,11 +153,9 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = 0;
|
|
||||||
|
|
||||||
va_start(arg,cmd);
|
va_start(arg,cmd);
|
||||||
|
|
||||||
flags = va_arg(arg,int);
|
flags = va_arg(arg,int);
|
||||||
|
va_end(arg);
|
||||||
|
|
||||||
if((FLAG_IS_SET(flags,O_NONBLOCK) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_NON_BLOCKING)) ||
|
if((FLAG_IS_SET(flags,O_NONBLOCK) && FLAG_IS_CLEAR(fd->fd_Flags,FDF_NON_BLOCKING)) ||
|
||||||
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
|
(FLAG_IS_CLEAR(flags,O_NONBLOCK) && FLAG_IS_SET(fd->fd_Flags,FDF_NON_BLOCKING)))
|
||||||
@ -168,12 +167,10 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
CallHookPkt(fd->fd_Hook,fd,&message);
|
||||||
|
|
||||||
result = message.result;
|
if(message.result < 0)
|
||||||
if(result < 0)
|
|
||||||
{
|
{
|
||||||
__set_errno(message.error);
|
__set_errno(message.error);
|
||||||
|
|
||||||
va_end(arg);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,12 +190,10 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
|
|
||||||
CallHookPkt(fd->fd_Hook,fd,&message);
|
CallHookPkt(fd->fd_Hook,fd,&message);
|
||||||
|
|
||||||
result = message.result;
|
if(message.result < 0)
|
||||||
if(result < 0)
|
|
||||||
{
|
{
|
||||||
__set_errno(message.error);
|
__set_errno(message.error);
|
||||||
|
|
||||||
va_end(arg);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,24 +203,24 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
CLEAR_FLAG(fd->fd_Flags,FDF_ASYNC_IO);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(arg);
|
result = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F_DUPFD:
|
case F_DUPFD:
|
||||||
|
|
||||||
SHOWMSG("cmd=F_DUPFD");
|
SHOWMSG("cmd=F_DUPFD");
|
||||||
|
|
||||||
va_start(arg, cmd);
|
va_start(arg, cmd);
|
||||||
fdbase = va_arg(arg, int);
|
fdbase = va_arg(arg, int);
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
|
|
||||||
if(fdbase < 0)
|
if(fdbase < 0)
|
||||||
{
|
{
|
||||||
__set_errno(EINVAL);
|
__set_errno(EINVAL);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we have that many fd's already */
|
/* Check if we have that many fd's already */
|
||||||
while(fdbase >= __num_fd)
|
while(fdbase >= __num_fd)
|
||||||
{
|
{
|
||||||
@ -237,8 +232,10 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vacant_slot = -1;
|
||||||
|
|
||||||
/* Guaranteed to have enough here */
|
/* Guaranteed to have enough here */
|
||||||
while(TRUE)
|
do
|
||||||
{
|
{
|
||||||
if(__check_abort_enabled)
|
if(__check_abort_enabled)
|
||||||
__check_abort();
|
__check_abort();
|
||||||
@ -247,22 +244,24 @@ fcntl(int file_descriptor, int cmd, ... /* int arg */ )
|
|||||||
{
|
{
|
||||||
if(FLAG_IS_CLEAR(__fd[i]->fd_Flags,FDF_IN_USE))
|
if(FLAG_IS_CLEAR(__fd[i]->fd_Flags,FDF_IN_USE))
|
||||||
{
|
{
|
||||||
/* Got a file descriptor, duplicate it */
|
vacant_slot = i;
|
||||||
__duplicate_fd(__fd[i],fd);
|
break;
|
||||||
|
|
||||||
result = i;
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Didn't really find any, grow the table further */
|
/* Didn't really find any, grow the table further */
|
||||||
if (__grow_fd_table() < 0)
|
if(vacant_slot < 0 && __grow_fd_table() < 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
while(vacant_slot < 0);
|
||||||
|
|
||||||
|
/* Got a file descriptor, duplicate it */
|
||||||
|
__duplicate_fd(__fd[vacant_slot],fd);
|
||||||
|
|
||||||
|
result = vacant_slot;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
__set_errno(EMFILE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
SHOWMSG("something else");
|
SHOWMSG("something else");
|
||||||
|
|||||||
Reference in New Issue
Block a user