Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/3d/chdir3d.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1989-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Eduardo Krell <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
24
#include "3d.h"
25
26
int
27
chdir3d(const char* path)
28
{
29
register char* sp;
30
char buf[2 * PATH_MAX + 1];
31
32
#if FS
33
if (!fscall(NiL, MSG_stat, 0, path, &state.path.st))
34
{
35
if (state.ret)
36
return -1;
37
if (!S_ISDIR(state.path.st.st_mode))
38
{
39
errno = ENOTDIR;
40
return -1;
41
}
42
state.level = 1;
43
}
44
else
45
#else
46
initialize();
47
#endif
48
{
49
if (state.level > 0 && state.pwd && !CHDIR(state.pwd))
50
state.level = 0;
51
if (!(sp = pathreal(path, P_SAFE, NiL)))
52
return -1;
53
if (CHDIR(sp))
54
return -1;
55
}
56
if (state.pwd)
57
{
58
/*
59
* save absolute path in state.pwd
60
*/
61
62
if (*path != '/')
63
{
64
strcpy(buf, state.pwd);
65
sp = buf + state.pwdsize;
66
*sp++ = '/';
67
}
68
else
69
sp = buf;
70
strcpy(sp, path);
71
#if 0
72
state.path.level = 0;
73
#endif
74
if ((sp = pathcanon(buf, sizeof(buf), 0)) && *(sp - 1) == '.' && *(sp - 2) == '/')
75
*(sp -= 2) = 0;
76
state.pwdsize = strcopy(state.pwd, buf) - state.pwd;
77
memcpy(state.envpwd + sizeof(var_pwd) - 1, state.pwd, state.pwdsize);
78
state.level = state.path.level;
79
message((-1, "chdir: %s [%d]", state.pwd, state.level));
80
}
81
return 0;
82
}
83
84