directory as tree

hi i have modified a program to display directory entries recursively in a tree like form
i need an output with the following guidelines:
the prog displays the contents of the directory
the directory contents are sorted before printing so that directories come before regular files
if an entry is a directory program executes recursively
executable files end with a *
directory ends with a /
links end with -> followed by the actual link
for each directory use two additional space char in addition to the current spacing

if an option -s is given,prog displays only dir str but not contents

eg of output
subj/
docu/
school.doc
RCS -> /mnt/anything2/folder1

the problem is it isnt complete and it isnt compl\iling
please help

my program:::

/* ls2.c
 *	purpose  list contents of directory or directories
 *	action   if no args, use .  else list files in args
 *	note     uses stat and pwd.h and grp.h 
 *	BUG: try ls2 /tmp  
 */
#include	<stdio.h>
#include	<sys/types.h>
#include	<dirent.h>
#include	<sys/stat.h>
#include	<time.h>
#include	<unistd.h>

void do_ls(char[], int);
void dostat(char *,char *,int);
void show_file_info( char *, struct stat *,char *,int);
void mode_to_letters( int , char [] );
char *uid_to_name( uid_t );
char *gid_to_name( gid_t );
//int flag
main(int ac, char *av[])
{	
	//char c;
	//int flag=0;
	int counter=0;
	//if(ch == 's'){flag =1;}
	if ( ac == 1 )
		do_ls( ".",counter );
	else
		while ( --ac ){
			++av;
			do_ls( *av,counter );
		}
}

void do_ls( char dirname[] ,int count)
/*
 *	list files in directory called dirname
 */
{
	DIR		*dir_ptr;		/* the directory */
	struct dirent	*direntp;		/* each entry	 */
	char *cwd;
	count++;

	if ( ( dir_ptr = opendir( dirname ) ) == NULL )
		fprintf(stderr,"ls1: cannot open %s\n", dirname);
	else
	{
		if(dirname=="."){
			if((cwd= getcwd(NULL,64))==NULL){
				perror("pwd");
				exit(2);
				}
				(void)printf("%s\n",cwd);
				}
			else{
				if(dirname[0]=='.'){
				dirname+=2;
				
				printf("%s/\n", dirname);
				dirname-=2;
				}
				else (void)printf("%s/\n", dirname);
			    }
		while ( ( direntp = readdir( dir_ptr ) ) != NULL )
		if ((strcmp(direntp->d_name,"."))!=0 && (strcmp(direntp->d_name,".."))!=0)
		{
			dostat(dirname, direntp->d_name,count );
		}closedir(dir_ptr);
	}
}

void dostat(char* directoryName, char *filename ,int count )
{
	struct stat info;
	char path[128];
	
	sprintf(path, "%s/%s",directoryName,filename);
	if ( stat(path, &info) == -1 )		/* cannot stat	 */
		perror( path );			/* say why	 */
	else					/* else show info	 */
		show_file_info( path, &info,filename);
}

void show_file_info( char *path, struct stat *info_p, char* fname2, int count )
/*
 * display the info about 'filename'.  The info is stored in struct at *info_p
 */
{
	int sizetest;
	int condition=count;
	
	while(condition>0){
	printf("    ");
	condition--;
	}
	
	char	*uid_to_name(), *ctime(), *gid_to_name(), *filemode();
	
	void	mode_to_letters();
        char    modestr[11];

	mode_to_letters( info_p->st_mode, modestr );
	
	//print file type
	if(modestr[0]=='d')//dir
	{do_ls(path,count);
	}
	else
	{
 printf( "%s"  , fname2 );
	
	
	//do_ls(path );


	if(modestr[0]!='d' && (modestr[3]=='x' || modestr[6]=='x' || modestr[9]=='x'))
	{ 	
	printf( "*");

	}
	//else(modestr[0]=='l')
	
	//{ printf("%s\n" , filename );}

}

/*
 * utility functions
 */

/*
 * This function takes a mode value and a char array
 * and puts into the char array the file type and the 
 * nine letters that correspond to the bits in mode.
 * NOTE: It does not code setuid, setgid, and sticky
 * codes
 */
void mode_to_letters( int mode, char str[] )
{
    strcpy( str, "----------" );           /* default=no perms */

    if ( S_ISDIR(mode) )  str[0] = 'd';    /* directory?       */
    if ( S_ISCHR(mode) )  str[0] = 'c';    /* char devices     */
    if ( S_ISBLK(mode) )  str[0] = 'b';    /* block device     */

    if ( mode & S_IRUSR ) str[1] = 'r';    /* 3 bits for user  */
    if ( mode & S_IWUSR ) str[2] = 'w';
    if ( mode & S_IXUSR ) str[3] = 'x';

    if ( mode & S_IRGRP ) str[4] = 'r';    /* 3 bits for group */
    if ( mode & S_IWGRP ) str[5] = 'w';
    if ( mode & S_IXGRP ) str[6] = 'x';

    if ( mode & S_IROTH ) str[7] = 'r';    /* 3 bits for other */
    if ( mode & S_IWOTH ) str[8] = 'w';
    if ( mode & S_IXOTH ) str[9] = 'x';
}

#include	<pwd.h>

char *uid_to_name( uid_t uid )
/* 
 *	returns pointer to username associated with uid, uses getpw()
 */	
{
	struct	passwd *getpwuid(), *pw_ptr;
	static  char numstr[10];

	if ( ( pw_ptr = getpwuid( uid ) ) == NULL ){
		sprintf(numstr,"%d", uid);
		return numstr;
	}
	else
		return pw_ptr->pw_name ;
}

#include	<grp.h>

char *gid_to_name( gid_t gid )
/*
 *	returns pointer to group number gid. used getgrgid(3)
 */
{
	struct group *getgrgid(), *grp_ptr;
	static  char numstr[10];

	if ( ( grp_ptr = getgrgid(gid) ) == NULL ){
		sprintf(numstr,"%d", gid);
		return numstr;
	}
	else
		return grp_ptr->gr_name;
}

Please read the rules:

(6) Do not post classroom or homework problems.

But I'll give you a couple of hints. The last line in function dostat is a call to show_file_info, but there are only two args. The function show_file_info is just below that and you can see that it uses fore args. And in show_file_info you have

	//print file type
	if(modestr[0]=='d')//dir
	{do_ls(path,count);
	}
	else
	{
 printf( "%s"  , fname2 );

You need a } after that.

#include	<stdio.h>
#include	<pwd.h>
#include	<grp.h>
#include	<sys/types.h>
#include	<dirent.h>
#include	<sys/stat.h>
#include	<time.h>
#include	<unistd.h>

void do_ls(char[], int);
void dostat(char *,char *,int);
void show_file_info( char *, struct stat *,char *,int);
void mode_to_letters( int , char [] );
char *uid_to_name( uid_t );
char *gid_to_name( gid_t );

int main(int ac, char *av[])
{	
	//char c;
	//int flag=0;
	int counter=0;
	//if(ch == 's'){flag =1;}
	if ( ac == 1 )
		do_ls( ".",counter );
	else
		while ( --ac ){
			++av;
			do_ls( *av,counter );
		}
  return 0;
}

void do_ls( char dirname[] ,int count)
/*
 *	list files in directory called dirname
 */
{
	DIR		*dir_ptr;		/* the directory */
	struct dirent	*direntp;		/* each entry	 */
	char *cwd;
	count++;

	if ( ( dir_ptr = opendir( dirname ) ) == NULL )
		fprintf(stderr,"ls1: cannot open %s\n", dirname);
	else
	{
		if(dirname=="."){
			if((cwd= getcwd(NULL,64))==NULL){
				perror("pwd");
				exit(2);
				}
				(void)printf("%s\n",cwd);
				}
			else{
				if(dirname[0]=='.'){
				dirname+=2;
				
				printf("%s/\n", dirname);
				dirname-=2;
				}
				else (void)printf("%s/\n", dirname);
			    }
		while ( ( direntp = readdir( dir_ptr ) ) != NULL )
		if ((strcmp(direntp->d_name,"."))!=0 && (strcmp(direntp->d_name,".."))!=0)
		{
			dostat(dirname, direntp->d_name,count );
		}closedir(dir_ptr);
	}
}

void dostat(char* directoryName, char *filename ,int count )
{
	struct stat info;
	char path[128];

	sprintf(path, "%s/%s",directoryName,filename);
	if ( stat(path, &info) == -1 )		/* cannot stat	 */
		perror( path );			/* say why	 */
	else					/* else show info	 */
        {
           show_file_info( path, &info,filename, count);
        }
}

void show_file_info( char *path, struct stat *info_p, char* fname2, int count )
/*
 * display the info about 'filename'.  The info is stored in struct at *info_p
 */
{
	int sizetest;
	int condition=count;
	
	while(condition>0){
	printf("    ");
	condition--;
	}
	
	//char	*uid_to_name(), *ctime(), *gid_to_name(), *filemode();
	
	//void	mode_to_letters();
        char    modestr[11];

	mode_to_letters( info_p->st_mode, modestr );
	
	//print file type
	if(modestr[0]=='d')//dir
	{do_ls(path,count);
	}
	else
	{
             printf( "%s"  , fname2 );
	
	     if(modestr[0]!='d' && (modestr[3]=='x' || modestr[6]=='x' || modestr[9]=='x'))
	     { 	
	       printf( "*");
	     }
        }
}

/*
 * utility functions
 */

/*
 * This function takes a mode value and a char array
 * and puts into the char array the file type and the 
 * nine letters that correspond to the bits in mode.
 * NOTE: It does not code setuid, setgid, and sticky
 * codes
 */
void mode_to_letters( int mode, char str[] )
{
    strcpy( str, "----------" );           /* default=no perms */

    if ( S_ISDIR(mode) )  str[0] = 'd';    /* directory?       */
    if ( S_ISCHR(mode) )  str[0] = 'c';    /* char devices     */
    if ( S_ISBLK(mode) )  str[0] = 'b';    /* block device     */

    if ( mode & S_IRUSR ) str[1] = 'r';    /* 3 bits for user  */
    if ( mode & S_IWUSR ) str[2] = 'w';
    if ( mode & S_IXUSR ) str[3] = 'x';

    if ( mode & S_IRGRP ) str[4] = 'r';    /* 3 bits for group */
    if ( mode & S_IWGRP ) str[5] = 'w';
    if ( mode & S_IXGRP ) str[6] = 'x';

    if ( mode & S_IROTH ) str[7] = 'r';    /* 3 bits for other */
    if ( mode & S_IWOTH ) str[8] = 'w';
    if ( mode & S_IXOTH ) str[9] = 'x';
}


char *uid_to_name( uid_t uid )
/* 
 *	returns pointer to username associated with uid, uses getpw()
 */	
{
	struct	passwd *getpwuid(), *pw_ptr;
	static  char numstr[10];

	if ( ( pw_ptr = getpwuid( uid ) ) == NULL ){
		sprintf(numstr,"%d", uid);
		return numstr;
	}
	else
		return pw_ptr->pw_name ;
}


char *gid_to_name( gid_t gid )
/*
 *	returns pointer to group number gid. used getgrgid(3)
 */
{
	struct group *getgrgid(), *grp_ptr;
	static  char numstr[10];

	if ( ( grp_ptr = getgrgid(gid) ) == NULL ){
		sprintf(numstr,"%d", gid);
		return numstr;
	}
	else
		return grp_ptr->gr_name;
}

All your compilation problems are free now.

Try it out, and let us know for any difficulty or problems :slight_smile: