2 $Id: unix.c,v 1.6 2010-02-28 22:29:16 didg 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/vfs.h>
40 #include <atalk/util.h>
41 #include <atalk/unix.h>
44 * @brief get cwd in static buffer
46 * @returns pointer to path or pointer to error messages on error
48 const char *getcwdpath(void)
50 static char cwd[MAXPATHLEN + 1];
53 if ((p = getcwd(cwd, MAXPATHLEN)) != NULL)
56 return strerror(errno);
60 * @brief symlink safe chdir replacement
62 * Only chdirs to dir if it doesn't contain symlinks.
64 * @returns 1 if a path element is a symlink, 0 otherwise, -1 on syserror
66 int lchdir(const char *dir)
68 char buf[MAXPATHLEN+1];
69 char cwd[MAXPATHLEN+1];
74 dir is a canonical path (without "../" "./" "//" )
79 if (getcwd(cwd, MAXPATHLEN) == NULL)
87 * chdir request | realpath result | ret
89 * =======================================
92 * /a/b/. | /c/d/e/f | 1
94 if (getcwd(buf, MAXPATHLEN) == NULL)
99 /* relative path requested,
102 for (; cwd[i]; i++) {
103 if (buf[i] != cwd[i])
114 for (i = 0; test[i]; i++) {
115 if (test[i] != dir[i]) {