git/symlinks.c

49 строки
862 B
C

#include "cache.h"
int has_symlink_leading_path(const char *name, char *last_symlink)
{
char path[PATH_MAX];
const char *sp, *ep;
char *dp;
sp = name;
dp = path;
if (last_symlink && *last_symlink) {
size_t last_len = strlen(last_symlink);
size_t len = strlen(name);
if (last_len < len &&
!strncmp(name, last_symlink, last_len) &&
name[last_len] == '/')
return 1;
*last_symlink = '\0';
}
while (1) {
size_t len;
struct stat st;
ep = strchr(sp, '/');
if (!ep)
break;
len = ep - sp;
if (PATH_MAX <= dp + len - path + 2)
return 0; /* new name is longer than that??? */
memcpy(dp, sp, len);
dp[len] = 0;
if (lstat(path, &st))
return 0;
if (S_ISLNK(st.st_mode)) {
if (last_symlink)
strcpy(last_symlink, path);
return 1;
}
dp[len++] = '/';
dp = dp + len;
sp = ep + 1;
}
return 0;
}