c实现ls功能-王喜燕

myls.h

#ifndef __MYLS_H
#define __MYLS_H

#define BUFSIZE 1024

static int sum_blocks(const char *path);
static int mydu(const char *path);
static int is_dot_dir(const char *path);
int myls_h(const char *path);
int  myls_a(char *path);
int myls_i(char *path);
int myls_l(char *path);
int allstat(char *path);
int myls(int argc,char **argv);

#endif

myls.c

#include "myls.h"
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<string.h>
#include<glob.h>
#include<errno.h>
#include<dirent.h>
#include<time.h>
#include<grp.h>
#include<pwd.h>

/*实现ls -h功能*/

int myls_h(const char *path)
{
    glob_t globres;
    struct stat cur_stat;
    char buf[BUFSIZE] = {};

    if (lstat(path, &cur_stat) < 0) {
        perror("lstat()");
        return 1;
    }

    if (!S_ISDIR(cur_stat.st_mode)) {
        printf("%s",path);
        return 1;    
    }

    strcpy(buf, path);    
    strcat(buf, "/*");

    if (glob(buf, GLOB_NOSORT, NULL, &globres) != 0) {
        fprintf(stderr, "glob error\n");
        return 1;
    }

    for (int i = 0; i < globres.gl_pathc; i++) {
        printf("%-15s ",(globres.gl_pathv)[i]);
    }

    puts("\n");
    globfree(&globres);
    return 0;
}

int myls_i(char *path)
{
    struct stat cur_stat;
    int a;
    glob_t globre;
    a = lstat(path, &cur_stat);
    char buf[BUFSIZE] = {};

    if(a<0)
    {
        perror("lstat()");
        return 1;
    }

    if(!S_ISDIR(cur_stat.st_mode))
    {
        printf("%ld %s\n ",cur_stat.st_ino,path);
        return 1;
    }

    strcpy(buf,path);
    strcat(buf,"/*");
    glob(buf,0,NULL,&globre);

    for(int i = 0;i<globre.gl_pathc;i++)
    {
        if(lstat(((globre.gl_pathv)[i]),&cur_stat)<0)
        {
            perror("lstat()");
            return 1;
        }
        printf("%5ld %5s  ",cur_stat.st_ino,globre.gl_pathv[i]);
    }
    puts("\n");
    globfree(&globre);
    return 0;
}
/*实现ls -a功能*/
int  myls_a(char *path)
{
    DIR *dp = NULL;
    struct dirent *entry = NULL;
    struct stat cur_stat;

    if (lstat(path, &cur_stat) < 0) {
        perror("lstat()");
        return 1;
    }

    if (!S_ISDIR(cur_stat.st_mode)) {
        printf("%s",path);
     }

    dp = opendir(path);

    if (NULL == dp) {
        perror("opendir()");
        return 1;
    }

    // read
    while (1) {
        entry = readdir(dp);
        if (NULL == entry) {
            if (errno) {
                perror("readdir()");
                goto ERROR;
            }
            break;
        }
        printf("%-10s ", entry->d_name);
    }

    closedir(dp);
    puts("\n");
    return 0;

ERROR:
    closedir(dp);
    return 1;
}
/*文件的状态信息*/
int allstat(char *path)
{
    struct stat mystat;
    struct passwd *paswdname = NULL;
    struct group *grname = NULL;
    struct tm *tmp = NULL;
    char buf[BUFSIZE] = {};
    int a;

    a = stat(path,&mystat);
    if(a == -1)
    {
        perror("stat()");
        return 1;
    }
    /*文件的类型*/
    switch(mystat.st_mode & S_IFMT)
    {
        case S_IFREG : printf("-"); break;
        case S_IFDIR : printf("d"); break;
        case S_IFCHR : printf("c"); break;
        case S_IFBLK : printf("b"); break;
        case S_IFSOCK : printf("s"); break;
        case S_IFLNK : printf("l"); break;
        case S_IFIFO : printf("p"); break;
        default : break;
    }
    /*文件的权限*/
    if(mystat.st_mode & S_IRUSR)
        putchar('r');
    else
        putchar('-');
    if(mystat.st_mode & S_IWUSR)
        putchar('w');
    else
        putchar('-');
    if(mystat.st_mode & S_IXUSR)
    {
        if(mystat.st_mode & S_ISUID)
            putchar('s');
        else
            putchar('x');
    }
    else
        putchar('-');
    if(mystat.st_mode & S_IRGRP)
        putchar('r');
    else
        putchar('-');
    if(mystat.st_mode & S_IWGRP)
        putchar('w');
    else
        putchar('-');
    if(mystat.st_mode & S_IXGRP)
    {
        if(mystat.st_mode & S_ISGID)
            putchar('s');
        else
            putchar('x');
    }
    else
        putchar('-');
    if(mystat.st_mode & S_IROTH)
        putchar('r');
    else
        putchar('-');
    if(mystat.st_mode & S_IWOTH)
        putchar('w');
    else
        putchar('-');
    if(mystat.st_mode & S_IXOTH)
    {
        if(mystat.st_mode & S_ISVTX)
            putchar('t');
        else
            putchar('x');
    }
    else
        putchar('-');

    printf("%5ld ",mystat.st_nlink);
    paswdname = getpwuid(mystat.st_uid);
    printf("%5s ", paswdname->pw_name);
    grname = getgrgid(mystat.st_gid);
    printf("%5s ", grname->gr_name);
    printf("%5ld ",mystat.st_size);
    tmp = localtime(&mystat.st_mtime);
    if(tmp == NULL)
        return 1;
    strftime(buf, BUFSIZE, "%m月 %d %H:%M", tmp);
    printf("%5s ", buf);
    printf("%5s ", path);
    putchar('\n');
    return 0;
}
/*实现ls -l功能*/
int myls_l(char *path)
{
    glob_t globres;
    struct stat cur_stat;
    char buf[BUFSIZE] = {};
    if (lstat(path, &cur_stat) < 0) {
        perror("lstat()");
        return 1;
    }
    if (!S_ISDIR(cur_stat.st_mode)) {
        allstat(path);
        return 1;    
    }
    strcpy(buf, path);    
    strcat(buf, "/*");
    if (glob(buf, GLOB_NOSORT, NULL, &globres) != 0) {
        fprintf(stderr, "glob error\n");
        return 1;
    }

    for (int i = 0; i < globres.gl_pathc; i++) {
        allstat((globres.gl_pathv)[i]);
    }

    globfree(&globres);
    return 0;
}

int myls(int argc ,char **argv)
{

    int c;
    char *opt = "-l:a:i:h:";

    while(1)
    {
        if(c == -1)
            break;
        c = getopt(argc,argv,opt);
        switch(c)
        {
            case 'l':
                myls_l(optarg);
                break;
            case 'a':
                myls_a(optarg);
                break;
            case 'i':
                myls_i(optarg);
                break;
            case 'h':
                myls_h(optarg);
                break;
            case '?':
                printf("不认识此选项%s\n", argv[optind-1]);
                break;
            case 1:
                printf("非选项参数%s\n", argv[optind-1]);
                break;
            default:
                break;
        }
    }
    return 0;
}

main.c

#include "myls.h"
#include<stdio.h>
/*主函数*/

int main(int argc,char **argv)
{
    if(argc < 3)
        return 1;
    myls(argc,argv);
    return 0;
}

makefile

   main :main.o myls.o
     gcc main.o myls.o -o main
   clean:
     rm -rf *.o main

 

posted @ 2019-03-16 17:49  q*r&s  阅读(166)  评论(0编辑  收藏  举报