Cygwin: introduce fhandler_process_fd and add stat(2) handling
move special fd symlink code into own fhandler_process_fd class to simplify further additions to /proc/PID/fd/DESCRIPTOR symlink handling. Add a method to handle stat(2) on such a proc fd symlink by handle. This allows correct reply from stat(2) if the target file has been deleted. This eventually fixes `awk -f /dev/fd/3 3<<eof'. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
		| @@ -2545,6 +2545,7 @@ class fhandler_registry: public fhandler_proc | ||||
| class pinfo; | ||||
| class fhandler_process: public fhandler_proc | ||||
| { | ||||
|  protected: | ||||
|   pid_t pid; | ||||
|   virtual_ftype_t fd_type; | ||||
|  public: | ||||
| @@ -2554,8 +2555,6 @@ class fhandler_process: public fhandler_proc | ||||
|   int closedir (DIR *); | ||||
|   int __reg3 readdir (DIR *, dirent *); | ||||
|   int open (int flags, mode_t mode = 0); | ||||
|   virtual fhandler_base *fd_reopen (int); | ||||
|   int __reg2 link (const char *); | ||||
|   int __reg2 fstat (struct stat *buf); | ||||
|   bool fill_filebuf (); | ||||
|  | ||||
| @@ -2577,6 +2576,34 @@ class fhandler_process: public fhandler_proc | ||||
|   } | ||||
| }; | ||||
|  | ||||
| class fhandler_process_fd : public fhandler_process | ||||
| { | ||||
|   fhandler_base *fetch_fh (HANDLE &); | ||||
|  | ||||
|  public: | ||||
|   fhandler_process_fd () : fhandler_process () {} | ||||
|   fhandler_process_fd (void *) {} | ||||
|  | ||||
|   virtual fhandler_base *fd_reopen (int); | ||||
|   int __reg2 fstat (struct stat *buf); | ||||
|   virtual int __reg2 link (const char *); | ||||
|  | ||||
|   void copyto (fhandler_base *x) | ||||
|   { | ||||
|     x->pc.free_strings (); | ||||
|     *reinterpret_cast<fhandler_process_fd *> (x) = *this; | ||||
|     x->reset (this); | ||||
|   } | ||||
|  | ||||
|   fhandler_process_fd *clone (cygheap_types malloc_type = HEAP_FHANDLER) | ||||
|   { | ||||
|     void *ptr = (void *) ccalloc (malloc_type, 1, sizeof (fhandler_process_fd)); | ||||
|     fhandler_process_fd *fh = new (ptr) fhandler_process_fd (ptr); | ||||
|     copyto (fh); | ||||
|     return fh; | ||||
|   } | ||||
| }; | ||||
|  | ||||
| class fhandler_procnet: public fhandler_proc | ||||
| { | ||||
|   pid_t pid; | ||||
| @@ -2638,6 +2665,7 @@ typedef union | ||||
|   char __pipe[sizeof (fhandler_pipe)]; | ||||
|   char __proc[sizeof (fhandler_proc)]; | ||||
|   char __process[sizeof (fhandler_process)]; | ||||
|   char __process_fd[sizeof (fhandler_process_fd)]; | ||||
|   char __procnet[sizeof (fhandler_procnet)]; | ||||
|   char __procsys[sizeof (fhandler_procsys)]; | ||||
|   char __procsysvipc[sizeof (fhandler_procsysvipc)]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user