/*
*[silent]#gcc readlink.c -o readlink
*[silent]#./readlink /usr/bin/vi
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <linux/limits.h>
#include <sys/stat.h>
int is_slink(char *file)
{
struct stat file_stat= {0};
if (lstat(file, &file_stat) == -1)
return 0;
return S_ISLNK(file_stat.st_mode) ? 1 : 0;
}
char *get_realpath(const char *file, char *realpath)
{
#define MAX_LINK_DEPTH 8
int depth = 0;
char buf[PATH_MAX] = {0};
if (realpath == NULL || file == NULL)
return NULL;
snprintf(buf, PATH_MAX, "%s", file);
snprintf(realpath, PATH_MAX, "%s", file);
for (; depth <= MAX_LINK_DEPTH; ) {
if (is_slink(buf)) {
memset(realpath, 0, PATH_MAX);
readlink(buf, realpath, PATH_MAX);
memset(buf, 0, PATH_MAX);
snprintf(buf, PATH_MAX, "%s", realpath);
continue;
}
break;
}
return realpath;
}
int main(int argc, char **argv)
{
char *file = argv[1];
char realpath[PATH_MAX] = {0};
get_realpath(file, realpath);
printf("real path = %s\n", realpath);
}
读取软连接
最新推荐文章于 2025-01-09 16:37:03 发布