2 $Id: unix.c,v 1.4 2010-02-19 11:29:52 franklahm Exp $
3 Copyright (c) 2010 Frank Lahm <franklahm@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
18 * Netatalk utility functions
23 #endif /* HAVE_CONFIG_H */
30 #include <sys/types.h>
35 #include <atalk/adouble.h>
37 #include <atalk/afp.h>
38 #include <atalk/logger.h>
39 #include <atalk/volume.h>
40 #include <atalk/vfs.h>
41 #include <atalk/util.h>
42 #include <atalk/unix.h>
45 * @brief get cwd in static buffer
47 * @returns pointer to path or pointer to error messages on error
49 const char *getcwdpath(void)
51 static char cwd[MAXPATHLEN + 1];
54 if ((p = getcwd(cwd, MAXPATHLEN)) != NULL)
57 return strerror(errno);
61 * @brief symlink safe chdir replacement
63 * Only chdirs to dir if it doesn't contain symlinks.
65 * @returns 1 if a path element is a symlink, 0 otherwise, -1 on syserror
67 int lchdir(const char *dir)
70 char buf[MAXPATHLEN+1];
71 #ifdef REALPATH_TAKES_NULL
74 char rpath[MAXPATHLEN+1];
77 /* dir might be an relative or an absolute path */
79 /* absolute path, just make sure buf is prepared for strlcat */
82 /* relative path, push cwd int buf */
83 if (getcwd(buf, MAXPATHLEN) == NULL)
85 if (strlcat(buf, "/", MAXPATHLEN) >= MAXPATHLEN)
89 if (strlcat(buf, dir, MAXPATHLEN) >= MAXPATHLEN)
92 #ifdef REALPATH_TAKES_NULL
93 if ((rpath = realpath(dir, NULL)) == NULL) {
95 if (realpath(dir, rpath) == NULL) {
103 * chdir request | realpath result | ret
104 * (after getwcwd) | |
105 * =======================================
108 * /a/b/. | /c/d/e/f | 1
111 for (int i = 0; rpath[i]; i++) {
112 if (buf[i] != rpath[i]) {
118 if (chdir(dir) != 0) {
124 #ifdef REALPATH_TAKES_NULL