summaryrefslogtreecommitdiff
path: root/src/libstddjb/realpath_tmp.c
blob: 8f877dd83d014ec9362f7d0a55f90cc6837b87f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* ISC license. */

#include <limits.h>
#include <errno.h>
#include <skalibs/bytestr.h>
#include <skalibs/stralloc.h>
#include <skalibs/djbunix.h>

#ifndef PATH_MAX
# define PATH_MAX 4095
#endif

char *realpath_tmp (char const *name, char *buf, stralloc *tmp)
{
  unsigned int tmpbase = tmp->len ;
  if (sarealpath(tmp, name) == -1) return (char *)0 ;
  if (tmp->len - tmpbase > PATH_MAX)
  {
    tmp->len = tmpbase ;
    return (errno = ENAMETOOLONG, (char *)0) ;
  }
  byte_copy(buf, tmp->len - tmpbase, tmp->s + tmpbase) ;
  buf[tmp->len - tmpbase] = 0 ;
  tmp->len = tmpbase ;
  return buf ;
}