* devices.in (dev_storage): Map /dev/zero and /dev/full to \Device\Null.
* devices.cc: Regenerate. * dtable.h (struct dtable): Make fhandler_base friend, rather than fhandler_disk_file. * fhandler.cc (fhandler_base::open_with_arch): Create unique id. (fhandler_base::cleanup): Call del_my_locks. (fhandler_base::fcntl): Handle F_GETLK, F_SETLK and F_SETLKW. * fhandler.h (fhandler_base::get_dev): Return real device number. (fhandler_base::set_unique_id): New inline method. (fhandler_disk_file::lock): Drop declaration. (fhandler_disk_file::get_dev): New method, return pc.fs_serial_number. (fhandler_dev_zero::open): Drop declaration. * fhandler_disk_file.cc (fhandler_disk_file::close): Move del_my_locks call to fhandler_base::open_with_arch. (fhandler_disk_file::fcntl): Move handling of locking commands to fhandler_base::fcntl. (fhandler_base::open_fs): Drop call to NtAllocateLocallyUniqueId. * fhandler_zero.cc (fhandler_dev_zero::open): Remove so that default fhandler_base::open is used to open \Device\Null. * flock.cc (fixup_lockf_after_exec): Finding a single fhandler is enough here. (fhandler_base::lock): Replace fhandler_disk_file::lock. Refuse to lock nohandle devices. Handle read/write test using POSIX flags. Explain why. Never fail on SEEK_CUR or SEEK_END, rather assume position 0, just as Linux. * net.cc (fdsock): Create unique id.
This commit is contained in:
		@@ -1401,9 +1401,6 @@ fhandler_disk_file::close ()
 | 
			
		||||
  /* Close extra pread/pwrite handle, if it exists. */
 | 
			
		||||
  if (prw_handle)
 | 
			
		||||
    NtClose (prw_handle);
 | 
			
		||||
  /* Delete all POSIX locks on the file.  Delete all flock locks on the
 | 
			
		||||
     file if this is the last reference to this file. */
 | 
			
		||||
  del_my_locks (on_close);
 | 
			
		||||
  return fhandler_base::close ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1414,20 +1411,11 @@ fhandler_disk_file::fcntl (int cmd, intptr_t arg)
 | 
			
		||||
 | 
			
		||||
  switch (cmd)
 | 
			
		||||
    {
 | 
			
		||||
    case F_LCK_MANDATORY:
 | 
			
		||||
    case F_LCK_MANDATORY:	/* Mandatory locking only works on files. */
 | 
			
		||||
      mandatory_locking (!!arg);
 | 
			
		||||
      need_fork_fixup (true);
 | 
			
		||||
      res = 0;
 | 
			
		||||
      break;
 | 
			
		||||
    case F_GETLK:
 | 
			
		||||
    case F_SETLK:
 | 
			
		||||
    case F_SETLKW:
 | 
			
		||||
      {
 | 
			
		||||
	struct flock *fl = (struct flock *) arg;
 | 
			
		||||
	fl->l_type &= F_RDLCK | F_WRLCK | F_UNLCK;
 | 
			
		||||
	res = mandatory_locking () ? mand_lock (cmd, fl) : lock (cmd, fl);
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      res = fhandler_base::fcntl (cmd, arg);
 | 
			
		||||
      break;
 | 
			
		||||
@@ -1487,9 +1475,6 @@ fhandler_base::open_fs (int flags, mode_t mode)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  ino = pc.get_ino_by_handle (get_handle ());
 | 
			
		||||
  /* A unique ID is necessary to recognize fhandler entries which are
 | 
			
		||||
     duplicated by dup(2) or fork(2). */
 | 
			
		||||
  NtAllocateLocallyUniqueId ((PLUID) &unique_id);
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
  syscall_printf ("%d = fhandler_disk_file::open(%S, %y)", res,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user