[comp.lang.c] get the file directory

cs00wsc@unccvax.UUCP (Shiang Chin) (11/15/89)

I am trying to the file list of a file directory on
Sun station running Unix. Can someone read the following
C code for me; I don't know what's wrong on my code.

#include <stdio.h>
#include <sys/types.h>
#include <sys/dir.h>
main(){
dir(".");
exit(0);
}

int dir(path)
  char* path;
{
  int fd;
  struct direct nbuf;

	if ((fd = open(path,0)) == -1)
  		return (0);
	while (read(fd,&nbuf, DIRSIZ(&nbuf)) {
		if (nbuf.d_fileno != 0)
			printf("%u %s\n",nbuf.d_namlen,nbuf.d_name);
		else 
			printf("error\n");
	}
	return 1;
}
------------------------------------------------------------------
If anyone knows the problem, please tell me how to solve this.
Thanks a lot.

cpcahil@virtech.uucp (Conor P. Cahill) (11/15/89)

In article <1724@unccvax.UUCP>, cs00wsc@unccvax.UUCP (Shiang Chin) writes:
> I am trying to the file list of a file directory on
> Sun station running Unix. Can someone read the following
> C code for me; I don't know what's wrong on my code.
> 
  [ example of reading fixed length directory entries deleted ]

> If anyone knows the problem, please tell me how to solve this.
> Thanks a lot.

The problem is that Sun uses a BSD style directory that does not have
fixed length directory entries.  You should use the opendir(), readdir(), etc
library calls to process the directory entries.

Doug gwyn posted a portable version of these directory utilities (that 
work for both system V and BSD file systems) to comp.sources.unix (I think). 

You can either use the standard BSD functions that are included in the sun libc
or you can download the portable versions.

-- 
+-----------------------------------------------------------------------+
| Conor P. Cahill     uunet!virtech!cpcahil      	703-430-9247	!
| Virtual Technologies Inc.,    P. O. Box 876,   Sterling, VA 22170     |
+-----------------------------------------------------------------------+

gwyn@smoke.BRL.MIL (Doug Gwyn) (11/16/89)

In article <1724@unccvax.UUCP> cs00wsc@unccvax.UUCP (Shiang Chin) writes:
>... I don't know what's wrong on my code.

The main thing wrong is that you're attempting to read a directory
as though it were an ordinary data file.  These days, that's a poor
assumption, and you should always use the portable <dirent.h>
interface to read directories.

chris@mimsy.umd.edu (Chris Torek) (11/20/89)

>In article <1724@unccvax.UUCP> cs00wsc@unccvax.UUCP (Shiang Chin) writes:
>>... I don't know what's wrong on my code.

(Well, for one thing, it is in the wrong newsgroup: it is a Unix-specific
question.  Merely because the directory reading is written in C does not
make directory-reading a C operation, and questions about reading Unix
directories belong in a Unix newsgroup---just as questions about reading
MS-DOS directories belong in an MS-DOS newsgroup.)

In article <11602@smoke.BRL.MIL> gwyn@smoke.BRL.MIL (Doug Gwyn) writes:
>The main thing wrong is that you're attempting to read a directory
>as though it were an ordinary data file.  These days, that's a poor
>assumption, and you should always use the portable <dirent.h>
>interface to read directories.

Actually, the directory still *is* (almost) an ordinary data file; but
it is a data file with a complex format, not a simple collection of
fixed-length records.  Once you Reach Out over NFS (or are we allowed
to use the words `Reach Out' with NFS, that being a Sun system? :-) ),
however, directories are indeed not anything at all like ordinary data
files.
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain:	chris@cs.umd.edu	Path:	uunet!mimsy!chris