42-archive/42sh/src/builtin/bt_cd_process_symlink.c
2017-03-25 19:51:28 +01:00

36 lines
1.5 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* bt_cd_process_symlink.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/25 15:14:55 by ariard #+# #+# */
/* Updated: 2017/03/25 19:51:03 by ariard ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
#define CDERR_3 "cd : %s: Permission denied"
#define CDERR_4 "cd : %s: No such file or directory"
#define CDERR_5 "cd : %s: Symlink not resolved"
int bt_cd_process_symlink(char *target)
{
char buffer[PATH_MAX + 1];
ft_bzero(buffer, PATH_MAX + 1);
if (!is_directory(target))
return (SH_ERR(CDERR_4, target));
if (!access(target, R_OK))
return (SH_ERR(CDERR_3, target));
if (chdir(target))
return (SH_ERR(CDERR_4, target));
setwd("PWD");
if (readlink(target, buffer, PATH_MAX + 1) < 0)
return (SH_ERR(CDERR_5, target));
else if (ft_strlen(buffer) > 0)
builtin_setenv(NULL, (char*[]){"cd", "PWD", buffer, NULL}, NULL);
return (0);
}