annotate kpathsea/progname.c @ 4031:2168f4a0e88d

[project @ 2002-08-10 04:22:52 by jwe]
author jwe
date Sat, 10 Aug 2002 04:22:52 +0000
parents 4592f72b7317
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
1 /* progname.c: the executable name we were invoked as; general initialization.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
2
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
3 Copyright (C) 1994, 96, 97 Karl Berry.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
4
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
5 This library is free software; you can redistribute it and/or
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
6 modify it under the terms of the GNU Library General Public
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
7 License as published by the Free Software Foundation; either
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
8 version 2 of the License, or (at your option) any later version.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
9
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
10 This library is distributed in the hope that it will be useful,
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
13 Library General Public License for more details.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
14
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
15 You should have received a copy of the GNU Library General Public
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
16 License along with this library; if not, write to the Free Software
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
18
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
19 #include <kpathsea/config.h>
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
20 #include <kpathsea/absolute.h>
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
21 #include <kpathsea/c-pathch.h>
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
22 #include <kpathsea/c-stat.h>
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
23 #include <kpathsea/pathsearch.h>
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
24 /* For kpse_reset_progname */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
25 #include <kpathsea/tex-file.h>
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
26
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
27 #ifdef WIN32
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
28 #include <kpathsea/c-pathmx.h>
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
29 #endif
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
30
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
31 /* NeXT does not define the standard macros, but has the equivalent.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
32 WIN32 doesn't define them either, and doesn't have them.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
33 From: Gregor Hoffleit <flight@mathi.uni-heidelberg.de>. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
34 #ifndef S_IXUSR
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
35 #ifdef WIN32
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
36 #define S_IXUSR 0
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
37 #define S_IXGRP 0
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
38 #define S_IXOTH 0
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
39 #else /* not WIN32 */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
40 #define S_IXUSR 0100
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
41 #endif /* not WIN32 */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
42 #endif /* not S_IXUSR */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
43 #ifndef S_IXGRP
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
44 #define S_IXGRP 0010
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
45 #endif
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
46 #ifndef S_IXOTH
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
47 #define S_IXOTH 0001
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
48 #endif
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
49
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
50 #ifndef HAVE_PROGRAM_INVOCATION_NAME
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
51 /* Don't redefine the variables if glibc already has. */
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
52 string program_invocation_name = NULL;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
53 string program_invocation_short_name = NULL;
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
54 #endif
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
55 /* And the variable for the program we pretend to be. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
56 string kpse_program_name = NULL;
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
57
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
58 /* Return directory for NAME. This is "." if NAME contains no directory
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
59 separators (should never happen for selfdir), else whatever precedes
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
60 the final directory separator, but with multiple separators stripped.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
61 For example, `my_dirname ("/foo//bar.baz")' returns "/foo". Always
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
62 return a new string. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
63
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
64 static string
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
65 my_dirname P1C(const_string, name)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
66 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
67 string ret;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
68 unsigned loc = strlen (name);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
69
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
70 for (loc = strlen (name); loc > 0 && !IS_DIR_SEP (name[loc-1]); loc--)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
71 ;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
72
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
73 if (loc) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
74 /* If have ///a, must return /, so don't strip off everything. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
75 unsigned limit = NAME_BEGINS_WITH_DEVICE (name) ? 3 : 1;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
76 while (loc > limit && IS_DIR_SEP (name[loc-1])
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
77 && !IS_DEVICE_SEP (name[loc-1])) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
78 loc--;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
79 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
80 ret = xmalloc (loc + 1);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
81 strncpy (ret, name, loc);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
82 ret[loc] = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
83 } else {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
84 /* No directory separators at all, so return the current directory.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
85 The way this is used in kpathsea, this should never happen. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
86 ret = xstrdup (".");
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
87 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
88
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
89 return ret;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
90 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
91
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
92 #ifndef WIN32
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
93 /* From a standalone program `ll' to expand symlinks written by Kimbo Mundy.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
94 Don't bother to compile if we don't have symlinks; thus we can assume
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
95 / as the separator. Also don't try to use basename, etc., or
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
96 handle arbitrary filename length. Mixed case function names because
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
97 that's what kimbo liked. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
98
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
99 #ifdef S_ISLNK
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
100 static int ll_verbose = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
101 static int ll_loop = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
102
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
103 #undef BSIZE
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
104 #define BSIZE 2048 /* sorry */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
105
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
106
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
107 /* Read link FN into SYM. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
108
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
109 static void
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
110 ReadSymLink (fn, sym)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
111 char *fn, *sym;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
112 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
113 register int n = readlink (fn, sym, BSIZE);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
114 if (n < 0) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
115 perror (fn);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
116 exit (1);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
117 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
118 sym[n] = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
119 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
120
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
121
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
122 /* Strip first component from S, and also return it in a static buffer. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
123
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
124 static char *
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
125 StripFirst (s)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
126 register char *s;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
127 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
128 static char buf[BSIZE];
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
129 register char *s1;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
130
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
131 /* Find the end of the first path element */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
132 for (s1 = s; *s1 && (*s1 != '/' || s1 == s); s1++)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
133 ;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
134
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
135 /* Copy it into buf and null-terminate it. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
136 strncpy (buf, s, s1 - s);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
137 buf[s1 - s] = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
138
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
139 /* Skip over the leading / (if any) */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
140 if (*s1 == '/')
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
141 ++s1;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
142
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
143 /* Squeeze out the element */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
144 while ((*s++ = *s1++) != 0)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
145 ;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
146
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
147 return buf;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
148 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
149
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
150
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
151 /* Strip last component from S, and also return it in a static buffer. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
152
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
153 static char *
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
154 StripLast (s)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
155 register char *s;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
156 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
157 static char buf[BSIZE];
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
158 register char *s1;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
159
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
160 for (s1 = s + strlen (s); s1 > s && *s1 != '/'; s1--)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
161 ;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
162 strcpy (buf, s1 + (*s1 == '/'));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
163 *s1 = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
164
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
165 return buf;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
166 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
167
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
168
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
169 /* Copy first path element from B to A, removing it from B. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
170
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
171 static void
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
172 CopyFirst (a, b)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
173 register char *a;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
174 char *b;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
175 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
176 register int length = strlen (a);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
177
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
178 if (length > 0 && a[length - 1] != '/') {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
179 a[length] = '/';
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
180 a[length + 1] = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
181 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
182 strcat (a, StripFirst (b));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
183 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
184
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
185 /* Returns NULL on error. Prints intermediate results if global
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
186 `ll_verbose' is nonzero. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
187
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
188 #define EX(s) (strlen (s) && strcmp (s, "/") ? "/" : "")
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
189 #define EXPOS EX(post)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
190 #define EXPRE EX(pre)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
191
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
192 static char *
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
193 expand_symlinks (s)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
194 char *s;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
195 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
196 static char pre[BSIZE]; /* return value */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
197 char post[BSIZE], sym[BSIZE], tmp[BSIZE], before[BSIZE];
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
198 char *cp;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
199 char a;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
200 struct stat st;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
201 int done;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
202
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
203 /* Check for symlink loops. It's difficult to check for all the
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
204 possibilities ourselves, so let the kernel do it. And make it
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
205 conditional so that people can see where the infinite loop is
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
206 being caused (see engtools#1536). */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
207 if (!ll_loop) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
208 FILE *f = fopen (s, "r");
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
209 if (!f && errno == ELOOP) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
210 /* Not worried about other errors, we'll get to them in due course. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
211 perror (s);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
212 return NULL;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
213 }
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
214 if (f) fclose (f);
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
215 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
216
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
217 strcpy (post, s);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
218 strcpy (pre, "");
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
219
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
220 while (strlen (post) != 0) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
221 CopyFirst (pre, post);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
222
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
223 if (lstat (pre, &st) != 0) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
224 fprintf (stderr, "lstat(%s) failed ...\n", pre);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
225 perror (pre);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
226 return NULL;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
227 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
228
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
229 if (S_ISLNK (st.st_mode)) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
230 ReadSymLink (pre, sym);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
231
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
232 if (!strncmp (sym, "/", 1)) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
233 if (ll_verbose)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
234 printf ("[%s]%s%s -> [%s]%s%s\n", pre, EXPOS, post, sym, EXPOS,post);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
235 strcpy (pre, "");
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
236
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
237 } else {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
238 a = pre[0]; /* handle links through the root */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
239 strcpy (tmp, StripLast (pre));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
240 if (!strlen (pre) && a == '/')
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
241 strcpy (pre, "/");
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
242
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
243 if (ll_verbose) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
244 sprintf (before, "%s%s[%s]%s%s", pre, EXPRE, tmp, EXPOS, post);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
245 printf ("%s -> %s%s[%s]%s%s\n", before, pre, EXPRE, sym, EXPOS,post);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
246 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
247
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
248 /* Strip "../" path elements from the front of sym; print
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
249 new result if there were any such elements. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
250 done = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
251 a = pre[0]; /* handle links through the root */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
252 while (!strncmp (sym, "..", 2)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
253 && (sym[2] == 0 || sym[2] == '/')
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
254 && strlen (pre) != 0
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
255 && strcmp (pre, ".")
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
256 && strcmp (pre, "..")
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
257 && (strlen (pre) < 3
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
258 || strcmp (pre + strlen (pre) - 3, "/.."))) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
259 done = 1;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
260 StripFirst (sym);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
261 StripLast (pre);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
262 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
263
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
264 if (done && ll_verbose) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
265 for (cp = before; *cp;)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
266 *cp++ = ' ';
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
267 if (strlen (sym))
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
268 printf ("%s == %s%s%s%s%s\n", before, pre, EXPRE, sym, EXPOS,post);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
269 else
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
270 printf ("%s == %s%s%s\n", before, pre, EXPOS, post);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
271 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
272 if (!strlen (pre) && a == '/')
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
273 strcpy (pre, "/");
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
274 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
275
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
276 if (strlen (post) != 0 && strlen (sym) != 0)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
277 strcat (sym, "/");
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
278
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
279 strcat (sym, post);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
280 strcpy (post, sym);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
281 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
282 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
283
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
284 return pre;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
285 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
286 #else /* not S_ISLNK */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
287 #define expand_symlinks(s) (s)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
288 #endif /* not S_ISLNK */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
289
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
290 /* Remove .'s and ..'s in DIR, to avoid problems with relative symlinks
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
291 as the program name, etc. This does not canonicalize symlinks. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
292
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
293 static string
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
294 remove_dots P1C(string, dir)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
295 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
296 #ifdef AMIGA
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
297 return dir;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
298 #else
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
299 string c;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
300 unsigned len;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
301 string ret = (string) ""; /* We always reassign. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
302
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
303 for (c = kpse_filename_component (dir); c;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
304 c = kpse_filename_component (NULL)) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
305 if (STREQ (c, ".")) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
306 /* If leading ., replace with cwd. Else ignore. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
307 if (*ret == 0) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
308 ret = xgetcwd ();
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
309 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
310
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
311 } else if (STREQ (c, "..")) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
312 /* If leading .., start with my_dirname (cwd). Else remove last
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
313 component from ret, if any. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
314 if (*ret == 0) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
315 string dot = xgetcwd ();
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
316 ret = my_dirname (dot);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
317 free (dot);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
318 } else {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
319 unsigned last;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
320 for (last = strlen (ret);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
321 last > (NAME_BEGINS_WITH_DEVICE (ret) ? 2 : 0);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
322 last--) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
323 if (IS_DIR_SEP (ret[last - 1])) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
324 /* If we have `/../', that's the same as `/'. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
325 if (last > 1) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
326 ret[last] = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
327 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
328 break;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
329 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
330 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
331 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
332
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
333 } else {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
334 /* Not . or ..; just append. Include a directory separator unless
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
335 our string already ends with one. This also changes all directory
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
336 separators into the canonical DIR_SEP_STRING. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
337 string temp;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
338 len = strlen (ret);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
339 temp = concat3 (ret, ((len > 0 && ret[len - 1] == DIR_SEP)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
340 || (NAME_BEGINS_WITH_DEVICE (c) && *ret == 0))
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
341 ? "" : DIR_SEP_STRING,
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
342 c);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
343 if (*ret)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
344 free (ret);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
345 ret = temp;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
346 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
347 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
348
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
349 /* Remove a trailing /, just in case it snuck in. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
350 len = strlen (ret);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
351 if (len > 0 && ret[len - 1] == DIR_SEP) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
352 ret[len - 1] = 0;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
353 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
354
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
355 return ret;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
356 #endif /* not AMIGA */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
357 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
358
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
359 /* Return directory ARGV0 comes from. Check PATH if ARGV0 is not
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
360 absolute. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
361
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
362 static string
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
363 selfdir P1C(const_string, argv0)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
364 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
365 string ret = NULL;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
366 string self = NULL;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
367
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
368 if (kpse_absolute_p (argv0, true)) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
369 self = xstrdup (argv0);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
370 } else {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
371 #ifdef AMIGA
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
372 #include <dos.h>
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
373 #include <proto/dos.h>
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
374 #include <proto/exec.h>
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
375 BPTR lock;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
376 struct DosLibrary *DOSBase
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
377 = (struct DosLibrary *) OpenLibrary ("dos.library", 0L);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
378 assert (DOSBase);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
379
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
380 self = xmalloc (BUFSIZ);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
381 lock = findpath (argv0);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
382 if (lock != ((BPTR) -1)) {
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
383 if (getpath (lock, self) == -1) {
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
384 *self = '\0';
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
385 } else {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
386 strcat (self,DIR_SEP_STRING);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
387 strcat (self,argv0);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
388 }
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
389 UnLock (lock);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
390 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
391 CloseLibrary((struct Library *) DOSBase);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
392 #else /* not AMIGA */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
393 string elt;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
394 struct stat s;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
395
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
396 /* Have to check PATH. But don't call kpse_path_search since we don't
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
397 want to search any ls-R's or do anything special with //'s. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
398 for (elt = kpse_path_element (getenv ("PATH")); !self && elt;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
399 elt = kpse_path_element (NULL)) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
400 string name = concat3 (elt, DIR_SEP_STRING, argv0);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
401
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
402 /* In order to do this perfectly, we'd have to check the owner bits only
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
403 if we are the file owner, and the group bits only if we belong
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
404 to the file group. That's a lot of work, though, and it's not
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
405 likely that kpathsea will ever be used with a program that's
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
406 only executable by some classes and not others. See the
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
407 `file_status' function in execute_cmd.c in bash for what's
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
408 necessary if we were to do it right. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
409 if (stat (name, &s) == 0 && s.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) {
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
410 /* Do not stop at directories. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
411 if (!S_ISDIR(s.st_mode))
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
412 self = name;
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
413 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
414 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
415 #endif /* not AMIGA */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
416 }
3026
88fa1f27ac1a [project @ 1997-06-04 17:18:50 by jwe]
jwe
parents: 2999
diff changeset
417
88fa1f27ac1a [project @ 1997-06-04 17:18:50 by jwe]
jwe
parents: 2999
diff changeset
418 /* If argv0 is somehow dir/exename, `self' will still be NULL. */
88fa1f27ac1a [project @ 1997-06-04 17:18:50 by jwe]
jwe
parents: 2999
diff changeset
419 if (!self)
88fa1f27ac1a [project @ 1997-06-04 17:18:50 by jwe]
jwe
parents: 2999
diff changeset
420 self = concat3 (".", DIR_SEP_STRING, argv0);
88fa1f27ac1a [project @ 1997-06-04 17:18:50 by jwe]
jwe
parents: 2999
diff changeset
421
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
422 ret = my_dirname (remove_dots (expand_symlinks (self)));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
423
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
424 free (self);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
425
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
426 return ret;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
427 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
428 #endif /* not WIN32 */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
429
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
430 void
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
431 kpse_set_program_name P2C(const_string, argv0, const_string, progname)
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
432 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
433 string ext, sdir, sdir_parent, sdir_grandparent;
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
434 string s = getenv ("KPATHSEA_DEBUG");
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
435 #ifdef WIN32
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
436 string debug_output = getenv("KPATHSEA_DEBUG_OUTPUT");
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
437 int err, olderr;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
438 #endif
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
439
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
440 /* Set debugging stuff first, in case we end up doing debuggable stuff
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
441 during this initialization. */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
442 if (s) {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
443 kpathsea_debug |= atoi (s);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
444 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
445
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
446 #ifndef HAVE_PROGRAM_INVOCATION_NAME
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
447 #if defined(WIN32)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
448 /* redirect stderr to debug_output. Easier to send logfiles. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
449 if (debug_output) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
450 if ((err = _open(debug_output, _O_CREAT | _O_TRUNC | _O_RDWR,
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
451 _S_IREAD | _S_IWRITE)) == -1) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
452 WARNING1("Can't open %s for stderr redirection!\n", debug_output);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
453 perror(debug_output);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
454 } else if ((olderr = _dup(fileno(stderr))) == -1) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
455 WARNING("Can't dup() stderr!\n");
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
456 close(err);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
457 } else if (_dup2(err, fileno(stderr)) == -1) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
458 WARNING1("Can't redirect stderr to %s!\n", debug_output);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
459 close(olderr);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
460 close(err);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
461 } else {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
462 close(err);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
463 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
464 }
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
465 /* Win95 always gives the short filename for argv0, not the long one.
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
466 There is only this way to catch it. It makes all the selfdir stuff
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
467 useless for win32. */
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
468 {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
469 char path[PATH_MAX], *fp;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
470 HANDLE hnd;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
471 WIN32_FIND_DATA ffd;
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
472
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
473 /* SearchPath() always gives back an absolute directory */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
474 if (SearchPath(NULL, argv0, ".exe", PATH_MAX, path, &fp) == 0)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
475 FATAL1("Can't determine where the executable %s is.\n", argv0);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
476 if ((hnd = FindFirstFile(path, &ffd)) == NULL)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
477 FATAL1("The following path points to an invalid file : %s\n", path);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
478 /* slashify the dirname */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
479 for (fp = path; fp && *fp; fp++)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
480 if (IS_DIR_SEP(*fp)) *fp = DIR_SEP;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
481 /* sdir will be the directory where the executable resides, ie: c:/TeX/bin */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
482 sdir = my_dirname(path);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
483 program_invocation_name = xstrdup(ffd.cFileName);
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
484 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
485
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
486 #elif defined(__DJGPP__)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
487
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
488 /* DJGPP programs support long filenames on Windows 95, but ARGV0 there
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
489 is always made with the short 8+3 aliases of all the pathname elements.
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
490 If long names are supported, we need to convert that to a long name.
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
491
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
492 All we really need is to call `_truename', but most of the code
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
493 below is required to deal with the special case of networked drives. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
494 if (pathconf (argv0, _PC_NAME_MAX) > 12) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
495 char long_progname[PATH_MAX];
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
496
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
497 if (_truename (argv0, long_progname)) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
498 char *fp;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
499
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
500 if (long_progname[1] != ':') {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
501 /* A complication: `_truename' returns network-specific string at
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
502 the beginning of `long_progname' when the program resides on a
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
503 networked drive, and DOS calls cannot grok such pathnames. We
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
504 need to convert the filesystem name back to a drive letter. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
505 char rootname[PATH_MAX], rootdir[4];
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
506
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
507 if (argv0[0] && argv0[1] == ':')
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
508 rootdir[0] = argv0[0]; /* explicit drive in `argv0' */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
509 else
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
510 rootdir[0] = getdisk () + 'A';
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
511 rootdir[1] = ':';
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
512 rootdir[2] = '\\';
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
513 rootdir[3] = '\0';
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
514 if (_truename (rootdir, rootname)) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
515 /* Find out where `rootname' ends in `long_progname' and replace
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
516 it with the drive letter. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
517 int root_len = strlen (rootname);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
518
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
519 if (IS_DIR_SEP (rootname[root_len - 1]))
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
520 root_len--; /* keep the trailing slash */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
521 long_progname[0] = rootdir[0];
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
522 long_progname[1] = ':';
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
523 memmove (long_progname + 2, long_progname + root_len,
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
524 strlen (long_progname + root_len) + 1);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
525 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
526 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
527
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
528 /* Convert everything to canonical form. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
529 if (long_progname[0] >= 'A' && long_progname[0] <= 'Z')
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
530 long_progname[0] += 'a' - 'A'; /* make drive lower case, for beauty */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
531 for (fp = long_progname; *fp; fp++)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
532 if (IS_DIR_SEP (*fp))
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
533 *fp = DIR_SEP;
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
534
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
535 program_invocation_name = xstrdup (long_progname);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
536 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
537 else
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
538 /* If `_truename' failed, God help them, because we won't... */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
539 program_invocation_name = xstrdup (argv0);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
540 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
541 else
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
542 program_invocation_name = xstrdup (argv0);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
543
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
544 #else /* !WIN32 && !__DJGPP__ */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
545
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
546 program_invocation_name = xstrdup (argv0);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
547
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
548 #endif
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
549 #endif /* not HAVE_PROGRAM_INVOCATION_NAME */
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
550
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
551 /* We need to find SELFAUTOLOC *before* removing the ".exe" suffix from
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
552 the program_name, otherwise the PATH search inside selfdir will fail,
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
553 since `prog' doesn't exists as a file, there's `prog.exe' instead. */
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
554 #ifndef WIN32
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
555 sdir = selfdir (program_invocation_name);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
556 #endif
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
557 /* SELFAUTODIR is actually the parent of the invocation directory,
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
558 and SELFAUTOPARENT the grandparent. This is how teTeX did it. */
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
559 xputenv ("SELFAUTOLOC", sdir);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
560 sdir_parent = my_dirname (sdir);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
561 xputenv ("SELFAUTODIR", sdir_parent);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
562 sdir_grandparent = my_dirname (sdir_parent);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
563 xputenv ("SELFAUTOPARENT", sdir_grandparent);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
564
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
565 free (sdir);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
566 free (sdir_parent);
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
567 free (sdir_grandparent);
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
568
3865
4592f72b7317 [project @ 2001-11-28 02:17:57 by jwe]
jwe
parents: 3172
diff changeset
569 #ifndef HAVE_PROGRAM_INVOCATION_NAME
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
570 program_invocation_short_name = (string)basename (program_invocation_name);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
571 #endif
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
572
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
573 if (progname) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
574 kpse_program_name = xstrdup (progname);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
575 } else {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
576 /* If configured --enable-shared and running from the build directory
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
577 with the wrapper scripts (e.g., for make check), the binaries will
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
578 be named foo.exe instead of foo. Or possibly if we're running on a
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
579 DOSISH system. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
580 ext = find_suffix (program_invocation_short_name);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
581 if (ext && FILESTRCASEEQ (ext, "exe")) {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
582 kpse_program_name = remove_suffix (program_invocation_short_name);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
583 } else {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
584 kpse_program_name = xstrdup (program_invocation_short_name);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
585 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
586 }
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
587 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
588
3172
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
589 /* This function is deprecated, because when we pretend to have a different
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
590 name it will look for _that_ name in the PATH if program_invocation_name
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
591 is not defined. */
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
592 void
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
593 kpse_set_progname P1C(const_string, argv0)
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
594 {
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
595 kpse_set_program_name (argv0, NULL);
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
596 }
1f0b06020e36 [project @ 1998-04-24 04:24:34 by jwe]
jwe
parents: 3026
diff changeset
597
2999
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
598 #ifdef TEST
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
599 void
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
600 main (int argc, char **argv)
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
601 {
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
602 puts (remove_dots ("/w/kpathsea"));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
603 puts (remove_dots ("/w//kpathsea"));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
604 puts (remove_dots ("/w/./kpathsea"));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
605 puts (remove_dots ("."));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
606 puts (remove_dots ("./"));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
607 puts (remove_dots ("./."));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
608 puts (remove_dots ("../kpathsea"));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
609 puts (remove_dots ("/../w/kpathsea"));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
610 puts (remove_dots ("/../w/kpathsea/."));
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
611 }
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
612 /*
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
613 Local variables:
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
614 standalone-compile-command: "gcc -g -I. -I.. -DTEST progname.c STATIC/libkpathsea.a"
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
615 End:
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
616 */
faa5d0421460 [project @ 1997-05-23 03:02:09 by jwe]
jwe
parents:
diff changeset
617 #endif /* TEST */