Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Copyright (C) 2011 Pali Rohar pali dot rohar at gmail dot com
- // License: GPL
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <limits.h>
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <libgen.h>
- #include <mntent.h>
- char * find_mnt_dir(const char * dir) {
- char save_cwd[PATH_MAX];
- char last_cwd[PATH_MAX];
- char cwd[PATH_MAX];
- char * mnt_dir = NULL;
- struct stat st;
- __dev_t last_dev;
- __ino_t last_ino;
- if ( ! getcwd(save_cwd, sizeof(save_cwd)) ) {
- fprintf(stderr, "Error: Cannot store working directory: %s\n", strerror(errno));
- return NULL;
- }
- if ( stat(dir, &st) != 0 ) {
- fprintf(stderr, "Error: Cannot stat %s: %s\n", dir, strerror(errno));
- return NULL;
- }
- if ( chdir(dir) == -1 ) {
- fprintf(stderr, "Error: Cannot change directory to %s: %s\n", dir, strerror(errno));
- return NULL;
- }
- if ( ! getcwd(last_cwd, sizeof(last_cwd)) ) {
- fprintf(stderr, "Error: Cannot get working directory: %s\n", strerror(errno));
- if ( chdir(save_cwd) == -1 )
- fprintf(stderr, "Error: Cannot restore working directory: %s\n", strerror(errno));
- return NULL;
- }
- last_dev = st.st_dev;
- last_ino = st.st_ino;
- while ( 1 ) {
- if ( chdir("..") == -1 ) {
- fprintf(stderr, "Error: Cannot change working directory: %s\n", strerror(errno));
- break;
- }
- if ( ! getcwd(cwd, sizeof(cwd)) ) {
- fprintf(stderr, "Error: Cannot get working directory: %s\n", strerror(errno));
- break;
- }
- if ( stat(cwd, &st) != 0 ) {
- fprintf(stderr, "Error: Cannot stat %s: %s\n", cwd, strerror(errno));
- break;
- }
- if ( last_dev != st.st_dev || last_ino == st.st_ino ) {
- mnt_dir = strdup(last_cwd);
- break;
- }
- if ( strcmp(cwd, "/") == 0 ) {
- mnt_dir = strdup("/");
- break;
- }
- last_dev = st.st_dev;
- last_ino = st.st_ino;
- strcpy(last_cwd, cwd);
- }
- if ( chdir(save_cwd) == -1 )
- fprintf(stderr, "Error: Cannot restore working directory: %s\n", strerror(errno));
- return mnt_dir;
- }
- char * find_dev(const char * mnt_dir) {
- struct mntent * mnt;
- char * dev = NULL;
- FILE * file;
- file = setmntent("/etc/mtab", "r");
- if ( ! file ) {
- fprintf(stderr, "Error: Cannot open file /etc/mtab: %s\n", strerror(errno));
- return NULL;
- }
- while ( mnt = getmntent(file) ) {
- if ( strcmp(mnt->mnt_dir, mnt_dir) == 0 ) {
- dev = strdup(mnt->mnt_fsname);
- break;
- }
- }
- endmntent(file);
- return dev;
- }
- int main(int argc, char * argv[]) {
- struct stat st;
- char * mnt_dir;
- char * dev;
- if ( argc != 2 ) {
- printf("Usage: %s location\n", argv[0]);
- return 1;
- }
- if ( stat(argv[1], &st) != 0 ) {
- fprintf(stderr, "Error: Cannot stat %s: %s\n", argv[1], strerror(errno));
- return 1;
- }
- if ( ! S_ISDIR(st.st_mode) )
- argv[1] = dirname(argv[1]);
- mnt_dir = find_mnt_dir(argv[1]);
- if ( ! mnt_dir ) {
- fprintf(stderr, "Error: Cannot find mount dir\n");
- return 1;
- }
- dev = find_dev(mnt_dir);
- if ( ! dev ) {
- fprintf(stderr, "Error: Cannot find device for mount dir %s\n", mnt_dir);
- free(mnt_dir);
- return 1;
- }
- printf("%s\n", dev);
- free(mnt_dir);
- free(dev);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement