Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Feb 2012 15:14:29 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r232183 - head/sys/kern
Message-ID:  <201202261514.q1QFET0v070810@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202261514.q1QFET0v070810>