pwd的实现

#include <string.h>

#include <stdlib.h>

#include <dirent.h>

#include <sys/types.h>

#include <sys/stat.h>



ino_t get_inode(char *);

void printpathto(ino_t);

void inum_to_name(ino_t, char *, int);



int main()

{

    printpathto(get_inode("."));

    printf("\n");

    return 0;

}



void printpathto(ino_t this_inode)

{

    ino_t my_inode;

    char its_name[BUFSIZ];

    if (get_inode("..") != this_inode)

    {   

        chdir("..");

        inum_to_name(this_inode, its_name, BUFSIZ);

        my_inode = get_inode(".");

        printpathto(my_inode);

        printf("/%s", its_name);

    }   



}



void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen)

{

    DIR     *dir_ptr;

    struct dirent *direntp;

    dir_ptr = opendir(".");

    if (dir_ptr == NULL)

    {   

        perror(".");

        exit(1);

    }   

    while ((direntp = readdir(dir_ptr)) != NULL)

        if (direntp->d_ino == inode_to_find)

        {   

            strncpy(namebuf, direntp->d_name, buflen);

            namebuf[buflen-1] = '\0';

            closedir(dir_ptr);

            return;

        }

    fprintf(stderr, "error looking for inum %d\n", inode_to_find);

    exit(1);

}



ino_t get_inode(char *fname)

{

    struct stat info;

    if (stat(fname, &info) == -1)

    {

        fprintf(stderr, "Cannot Stat");

        perror(fname);

        exit(1);

    }

    return info.st_ino;

}



 

你可能感兴趣的:(实现)