I would like to be able to pass file handles to chmod(), chown() and
chdir() and have perl call the corresponding fxxx() function.  This is
similar to how perl treats the argument of stat() or truncate().

Below is an implementation that make perl call fchmod().  If there are
no objections to this approach, I'll complete a patch that includes
the other 2 functions and comes with tests and documentation.
Configure already probes for the availability of these functions.


--- doio.c.orig 2005-07-14 23:52:24.000000000 +0200
+++ doio.c      2005-07-15 00:06:48.000000000 +0200
@@ -1677,10 +1677,33 @@
            APPLY_TAINT_PROPER();
            tot = sp - mark;
            while (++mark <= sp) {
-               const char *name = SvPV_nolen_const(*mark);
-               APPLY_TAINT_PROPER();
-               if (PerlLIO_chmod(name, val))
-                   tot--;
+                GV* gv;
+                if (SvTYPE(*mark) == SVt_PVGV) {
+                    gv = (GV*)*mark;
+               do_fchmod:
+#ifdef HAS_FCHMOD
+                   if (GvIO(gv) && IoIFP(GvIOp(gv))) {
+                       APPLY_TAINT_PROPER();
+                       if (fchmod(PerlIO_fileno(IoIFP(GvIOn(gv))), val))
+                           tot--;
+#else
+                       DIE(aTHX_ PL_no_func, "fchmod");
+#endif
+                   }
+                   else {
+                       tot--;
+                   }
+               }
+               else if (SvROK(*mark) && SvTYPE(SvRV(*mark)) == SVt_PVGV) {
+                   gv = (GV*)SvRV(*mark);
+                   goto do_fchmod;
+               }
+               else {
+                   const char *name = SvPV_nolen_const(*mark);
+                   APPLY_TAINT_PROPER();
+                   if (PerlLIO_chmod(name, val))
+                       tot--;
+               }
            }
        }
        break;

Reply via email to