#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include    <pwd.h>
ino_t get_inode(char *);
void printpathto(ino_t);
void inum_to_name(ino_t, char *, int);

int main() {
 printpathto(get_inode(".")); /* print path to here */
 putchar('\n'); /* then add newline */
 return 0;
}

/*
 *        prints path leading down to an object with this inode
 * kind of recursive
 */
void printpathto(ino_t this_inode) {
 ino_t my_inode;
 char its_name[BUFSIZ];
 if (get_inode("..") != this_inode) {
  chdir(".."); /* up one dir */
  inum_to_name(this_inode, its_name, BUFSIZ);/* get its name*/
  my_inode = get_inode("."); /* print head */
  printpathto(my_inode); /* recursively */
  printf("/%s", its_name); /* now print name of this */
 }
}
void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen) {
 DIR *dir_ptr; /* the directory */
 struct dirent *direntp; /* each entry  */
 dir_ptr = opendir(".");
 if (dir_ptr == NULL) {
  perror(".");
  exit(1);
 }/* search directory for a file with specified inum */
 while ((direntp = readdir(dir_ptr)) != NULL)
  if (direntp->d_ino == inode_to_find) {
   strncpy(namebuf, direntp->d_name, buflen);
   namebuf[buflen - 1] = '\0'; /* just in case */
   closedir(dir_ptr);
   return;
  }
 fprintf(stderr, "error looking for inum %d\n", inode_to_find);
 exit(1);

}

/*
 * returns inode number of the file
 */
ino_t get_inode(char *fname) {
 struct stat info;

 if (stat(fname, &info) == -1) {
  fprintf(stderr, "Cannot stat ");
  perror(fname);
  return 1;
 }
 return info.st_ino;
}

創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()