/* cwd.c:
*
****************************************************************
* Copyright (C) 2002 Tom Lord
*
* See the file "COPYING" for further information about
* the copyright and warranty status of this work.
*/
#include "hackerlab/bugs/panic.h"
#include "hackerlab/os/errno.h"
#include "hackerlab/os/unistd.h"
#include "hackerlab/char/str.h"
#include "hackerlab/fs/cwd.h"
t_uchar *
safe_current_working_directory (void)
{
int ign;
char * it;
it = current_working_directory (&ign, 0);
if (!it)
panic ("unable to compute current working directory");
return it;
}
char *
current_working_directory (int * errn, struct alloc_limits * limits)
{
char * path;
size_t sizeof_path;
sizeof_path = 4096;
path = lim_malloc (limits, sizeof_path);
if (!path)
{
enomem_error:
*errn = ENOMEM;
if (path)
lim_free (limits, path);
return 0;
}
while (1)
{
if (getcwd (path, sizeof_path))
{
char * answer;
answer = lim_realloc (limits, path, str_length (path) + 1);
if (!answer)
goto enomem_error;
return answer;
}
else if (errno == ERANGE)
{
char * new_path;
sizeof_path *= 2;
new_path = lim_realloc (limits, path, sizeof_path);
if (!new_path)
goto enomem_error;
}
else
{
*errn = errno;
lim_free (limits, path);
return 0;
}
}
}
/* tag: Tom Lord Fri Feb 22 04:10:53 2002 (cwd.c)
*/
syntax highlighted by Code2HTML, v. 0.9.1