2015-04-20 2 views
0

Я хочу взять имя каталога по командной строке с функцией opendir(), но я не знаю, как ... Я реализовал функцию do_ls, и я пытаюсь передать имя каталога, задающего команду как аргумент.Как получить имя каталога с помощью opendir()?

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <string.h> 

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


int main(int ac, char *av[]) 
{ 
    if (ac == 1) 
     do_ls("."); 
    else 
     while (--ac){ 
      printf("%s:\n", *++av); 
      do_ls(*av); 
     } 
    return 0; 
} 


void do_ls(char argv[]) 
/* 
* list files in directory called dirname 
*/ 
{ 
    DIR  *dir_ptr;  
    struct dirent *direntp;  

    if ((dir_ptr = opendir(argv[0])) == NULL) 
     fprintf(stderr,"ls2: cannot open %s\n", argv[0]); 
    else 
    { 
     while ((direntp = readdir(dir_ptr)) != NULL) { 
      if (strcmp(direntp->d_name,".")==0 || 
       strcmp(direntp->d_name,"..")==0) continue; 
      dostat(direntp->d_name); 
     } 
     closedir(dir_ptr); 
    } 
} 


void dostat(char *filename) 
{ 
    struct stat info; 

    if (stat(filename, &info) == -1)  /* cannot stat */ 
     perror(filename);   /* say why */ 
    else     /* else show info */ 
     show_file_info(filename, &info); 
} 


void show_file_info(char *filename, struct stat *info_p) 
/* 
* display the info about 'filename'. The info is stored in struct at *info_p 
*/ 
{ 
    char *uid_to_name(), *ctime(), *gid_to_name(), *filemode(); 
    void mode_to_letters(); 
     char modestr[11]; 

    mode_to_letters(info_p->st_mode, modestr); 

    printf("%s" , modestr); 
    printf("%4d " , (int) info_p->st_nlink); 
    printf("%-8s " , uid_to_name(info_p->st_uid)); 
    printf("%-8s " , gid_to_name(info_p->st_gid)); 
    printf("%8ld " , (long)info_p->st_size); 
    printf("%.12s ", 4+ctime(&info_p->st_mtime)); 
    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; 
} 
+0

Обратите внимание, что 'dostat()' должно быть указано имя каталога, а также имя файла в каталоге; в противном случае он не сможет найти файл, если только имя каталога '.' (точка, текущий каталог). –

ответ

1

эта линия:

(argv[0]) 

извлекает первый символ из переданного параметра.

предложить:

(argv) 

поэтому получать указатель на строку завершенную нулем, которая была передана в функцию.

+0

Это одна из проблем, и компилятор должен сообщить OP об этой ошибке. Важно обратить внимание на предупреждения компилятора, и если у вас есть предупреждения о компиляторе, когда вы отправляете код, скажите так: это делает людей менее крестными, потому что им не нужно тратить время на разработку того, что происходит с кодом. –