Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 09 Jun 2009 12:12:09 +0200
From:      Hendrik Hasenbein <hhasenbe@techfak.uni-bielefeld.de>
To:        Thomas Backman <serenity@exscape.org>
Cc:        freebsd-current@freebsd.org, Ivan Voras <ivoras@freebsd.org>
Subject:   Re: FS utils treates directories as files?
Message-ID:  <4A2E3579.20105@techfak.uni-bielefeld.de>
In-Reply-To: <60F36765-E4FA-4A2D-AD6B-E7881537F6DA@exscape.org>
References:  <B7437F9F-A8BF-4F49-AAE4-9B93B62B6223@exscape.org>	<h0l8gb$57r$1@ger.gmane.org> <60F36765-E4FA-4A2D-AD6B-E7881537F6DA@exscape.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Thomas Backman wrote:
> 
> On Jun 9, 2009, at 11:03 AM, Ivan Voras wrote:
> 
>> Thomas Backman wrote:
>>> FreeBSD 8.0-CURRENT r193521 (Jun 5), bash:
>>> [root@chaos /usr/ports]# file /
>>> /: directory
>>> [root@chaos /usr/ports]# cat /
>>> �g��=[root@chaos /usr/ports]#
>>> [root@chaos /usr/ports]# cat /usr/ports/mail
>>> �
>>
>> This is the traditional behaviour because yes, directories are just
>> simply ordinary files with a special bit set to distinguish them. Other
>> systems might have modified "cat" to check if directories are files but
>> it's not standard.
>>
>> You can easily check this yourself. The following small program should
>> work on every unix-ish system:
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <sys/fcntl.h>
>>
>> int main() {
>>     int fd, i;
>>     char buf[512];
>>     
>>     fd = open(".", O_RDONLY);
>>     read(fd, buf, 512);
>>     for (i = 0; i < 512; i++)
>>         printf("%4d ", buf[i]);
>> }
> 
> Yes, I realize that, and actually added a stat() call to cat to check
> for directories... before I realized it was true for other utils as well.
> I still think it's weird, though, and that the utils should check (as
> long as they return gibberish; less /etc on my GNU/Linux system actually
> shows a readable list of files - it seems as if less /etc == ls -al /etc
> | less). Is there *any* use for this behaviour, or is it simply there
> because nobody has added a check?

In rare cases you might want to look at the real content of the
directory file. Unix is all about having the choice. The linux variant
should give a hint of the form 'This file is a directory. Do you want to
'ls -la | less' instead? Like it does for 8bit content.

It isn't a GNU/linux feature. It depends on the distribution. Try a
slackware or a debian (debian does it sun style, but more /etc != less
/etc). They all handle it different. So you better don't use these
features if you want to retain portability.

(Example don't use #!/bin/sh and use bash features. It works on many
systems, but not all.)


Hendrik



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