From owner-freebsd-questions Tue Jan 28 9:53: 7 2003 Delivered-To: freebsd-questions@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 90CD737B401 for ; Tue, 28 Jan 2003 09:53:05 -0800 (PST) Received: from petasus.ch.intel.com (petasus.ch.intel.com [143.182.124.5]) by mx1.FreeBSD.org (Postfix) with ESMTP id B9E1D43E4A for ; Tue, 28 Jan 2003 09:53:04 -0800 (PST) (envelope-from jreynold@sedona.ch.intel.com) Received: from sedona.intel.com (sedona.ch.intel.com [143.182.202.83]) by petasus.ch.intel.com (8.11.6/8.11.6/d: solo.mc,v 1.49 2003/01/13 19:45:39 dmccart Exp $) with ESMTP id h0SHrcx22092 for ; Tue, 28 Jan 2003 17:53:38 GMT Received: from chlx255.ch.intel.com (chlx255.ch.intel.com [143.182.223.69]) by sedona.intel.com (8.11.6/8.11.6/d:) with ESMTP id h0SHr4719831 for ; Tue, 28 Jan 2003 10:53:04 -0700 (MST) X-Envelope-To: X-Envelope-From: jreynold@sedona.ch.intel.com Received: (from jreynold@localhost) by chlx255.ch.intel.com (8.11.6/8.9.1/d: client.m4,v 1.3 1998/09/29 16:36:11 sedayao Exp sedayao $) id h0SHr3U26778; Tue, 28 Jan 2003 10:53:03 -0700 X-Authentication-Warning: chlx255.ch.intel.com: jreynold set sender to jreynold@sedona.ch.intel.com using -f From: John Reynolds~ MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15926.50047.494451.473350@chlx255.ch.intel.com> Date: Tue, 28 Jan 2003 10:53:03 -0700 To: questions@freebsd.org Subject: is our printf(1) behavior correct w.r.t \0 escapes? X-Mailer: VM 7.07 under Emacs 20.7.1 Cc: Sender: owner-freebsd-questions@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG Hi all, a friend of mine is working on a script which we want to be portable between Linux and FreeBSD (it utilizes several external programs to do its work). The last thing we've tripped on seems like a show-stopper. We need to echo a string *and* a NUL character (\0) into a stream so that a program that delimits its input by \0 characters will do the right thing. He had been doing this via printf(1) like so: % printf "some string\0" | some_process however, it never worked under FreeBSD. Upon further inspection, our printf(1) does not work like the GNU one with the above string. Consider this from a linux box: linux [~]<374>% printf "foo\0bar\0" | od -c 0000000 f o o \0 b a r \0 0000010 Now the same command from a FreeBSD (4.7-STABLE) box: freebsd [~]<76>% printf "foo\0bar\0" | od -c 0000000 f o o 0000003 After checking the man pages, I also used a complete octal constant but that doesn't work either: linux [~]<376>% printf "foo\0000" | od -c 0000000 f o o \0 0000004 freebsd [~]<77>% printf "foo\0000" | od -c 0000000 f o o 0000003 I checked our implementation and it seems wrong. The first step done in the source code is to interpolate all escape sequences. However, when it does this and the octal number happens to be "0", this fact is not "captured" later on and that 0 becomes the NULL terminator for the string and nothing else is printed after it. linux [~]<379>% printf "foo\0%d" 4 | od -c 0000000 f o o \0 4 0000005 freebsd [~]<78>% printf "foo\0%d" 4 | od -c printf: missing format character 0000000 f o o 0000003 This behavior has been checked on HP-UX and Solaris and those two systems are identical to the Linux one. It seems to me that our printf(1)'s behavior is incorrect. Comments? -Jr -- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= |John Reynolds Sr. Component Design Engineer - ICG/EID/Si Engineering | |Intel Corporation MS: CH6-302 Phone: 480-554-9092 pgr: 602-868-6512 | |jreynold@sedona.ch.intel.com http://www-aec.ch.intel.com/~jreynold/ | =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message