Author: jilles
Date: Sun Feb 26 15:14:29 2012
New Revision: 232183
URL: http://svn.freebsd.org/changeset/base/232183

Log:
  Fix fchmod() and fchown() on fifos.
  
  The new fifo implementation in r232055 broke fchmod() and fchown() on fifos.
  Postfix needs this.
  
  Submitted by: gianni
  Reported by:  dougb

Modified:
  head/sys/kern/sys_pipe.c

Modified: head/sys/kern/sys_pipe.c
==============================================================================
--- head/sys/kern/sys_pipe.c    Sun Feb 26 14:27:34 2012        (r232182)
+++ head/sys/kern/sys_pipe.c    Sun Feb 26 15:14:29 2012        (r232183)
@@ -152,6 +152,8 @@ static fo_poll_t    pipe_poll;
 static fo_kqfilter_t   pipe_kqfilter;
 static fo_stat_t       pipe_stat;
 static fo_close_t      pipe_close;
+static fo_chmod_t      pipe_chmod;
+static fo_chown_t      pipe_chown;
 
 struct fileops pipeops = {
        .fo_read = pipe_read,
@@ -162,8 +164,8 @@ struct fileops pipeops = {
        .fo_kqfilter = pipe_kqfilter,
        .fo_stat = pipe_stat,
        .fo_close = pipe_close,
-       .fo_chmod = invfo_chmod,
-       .fo_chown = invfo_chown,
+       .fo_chmod = pipe_chmod,
+       .fo_chown = pipe_chown,
        .fo_flags = DFLAG_PASSABLE
 };
 
@@ -1548,6 +1550,43 @@ pipe_close(fp, td)
        return (0);
 }
 
+static int
+pipe_chmod(fp, mode, active_cred, td)
+       struct file *fp;
+       mode_t mode;
+       struct ucred *active_cred;
+       struct thread *td;
+{
+       struct pipe *cpipe;
+       int error;
+
+       cpipe = fp->f_data;
+       if (cpipe->pipe_state & PIPE_NAMED)
+               error = vn_chmod(fp, mode, active_cred, td);
+       else
+               error = invfo_chmod(fp, mode, active_cred, td);
+       return (error);
+}
+
+static int
+pipe_chown(fp, uid, gid, active_cred, td)
+       struct file *fp;
+       uid_t uid;
+       gid_t gid;
+       struct ucred *active_cred;
+       struct thread *td;
+{
+       struct pipe *cpipe;
+       int error;
+
+       cpipe = fp->f_data;
+       if (cpipe->pipe_state & PIPE_NAMED)
+               error = vn_chown(fp, uid, gid, active_cred, td);
+       else
+               error = invfo_chown(fp, uid, gid, active_cred, td);
+       return (error);
+}
+
 static void
 pipe_free_kmem(cpipe)
        struct pipe *cpipe;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to