107 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| /* fcntl.cc: fcntl syscall
 | |
| 
 | |
|    Copyright 1996, 1997, 1998 Cygnus Solutions.
 | |
| 
 | |
| This file is part of Cygwin.
 | |
| 
 | |
| This software is a copyrighted work licensed under the terms of the
 | |
| Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | |
| details. */
 | |
| 
 | |
| #include <fcntl.h>
 | |
| #include <stdarg.h>
 | |
| #include <errno.h>
 | |
| #include <unistd.h>
 | |
| #include "winsup.h"
 | |
| 
 | |
| extern "C"
 | |
| int
 | |
| _fcntl (int fd, int cmd,...)
 | |
| {
 | |
|   va_list args;
 | |
|   int arg = 0;
 | |
|   int res;
 | |
|   SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK, "_fcntl");
 | |
| 
 | |
|   if (dtable.not_open (fd))
 | |
|     {
 | |
|       set_errno (EBADF);
 | |
|       res = -1;
 | |
|       goto done;
 | |
|     }
 | |
| 
 | |
|   switch (cmd)
 | |
|     {
 | |
|     case F_DUPFD:
 | |
|       va_start (args, cmd);
 | |
|       arg = va_arg (args,int);
 | |
|       va_end (args);
 | |
|       res = dup2 (fd, dtable.find_unused_handle (arg));
 | |
|       goto done;
 | |
| 
 | |
|     case F_GETFD:
 | |
|       res = dtable[fd]->get_close_on_exec () ? FD_CLOEXEC : 0;
 | |
|       goto done;
 | |
| 
 | |
|     case F_SETFD:
 | |
|       va_start (args, cmd);
 | |
|       arg = va_arg (args, int);
 | |
|       va_end (args);
 | |
|       dtable[fd]->set_close_on_exec (arg);
 | |
|       res = 0;
 | |
|       goto done;
 | |
| 
 | |
|     case F_GETFL:
 | |
|       {
 | |
| 	res = dtable[fd]->get_flags ();
 | |
| 	goto done;
 | |
|       }
 | |
|     case F_SETFL:
 | |
|       {
 | |
| 	int temp = 0;
 | |
| 
 | |
| 	va_start (args, cmd);
 | |
| 	arg = va_arg (args, int);
 | |
| 	va_end (args);
 | |
| 
 | |
| 	if (arg & O_RDONLY)
 | |
| 	  temp |= GENERIC_READ;
 | |
| 	if (arg & O_WRONLY)
 | |
| 	  temp |= GENERIC_WRITE;
 | |
| 
 | |
| 	syscall_printf ("fcntl (%d, F_SETFL, %d)", arg);
 | |
| 
 | |
| 	dtable[fd]->set_access (temp);
 | |
| 	dtable[fd]->set_flags (arg);
 | |
| 
 | |
| 	res = 0;
 | |
| 	goto done;
 | |
|       }
 | |
| 
 | |
|     case F_GETLK:
 | |
|     case F_SETLK:
 | |
|     case F_SETLKW:
 | |
|       {
 | |
| 	struct flock *fl;
 | |
| 	va_start (args, cmd);
 | |
| 	fl = va_arg (args,struct flock *);
 | |
| 	va_end (args);
 | |
| 	res = dtable[fd]->lock (cmd, fl);
 | |
| 	goto done;
 | |
|       }
 | |
|     default:
 | |
|       set_errno (EINVAL);
 | |
|       res = -1;
 | |
|       goto done;
 | |
|     }
 | |
| 
 | |
|   set_errno (ENOSYS);
 | |
|   res = -1;
 | |
| 
 | |
|  done:
 | |
|   ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"_fcntl");
 | |
| 
 | |
|   syscall_printf ("%d = fcntl (%d, %d, %d)", res, fd, cmd, arg);
 | |
|   return res;
 | |
| }
 |