* fhandler.cc (fhandler_base::get_proc_fd_name): Don't generate

"device:" entry.
	* fhandler.h (fhandler_socket::open): New method.
	(fhandler_pipe::open): New method.
	* fhandler_proc.cc (fhandler_proc::exists): Return -2 in case of
	/proc/self.
	* fhandler_process.cc (fhandler_process::exists): Return -2 in
	case of symlinks, -3 for pipes and -4 for sockets.
	(fhandler_process::fstat): Handle pipes and sockets.
	(fhandler_process::open): Handle opening /proc/<pid>/fd.
	(fhandler_process::fill_filebuf): Generate empty names for
	non exisiting file descriptors.
	* fhandler_socket.cc (fhandler_socket::get_proc_fd_name): Always
	generate "socket:[number]" strings as on Linux.
	(fhandler_socket::open): New method.
	(fhandler_socket::fstat): Always return socket type.
	* path.cc (symlink_info::set): Remove unused second parameter.
	(path_conv::check): Handle pipes and sockets in /proc.
	Set correct device type for AF_LOCAL sockets.
	* pinfo.cc (_pinfo::commune_recv): Generate empty names for
	non exisiting file descriptors.
	(_pinfo::fd): Ditto.
	* pipe.cc (fhandler_pipe::open): New method.
This commit is contained in:
Corinna Vinschen
2005-02-01 15:11:47 +00:00
parent d93998b17a
commit e8309efda5
9 changed files with 103 additions and 34 deletions

View File

@ -92,7 +92,8 @@ static bool get_mem_values (DWORD dwProcessId, unsigned long *vmsize,
unsigned long *vmshare);
/* Returns 0 if path doesn't exist, >0 if path is a directory,
* -1 if path is a file, -2 if path is a symlink.
* -1 if path is a file, -2 if path is a symlink, -3 if path is a pipe,
* -4 if path is a socket.
*/
int
fhandler_process::exists ()
@ -116,6 +117,15 @@ fhandler_process::exists ()
fileid = PROCESS_FD;
if (fill_filebuf ())
return -2;
/* Check for nameless device entries. */
path = strrchr (path, '/');
if (path && *++path)
{
if (!strncmp (path, "pipe:[", 6))
return -3;
else if (!strncmp (path, "socket:[", 8))
return -4;
}
}
return 0;
}
@ -165,6 +175,16 @@ fhandler_process::fstat (struct __stat64 *buf)
buf->st_gid = p->gid;
buf->st_mode = S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO;
return 0;
case -3:
buf->st_uid = p->uid;
buf->st_gid = p->gid;
buf->st_mode = S_IFIFO | S_IRUSR | S_IWUSR;
return 0;
case -4:
buf->st_uid = p->uid;
buf->st_gid = p->gid;
buf->st_mode = S_IFSOCK | S_IRUSR | S_IWUSR;
return 0;
case -1:
default:
buf->st_uid = p->uid;
@ -269,6 +289,12 @@ fhandler_process::open (int flags, mode_t mode)
goto out;
}
}
if (process_file_no == PROCESS_FD)
{
set_errno (EISDIR);
res = 0;
goto out;
}
if (flags & O_WRONLY)
{
set_errno (EROFS);
@ -338,8 +364,8 @@ fhandler_process::fill_filebuf ()
filebuf = p->fd (fd, fs);
if (!filebuf || !*filebuf)
{
filebuf = strdup ("<disconnected>");
fs = strlen (filebuf) + 1;
set_errno (ENOENT);
return false;
}
}
filesize = fs;