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