读取软连接

/*
 *[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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值