From owner-freebsd-bugs@FreeBSD.ORG Tue Jun 10 15:40:04 2008 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0053B1065677 for ; Tue, 10 Jun 2008 15:40:03 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id ED5028FC2B for ; Tue, 10 Jun 2008 15:40:03 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.2/8.14.2) with ESMTP id m5AFe3xb071231 for ; Tue, 10 Jun 2008 15:40:03 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.2/8.14.1/Submit) id m5AFe3fl071230; Tue, 10 Jun 2008 15:40:03 GMT (envelope-from gnats) Date: Tue, 10 Jun 2008 15:40:03 GMT Message-Id: <200806101540.m5AFe3fl071230@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Jaakko Heinonen Cc: Subject: Re: bin/112213: touch(1)ing a directory and failing yields return code 0 X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Jaakko Heinonen List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 Jun 2008 15:40:04 -0000 The following reply was made to PR bin/112213; it has been noted by GNATS. From: Jaakko Heinonen To: bug-followup@FreeBSD.org, jschauma@netmeister.org Cc: Subject: Re: bin/112213: touch(1)ing a directory and failing yields return code 0 Date: Tue, 10 Jun 2008 18:38:30 +0300 The if statement you are referring to seems to be incorrect. 202 /* Try reading/writing. */ 203 if (!S_ISLNK(sb.st_mode) && !S_ISDIR(sb.st_mode) && 204 rw(*argv, &sb, fflag)) 205 rval = 1; 206 else 207 warn("%s", *argv); rval is correctly set to 1 if rw() fails but if rw() succeeds a bogus warning is printed. Secondly rval is not set at all when *argv is a symbolic link or directory. (It should be set because earlier attempts to set times failed.) I think that the following patch fixes the bug and it definitely fixes the case you gave: $ touch foo/bar ; echo $? touch: foo/bar: Read-only file system 1 $ touch foo ; echo $? touch: foo: Read-only file system 1 Index: usr.bin/touch/touch.c =================================================================== --- usr.bin/touch/touch.c (revision 179703) +++ usr.bin/touch/touch.c (working copy) @@ -222,11 +222,13 @@ continue; /* Try reading/writing. */ - if (!S_ISLNK(sb.st_mode) && !S_ISDIR(sb.st_mode) && - rw(*argv, &sb, fflag)) + if (!S_ISLNK(sb.st_mode) && !S_ISDIR(sb.st_mode)) { + if (rw(*argv, &sb, fflag)) + rval = 1; + } else { rval = 1; - else warn("%s", *argv); + } } exit(rval); }