* 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:
Corinna Vinschen
2013-10-24 09:41:17 +00:00
parent 72a386373e
commit 95ff6fc6da
11 changed files with 109 additions and 64 deletions

View File

@ -498,6 +498,12 @@ fhandler_base::open_with_arch (int flags, mode_t mode)
}
close_on_exec (flags & O_CLOEXEC);
/* A unique ID is necessary to recognize fhandler entries which are
duplicated by dup(2) or fork(2). This is used in BSD flock calls
to identify the descriptor. Skip nohandle fhandlers since advisory
locking is unusable for those anyway. */
if (!nohandle ())
set_unique_id ();
return res;
}
@ -1112,6 +1118,10 @@ fhandler_base::close_with_arch ()
void
fhandler_base::cleanup ()
{
/* Delete all POSIX locks on the file. Delete all flock locks on the
file if this is the last reference to this file. */
if (unique_id)
del_my_locks (on_close);
}
int
@ -1366,6 +1376,15 @@ int fhandler_base::fcntl (int cmd, intptr_t arg)
}
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:
set_errno (EINVAL);
res = -1;