F GETPATH

From Attie's Wiki
Jump to: navigation, search

This is untested code...

char es[1024];
 
int getpath(int fd) {
	static char fname[PATH_MAX];
#if 0
	/* this would be nice... */
	if (fcntl(fd, F_GETPATH, fname) == -1) {
		strerror_r(errno, es, sizeof(es));
		fprintf(stderr, "fcntl(): %s\n", es);
		return -1;
	}
#else
	{
		const char t[PATH_MAX];
		struct stat a, b;
		snprintf(t, sizeof(t), "/proc/self/fd/%d", fd);
		if (readlink(t, fname, sizeof(fname)) == -1) {
			strerror_r(errno, es, sizeof(es));
			fprintf(stderr, "readlink(%s): %s\n", t, es);
			return -1;
		}
 
		if (stat(fname, &a) == -1) {
			strerror_r(errno, es, sizeof(es));
			fprintf(stderr, "stat(%s): %s\n", fname, es);
			return -1;
		}
		if (stat(t, &b) == -1) {
			strerror_r(errno, es, sizeof(es));
			fprintf(stderr, "stat(%s): %s\n", t, es);
			return -1;
		}
 
		if (a.st_dev != b.st_dev || a.st_ino != b.st_ino) {
			fprintf(stderr, "getpath(): file lost...\n");
			return -1;
		}
	}
#endif
	return 0;
}
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox