1/* A safer version of chdir, which returns back to the
2   initial working directory when the program exits.  */
3
4#include <errno.h>
5#include <stdlib.h>
6#include <unistd.h>
7
8static char *initial_wd;
9
10static void
11restore_wd (void)
12{
13  chdir (initial_wd);
14}
15
16int
17chdir_safer (char const *dir)
18{
19  if (! initial_wd)
20    {
21      size_t s;
22      for (s = 256;  ! (initial_wd = getcwd (0, s));  s *= 2)
23	if (errno != ERANGE)
24	  return -1;
25      if (atexit (restore_wd) != 0)
26	{
27	  free (initial_wd);
28	  initial_wd = 0;
29	  return -1;
30	}
31    }
32
33  return chdir (dir);
34}
35