The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > High Level Programming
.
google unix.com



High Level Programming Post questions about C, C++, Java, SQL, and other programming languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Protecting the directory tree rooneyl UNIX for Dummies Questions & Answers 2 02-17-2008 05:59 PM
directory tree ravi raj kumar Shell Programming and Scripting 3 01-24-2008 01:08 PM
Searching directory tree blane Shell Programming and Scripting 7 05-29-2007 07:30 PM
Space Used by Directory Tree johnk99 Filesystems, Disks and Memory 1 07-22-2002 12:30 PM
Directory tree search??? solvman High Level Programming 3 09-28-2001 01:27 PM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 02-28-2007
anything2 anything2 is offline
Registered User
  
 

Join Date: Feb 2007
Posts: 2
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:::

Code:
/* 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;
}

Last edited by Perderabo; 02-28-2007 at 01:37 AM.. Reason: Add code tags for readability
  #2 (permalink)  
Old 02-28-2007
Perderabo's Avatar
Perderabo Perderabo is online now Forum Staff  
Unix Daemon
  
 

Join Date: Aug 2001
Location: Ashburn, Virginia
Posts: 9,112
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
Code:
	//print file type
	if(modestr[0]=='d')//dir
	{do_ls(path,count);
	}
	else
	{
 printf( "%s"  , fname2 );
You need a } after that.
  #3 (permalink)  
Old 03-01-2007
matrixmadhan matrixmadhan is online now Forum Advisor  
Technorati Master
  
 

Join Date: Mar 2005
Location: leaf node in B+ tree
Posts: 2,952
Code:
#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
Closed Thread

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT -4. The time now is 02:59 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0