Cross Reference: pathkey.c
xref
: /
osnet-11
/
usr
/
src
/
lib
/
libast
/
common
/
path
/
pathkey.c
Home
History
Annotate
Line#
Navigate
Download
Search
only in
./
1
N/A
/***********************************************************************
1
N/A
* *
1
N/A
* This software is part of the ast package *
1
N/A
* Copyright (c) 1985-2011 AT&T Intellectual Property *
1
N/A
* and is licensed under the *
1
N/A
* Common Public License, Version 1.0 *
1
N/A
* by AT&T Intellectual Property *
1
N/A
* *
1
N/A
* A copy of the License is available at *
1
N/A
*
http://www.opensource.org/licenses/cpl1.0.txt
*
1
N/A
* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1
N/A
* *
1
N/A
* Information and Software Systems Research *
1
N/A
* AT&T Research *
1
N/A
* Florham Park NJ *
1
N/A
* *
1
N/A
* Glenn Fowler <gsf@research.att.com> *
1
N/A
* David Korn <dgk@research.att.com> *
1
N/A
* Phong Vo <kpv@research.att.com> *
1
N/A
* *
1
N/A
***********************************************************************/
1
N/A
#
pragma
prototyped
1
N/A
/*
1
N/A
* Glenn Fowler
1
N/A
* AT&T Bell Laboratories
1
N/A
*
1
N/A
* generate 14 char lookup key for lang path in key
1
N/A
* based on 32-bit checksum on path
1
N/A
*
1
N/A
* if key==0 then space is malloc'd
1
N/A
* if attr != 0 then attribute var assignments placed here:
1
N/A
* ATTRIBUTES list of attribute names
1
N/A
*/
1
N/A
1
N/A
#
define
_AST_API_H
1
1
N/A
1
N/A
#
include
<
ast.h
>
1
N/A
#
include
<
ctype.h
>
1
N/A
#
include
<
fs3d.h
>
1
N/A
#
include
<
preroot.h
>
1
N/A
#
include
<
ls.h
>
1
N/A
1
N/A
char
*
1
N/A
pathkey
(
char
*
key
,
char
*
attr
,
const
char
*
lang
,
const
char
*
tool
,
const
char
*
path
)
1
N/A
{
1
N/A
return
pathkey_20100601
(
lang
,
tool
,
path
,
key
,
16
,
attr
,
PATH_MAX
);
1
N/A
}
1
N/A
1
N/A
#
undef
_AST_API_H
1
N/A
1
N/A
#
include
<
ast_api.h
>
1
N/A
1
N/A
char
*
1
N/A
pathkey_20100601
(
const
char
*
lang
,
const
char
*
tool
,
const
char
*
apath
,
char
*
key
,
size_t
keysize
,
char
*
attr
,
size_t
attrsize
)
1
N/A
{
1
N/A
register
char
*
path
= (
char
*)
apath
;
1
N/A
register
char
* s;
1
N/A
register
char
* k;
1
N/A
char
* t;
1
N/A
char
*
flags
;
1
N/A
char
** p;
1
N/A
int
c;
1
N/A
unsigned
long
n;
1
N/A
char
buf
[
15
];
1
N/A
char
*
usr
[
16
];
1
N/A
char
*
env
[
elementsof
(
usr
) +
3
];
1
N/A
char
*
ver
[
2
];
1
N/A
char
tmp
[
PATH_MAX
];
1
N/A
#
if
_UWIN
1
N/A
struct
stat
st
;
1
N/A
#
endif
1
N/A
1
N/A
static
char
let
[] =
"ABCDEFGHIJKLMNOP"
;
1
N/A
1
N/A
if
(!
key
)
1
N/A
key
=
buf
;
1
N/A
if
(
tool
&&
streq
(
tool
,
"mam"
))
1
N/A
{
1
N/A
for
(n = 0; *
path
;
path
++)
1
N/A
n = n *
0x63c63cd9L
+ *
path
+
0x9c39c33dL
;
1
N/A
k =
key
;
1
N/A
for
(n &=
0xffffffffL
; n; n >>=
4
)
1
N/A
*k++ =
let
[n &
0xf
];
1
N/A
*k = 0;
1
N/A
}
1
N/A
else
1
N/A
{
1
N/A
for
(c = 0; c <
elementsof
(
env
); c++)
1
N/A
env
[c] = 0;
1
N/A
n = 0;
1
N/A
1
N/A
/*
1
N/A
* trailing flags in path
1
N/A
*/
1
N/A
1
N/A
if
(
flags
=
strchr
(
path
,
' '
))
1
N/A
{
1
N/A
if
(
flags
==
path
)
1
N/A
flags
= 0;
1
N/A
else
1
N/A
{
1
N/A
strlcpy
(
tmp
,
path
,
sizeof
(
tmp
));
1
N/A
*(
flags
=
tmp
+ (
flags
-
path
)) = 0;
1
N/A
path
=
tmp
;
1
N/A
}
1
N/A
}
1
N/A
1
N/A
/*
1
N/A
* 3D
1
N/A
*/
1
N/A
1
N/A
if
(!
flags
&&
fs3d
(
FS3D_TEST
) && (c =
mount
(
path
,
tmp
,
FS3D_GET
|
FS3D_ALL
|
FS3D_SIZE
(
PATH_MAX
),
NiL
)) >
1
&& c <
PATH_MAX
)
1
N/A
path
=
tmp
;
1
N/A
1
N/A
/*
1
N/A
* preroot
1
N/A
*/
1
N/A
1
N/A
if
(
attr
)
1
N/A
attr
=
strcopy
(
attr
,
"PREROOT='"
);
1
N/A
#
if
FS_PREROOT
1
N/A
if
(k =
getenv
(
PR_BASE
))
1
N/A
{
1
N/A
if
(s =
strrchr
(k,
'/'
))
1
N/A
k = s +
1
;
1
N/A
n =
memsum
(k,
strlen
(k), n);
1
N/A
}
1
N/A
if
(
attr
&& (
getpreroot
(
attr
,
path
) ||
getpreroot
(
attr
,
NiL
)))
1
N/A
attr
+=
strlen
(
attr
);
1
N/A
#
else
1
N/A
if
((k =
getenv
(
"VIRTUAL_ROOT"
)) && *k ==
'/'
)
1
N/A
{
1
N/A
n =
memsum
(k,
strlen
(k), n);
1
N/A
if
(
attr
)
1
N/A
attr
=
strcopy
(
attr
, k);
1
N/A
}
1
N/A
#
endif
1
N/A
#
if
_UWIN
1
N/A
if
(!
stat
(
"/"
, &
st
) &&
st
.
st_ino
!=
8
*
sizeof
(
char
*) && (
st
.
st_ino
==
32
||
st
.
st_ino
==
64
))
1
N/A
{
1
N/A
k =
sizeof
(
char
*) ==
4
?
"/64"
:
"/32"
;
1
N/A
n =
memsum
(k,
strlen
(k), n);
1
N/A
if
(
attr
)
1
N/A
attr
=
strcopy
(
attr
, k);
1
N/A
}
1
N/A
#
endif
1
N/A
1
N/A
/*
1
N/A
* universe
1
N/A
*/
1
N/A
1
N/A
if
(
attr
)
1
N/A
attr
=
strcopy
(
attr
,
"' UNIVERSE='"
);
1
N/A
if
(k =
astconf
(
"UNIVERSE"
,
NiL
,
NiL
))
1
N/A
{
1
N/A
n =
memsum
(k,
strlen
(k), n);
1
N/A
if
(
attr
)
1
N/A
attr
=
strcopy
(
attr
, k);
1
N/A
}
1
N/A
1
N/A
/*
1
N/A
* environment
1
N/A
*
1
N/A
* ${PROBE_ATTRIBUTES} || ${VERSION_ENVIRONMENT} : list of alternate env vars
1
N/A
* ${VERSION_ENVIRONMENT} : list of alternate env vars
1
N/A
* ${VERSION_<lang>}
1
N/A
* ${VERSION_<base(path)>}
1
N/A
* ${<toupper(base(path))>VER}
1
N/A
* ${OBJTYPE}
1
N/A
*/
1
N/A
1
N/A
if
(
attr
)
1
N/A
*
attr
++ =
'\''
;
1
N/A
c = 0;
1
N/A
usr
[c++] =
"OBJTYPE"
;
1
N/A
if
(!(k =
getenv
(
"PROBE_ATTRIBUTES"
)))
1
N/A
k =
getenv
(
"VERSION_ENVIRONMENT"
);
1
N/A
if
(k)
1
N/A
while
(c < (
elementsof
(
usr
) -
1
))
1
N/A
{
1
N/A
while
(*k && (*k ==
':'
|| *k ==
' '
))
1
N/A
k++;
1
N/A
if
(!*k)
1
N/A
break
;
1
N/A
usr
[c++] = k;
1
N/A
while
(*k && *k !=
':'
&& *k !=
' '
)
1
N/A
k++;
1
N/A
}
1
N/A
usr
[c] = 0;
1
N/A
ver
[0] = (
char
*)
lang
;
1
N/A
ver
[
1
] = k = (s =
strrchr
(
path
,
'/'
)) ? s +
1
:
path
;
1
N/A
s =
buf
;
1
N/A
if
(
isdigit
(*k))
1
N/A
{
1
N/A
if
(*k ==
'3'
&& *(k +
1
) ==
'b'
)
1
N/A
{
1
N/A
/*
1
N/A
* cuteness never pays
1
N/A
*/
1
N/A
1
N/A
k +=
2
;
1
N/A
*s++ =
'B'
;
1
N/A
*s++ =
'B'
;
1
N/A
*s++ =
'B'
;
1
N/A
}
1
N/A
else
1
N/A
*s++ =
'U'
;
1
N/A
}
1
N/A
for
(; (c = *k) && s < &
buf
[
sizeof
(
buf
) -
1
]; k++)
1
N/A
{
1
N/A
if
(!
isalnum
(c))
1
N/A
c =
'_'
;
1
N/A
else
if
(
islower
(c))
1
N/A
c =
toupper
(c);
1
N/A
*s++ = c;
1
N/A
}
1
N/A
*s = 0;
1
N/A
for
(p =
environ
; *p; p++)
1
N/A
{
1
N/A
s =
"VERSION_"
;
1
N/A
for
(k = *p; *k && *k == *s; k++, s++);
1
N/A
if
(*k && !*s)
1
N/A
{
1
N/A
for
(c = 0; c <
elementsof
(
ver
); c++)
1
N/A
if
(!
env
[c] && (s =
ver
[c]))
1
N/A
{
1
N/A
for
(t = k; *t && *t !=
'='
&& *t++ == *s; s++);
1
N/A
if
(*t ==
'='
&& (!*s || (s -
ver
[c]) >
1
))
1
N/A
{
1
N/A
env
[c] = *p;
1
N/A
goto
found
;
1
N/A
}
1
N/A
}
1
N/A
}
1
N/A
if
(!
env
[
2
])
1
N/A
{
1
N/A
s =
buf
;
1
N/A
for
(k = *p; *k && *s++ == *k; k++);
1
N/A
if
((s -
buf
) >
2
&& k[0] ==
'V'
&& k[
1
] ==
'E'
&& k[
2
] ==
'R'
&& k[
3
] ==
'='
)
1
N/A
{
1
N/A
env
[
2
] = *p;
1
N/A
goto
found
;
1
N/A
}
1
N/A
}
1
N/A
for
(c = 0; c <
elementsof
(
usr
) && (s =
usr
[c]); c++)
1
N/A
if
(!
env
[c +
elementsof
(
env
) -
elementsof
(
usr
)])
1
N/A
{
1
N/A
for
(k = *p; *k && *k == *s; k++, s++);
1
N/A
if
(*k ==
'='
&& (!*s || *s ==
':'
|| *s ==
' '
))
1
N/A
{
1
N/A
env
[c +
elementsof
(
env
) -
elementsof
(
usr
)] = *p;
1
N/A
goto
found
;
1
N/A
}
1
N/A
}
1
N/A
found
: ;
1
N/A
}
1
N/A
for
(c = 0; c <
elementsof
(
env
); c++)
1
N/A
if
(k =
env
[c])
1
N/A
{
1
N/A
if
(
attr
)
1
N/A
{
1
N/A
*
attr
++ =
' '
;
1
N/A
while
((*
attr
++ = *k++) !=
'='
);
1
N/A
*
attr
++ =
'\''
;
1
N/A
attr
=
strcopy
(
attr
, k);
1
N/A
*
attr
++ =
'\''
;
1
N/A
}
1
N/A
else
1
N/A
while
(*k && *k++ !=
'='
);
1
N/A
n =
memsum
(k,
strlen
(k), n);
1
N/A
}
1
N/A
if
(
attr
)
1
N/A
{
1
N/A
attr
=
strcopy
(
attr
,
" ATTRIBUTES='PREROOT UNIVERSE"
);
1
N/A
for
(c = 0; c <
elementsof
(
env
); c++)
1
N/A
if
(k =
env
[c])
1
N/A
{
1
N/A
*
attr
++ =
' '
;
1
N/A
while
((*
attr
= *k++) !=
'='
)
1
N/A
attr
++;
1
N/A
}
1
N/A
*
attr
++ =
'\''
;
1
N/A
*
attr
= 0;
1
N/A
}
1
N/A
1
N/A
/*
1
N/A
* now the normal stuff
1
N/A
*/
1
N/A
1
N/A
if
(
flags
)
1
N/A
*
flags
=
' '
;
1
N/A
s =
path
+
strlen
(
path
);
1
N/A
sfsprintf
(
key
,
15
,
"%08lX"
,
memsum
(
path
, s -
path
, n));
1
N/A
k =
key
+
14
;
1
N/A
*k = 0;
1
N/A
if
(!
flags
)
1
N/A
t =
path
;
1
N/A
else
if
((t = s -
4
) <
flags
)
1
N/A
t =
flags
+
1
;
1
N/A
for
(;;)
1
N/A
{
1
N/A
if
(--s < t)
1
N/A
{
1
N/A
if
(t ==
path
)
1
N/A
break
;
1
N/A
s =
flags
-
2
;
1
N/A
t =
path
;
1
N/A
}
1
N/A
if
(*s !=
'/'
&& *s !=
' '
)
1
N/A
{
1
N/A
*--k = *s;
1
N/A
if
(k <=
key
+
8
)
1
N/A
break
;
1
N/A
}
1
N/A
}
1
N/A
while
(k >
key
+
8
)
1
N/A
*--k =
'.'
;
1
N/A
}
1
N/A
return
key
==
buf
?
strdup
(
key
) :
key
;
1
N/A
}