/****************************************************************************
 |  (C) Copyright 2008 Novell, Inc. All Rights Reserved.
 |
 |  GPLv2: This program is free software; you can redistribute it
 |  and/or modify it under the terms of version 2 of the GNU General
 |  Public License as published by the Free Software Foundation.
 |
 |  This program is distributed in the hope that it will be useful,
 |  but WITHOUT ANY WARRANTY; without even the implied warranty of
 |  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 |  GNU General Public License for more details.
 +-------------------------------------------------------------------------*/

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

#include <puny.h>

/*
 * CHDIR(2)                   Linux Programmer's Manual                CHDIR(2)
 *
 * NAME
 *     chdir, fchdir - change working directory
 *
 * SYNOPSIS
 *     #include <unistd.h>
 *
 *     int chdir(const char *path);
 *     int fchdir(int fd);
 *
 * Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
 *
 *     fchdir(): _BSD_SOURCE || _XOPEN_SOURCE >= 500
 *
 * DESCRIPTION
 *     chdir() changes the current working directory of the calling process to
 *     the directory specified in path.
 *
 *     fchdir() is identical to chdir();  the  only  difference  is  that  the
 *     directory is given as an open file descriptor.
 *
 * RETURN VALUE
 *     On  success,  zero is returned.  On error, -1 is returned, and errno is
 *     set appropriately.
 *
 * ERRORS
 *     Depending on the file system, other errors can be returned.   The  more
 *     general errors for chdir() are listed below:
 *
 *     EACCES Search  permission  is denied for one of the components of path.
 *            (See also path_resolution(7).)
 *
 *     EFAULT path points outside your accessible address space.
 *
 *     EIO    An I/O error occurred.
 *
 *     ELOOP  Too many symbolic links were encountered in resolving path.
 *
 *     ENAMETOOLONG
 *            path is too long.
 *
 *     ENOENT The file does not exist.
 *
 *     ENOMEM Insufficient kernel memory was available.
 *
 *     ENOTDIR
 *            A component of path is not a directory.
 *
 *     The general errors for fchdir() are listed below:
 *
 *     EACCES Search permission was denied on the directory open on fd.
 *
 *     EBADF  fd is not a valid file descriptor.
 *
 * CONFORMING TO
 *     SVr4, 4.4BSD, POSIX.1-2001.
 *
 * NOTES
 *     The current working directory is the starting  point  for  interpreting
 *     relative pathnames (those not starting with '/').
 *
 *     A child process created via fork(2) inherits its parent's current work‐
 *     ing directory.  The current working  directory  is  left  unchanged  by
 *     execve(2).
 *
 *     The prototype for fchdir() is only available if _BSD_SOURCE is defined,
 *     or _XOPEN_SOURCE is defined with the value 500.
 *
 * SEE ALSO
 *     chroot(2), getcwd(3), path_resolution(7)
 *
 * COLOPHON
 *     This page is part of release 3.23 of the Linux  man-pages  project.   A
 *     description  of  the project, and information about reporting bugs, can
 *     be found at http://www.kernel.org/doc/man-pages/.
 *
 * Linux                           2007-07-26                          CHDIR(2)
 */

int main (int argc, char *argv[])
{
	int		rc;

	punyopt(argc, argv, NULL, NULL);
	rc = chdir(Option.dir);
	if (rc == -1) {
		rc = errno;
		fprintf(stderr, "chdir %s: %s\n",
				argv[1], strerror(errno));
		return rc;
	}
	return 0;
}
