1*c42dbd0eSchristos /* Copyright (C) 2021 Free Software Foundation, Inc.
2*c42dbd0eSchristos Contributed by Oracle.
3*c42dbd0eSchristos
4*c42dbd0eSchristos This file is part of GNU Binutils.
5*c42dbd0eSchristos
6*c42dbd0eSchristos This program is free software; you can redistribute it and/or modify
7*c42dbd0eSchristos it under the terms of the GNU General Public License as published by
8*c42dbd0eSchristos the Free Software Foundation; either version 3, or (at your option)
9*c42dbd0eSchristos any later version.
10*c42dbd0eSchristos
11*c42dbd0eSchristos This program is distributed in the hope that it will be useful,
12*c42dbd0eSchristos but WITHOUT ANY WARRANTY; without even the implied warranty of
13*c42dbd0eSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*c42dbd0eSchristos GNU General Public License for more details.
15*c42dbd0eSchristos
16*c42dbd0eSchristos You should have received a copy of the GNU General Public License
17*c42dbd0eSchristos along with this program; if not, write to the Free Software
18*c42dbd0eSchristos Foundation, 51 Franklin Street - Fifth Floor, Boston,
19*c42dbd0eSchristos MA 02110-1301, USA. */
20*c42dbd0eSchristos
21*c42dbd0eSchristos #include "config.h"
22*c42dbd0eSchristos #include "util.h"
23*c42dbd0eSchristos #include "DbeSession.h"
24*c42dbd0eSchristos #include "Experiment.h"
25*c42dbd0eSchristos #include "DbeFile.h"
26*c42dbd0eSchristos #include "ExpGroup.h"
27*c42dbd0eSchristos #include "DbeJarFile.h"
28*c42dbd0eSchristos
DbeFile(const char * filename)29*c42dbd0eSchristos DbeFile::DbeFile (const char *filename)
30*c42dbd0eSchristos {
31*c42dbd0eSchristos filetype = 0;
32*c42dbd0eSchristos name = dbe_strdup (filename);
33*c42dbd0eSchristos name = canonical_path (name);
34*c42dbd0eSchristos orig_location = NULL;
35*c42dbd0eSchristos location = NULL;
36*c42dbd0eSchristos location_info = NULL;
37*c42dbd0eSchristos jarFile = NULL;
38*c42dbd0eSchristos container = NULL;
39*c42dbd0eSchristos need_refind = true;
40*c42dbd0eSchristos inArchive = false;
41*c42dbd0eSchristos sbuf.st_atim.tv_sec = 0;
42*c42dbd0eSchristos experiment = NULL;
43*c42dbd0eSchristos }
44*c42dbd0eSchristos
~DbeFile()45*c42dbd0eSchristos DbeFile::~DbeFile ()
46*c42dbd0eSchristos {
47*c42dbd0eSchristos free (name);
48*c42dbd0eSchristos free (location);
49*c42dbd0eSchristos free (orig_location);
50*c42dbd0eSchristos free (location_info);
51*c42dbd0eSchristos }
52*c42dbd0eSchristos
53*c42dbd0eSchristos void
set_need_refind(bool val)54*c42dbd0eSchristos DbeFile::set_need_refind (bool val)
55*c42dbd0eSchristos {
56*c42dbd0eSchristos if (val != need_refind)
57*c42dbd0eSchristos {
58*c42dbd0eSchristos free (location_info);
59*c42dbd0eSchristos location_info = NULL;
60*c42dbd0eSchristos need_refind = val;
61*c42dbd0eSchristos }
62*c42dbd0eSchristos }
63*c42dbd0eSchristos
64*c42dbd0eSchristos void
set_location(const char * filename)65*c42dbd0eSchristos DbeFile::set_location (const char *filename)
66*c42dbd0eSchristos {
67*c42dbd0eSchristos free (location);
68*c42dbd0eSchristos location = NULL;
69*c42dbd0eSchristos if (filename)
70*c42dbd0eSchristos {
71*c42dbd0eSchristos if (strncmp (filename, NTXT ("./"), 2) == 0)
72*c42dbd0eSchristos filename += 2;
73*c42dbd0eSchristos location = canonical_path (dbe_strdup (filename));
74*c42dbd0eSchristos }
75*c42dbd0eSchristos free (location_info);
76*c42dbd0eSchristos location_info = NULL;
77*c42dbd0eSchristos set_need_refind (false);
78*c42dbd0eSchristos }
79*c42dbd0eSchristos
80*c42dbd0eSchristos char *
get_location_info()81*c42dbd0eSchristos DbeFile::get_location_info ()
82*c42dbd0eSchristos {
83*c42dbd0eSchristos if (location_info == NULL)
84*c42dbd0eSchristos {
85*c42dbd0eSchristos char *fnm = get_name ();
86*c42dbd0eSchristos char *loc = get_location ();
87*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE, NTXT ("DbeFile::get_location_info: %s %s\n"),
88*c42dbd0eSchristos STR (fnm), STR (loc));
89*c42dbd0eSchristos if (loc == NULL)
90*c42dbd0eSchristos {
91*c42dbd0eSchristos if (filetype & F_FICTION)
92*c42dbd0eSchristos location_info = dbe_strdup (fnm);
93*c42dbd0eSchristos else
94*c42dbd0eSchristos location_info = dbe_sprintf (GTXT ("%s (not found)"),
95*c42dbd0eSchristos get_relative_path (fnm));
96*c42dbd0eSchristos }
97*c42dbd0eSchristos else
98*c42dbd0eSchristos {
99*c42dbd0eSchristos char *r_fnm = get_relative_path (fnm);
100*c42dbd0eSchristos char *r_loc = get_relative_path (loc);
101*c42dbd0eSchristos if (strcmp (r_fnm, r_loc) == 0)
102*c42dbd0eSchristos location_info = dbe_strdup (r_fnm);
103*c42dbd0eSchristos else
104*c42dbd0eSchristos {
105*c42dbd0eSchristos char *bname = get_basename (r_fnm);
106*c42dbd0eSchristos if (strcmp (bname, r_loc) == 0) // found in current directory
107*c42dbd0eSchristos location_info = dbe_strdup (bname);
108*c42dbd0eSchristos else
109*c42dbd0eSchristos location_info = dbe_sprintf (GTXT ("%s (found as %s)"), bname, r_loc);
110*c42dbd0eSchristos }
111*c42dbd0eSchristos }
112*c42dbd0eSchristos }
113*c42dbd0eSchristos return location_info;
114*c42dbd0eSchristos }
115*c42dbd0eSchristos
116*c42dbd0eSchristos char *
getResolvedPath()117*c42dbd0eSchristos DbeFile::getResolvedPath ()
118*c42dbd0eSchristos {
119*c42dbd0eSchristos if (get_location ())
120*c42dbd0eSchristos return location;
121*c42dbd0eSchristos return name;
122*c42dbd0eSchristos }
123*c42dbd0eSchristos
124*c42dbd0eSchristos DbeFile *
getJarDbeFile(char * fnm,int sym)125*c42dbd0eSchristos DbeFile::getJarDbeFile (char *fnm, int sym)
126*c42dbd0eSchristos {
127*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE, NTXT ("DbeFile::getJarDbeFile: %s fnm='%s' sym=%d\n"),
128*c42dbd0eSchristos STR (name), STR (fnm), sym);
129*c42dbd0eSchristos DbeFile *df = NULL;
130*c42dbd0eSchristos if (sym)
131*c42dbd0eSchristos {
132*c42dbd0eSchristos char *s = strchr (fnm, sym);
133*c42dbd0eSchristos if (s)
134*c42dbd0eSchristos {
135*c42dbd0eSchristos s = dbe_strndup (fnm, s - fnm);
136*c42dbd0eSchristos df = dbeSession->getDbeFile (s, F_JAR_FILE | F_FILE);
137*c42dbd0eSchristos free (s);
138*c42dbd0eSchristos }
139*c42dbd0eSchristos }
140*c42dbd0eSchristos if (df == NULL)
141*c42dbd0eSchristos df = dbeSession->getDbeFile (fnm, F_JAR_FILE | F_FILE);
142*c42dbd0eSchristos if (df && (df->experiment == NULL))
143*c42dbd0eSchristos df->experiment = experiment;
144*c42dbd0eSchristos return df;
145*c42dbd0eSchristos }
146*c42dbd0eSchristos
147*c42dbd0eSchristos char *
get_location(bool find_needed)148*c42dbd0eSchristos DbeFile::get_location (bool find_needed)
149*c42dbd0eSchristos {
150*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE, NTXT ("get_location 0x%x %s\n"), filetype, STR (name));
151*c42dbd0eSchristos if (!find_needed)
152*c42dbd0eSchristos return need_refind ? NULL : location;
153*c42dbd0eSchristos if (location || !need_refind)
154*c42dbd0eSchristos return location;
155*c42dbd0eSchristos set_need_refind (false);
156*c42dbd0eSchristos if ((filetype & F_FICTION) != 0)
157*c42dbd0eSchristos return NULL;
158*c42dbd0eSchristos if (filetype == F_DIR_OR_JAR)
159*c42dbd0eSchristos {
160*c42dbd0eSchristos find_in_archives (name);
161*c42dbd0eSchristos if (location)
162*c42dbd0eSchristos {
163*c42dbd0eSchristos filetype |= F_JAR_FILE | F_FILE;
164*c42dbd0eSchristos return location;
165*c42dbd0eSchristos }
166*c42dbd0eSchristos find_in_pathmap (name);
167*c42dbd0eSchristos if (location)
168*c42dbd0eSchristos return location;
169*c42dbd0eSchristos if (check_access (name) == F_DIRECTORY)
170*c42dbd0eSchristos {
171*c42dbd0eSchristos filetype |= F_DIRECTORY;
172*c42dbd0eSchristos set_location (name);
173*c42dbd0eSchristos return location;
174*c42dbd0eSchristos }
175*c42dbd0eSchristos }
176*c42dbd0eSchristos
177*c42dbd0eSchristos if ((filetype & F_FILE) != 0)
178*c42dbd0eSchristos {
179*c42dbd0eSchristos if (experiment)
180*c42dbd0eSchristos {
181*c42dbd0eSchristos char *fnm = experiment->checkFileInArchive (name, false);
182*c42dbd0eSchristos if (fnm)
183*c42dbd0eSchristos {
184*c42dbd0eSchristos set_location (fnm);
185*c42dbd0eSchristos inArchive = true;
186*c42dbd0eSchristos sbuf.st_mtime = 0; // Don't check timestamps
187*c42dbd0eSchristos free (fnm);
188*c42dbd0eSchristos return location;
189*c42dbd0eSchristos }
190*c42dbd0eSchristos if ((filetype & F_JAVACLASS) != 0)
191*c42dbd0eSchristos {
192*c42dbd0eSchristos if (orig_location)
193*c42dbd0eSchristos {
194*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE, NTXT ("DbeFile::get_location:%d name='%s' orig_location='%s'\n"),
195*c42dbd0eSchristos (int) __LINE__, name, orig_location);
196*c42dbd0eSchristos // Parse a fileName attribute. There are 4 possibilities:
197*c42dbd0eSchristos // file:<Class_Name>
198*c42dbd0eSchristos // file:<name_of_jar_or_zip_file>
199*c42dbd0eSchristos // jar:file:<name_of_jar_or_zip_file>!<Class_Name>
200*c42dbd0eSchristos // zip:<name_of_jar_or_zip_file>!<Class_Name>
201*c42dbd0eSchristos DbeFile *jar_df = NULL;
202*c42dbd0eSchristos if (strncmp (orig_location, NTXT ("zip:"), 4) == 0)
203*c42dbd0eSchristos jar_df = getJarDbeFile (orig_location + 4, '!');
204*c42dbd0eSchristos else if (strncmp (orig_location, NTXT ("jar:file:"), 9) == 0)
205*c42dbd0eSchristos jar_df = getJarDbeFile (orig_location + 9, '!');
206*c42dbd0eSchristos else if (strncmp (orig_location, NTXT ("file:"), 5) == 0
207*c42dbd0eSchristos && isJarOrZip (orig_location + 5))
208*c42dbd0eSchristos jar_df = getJarDbeFile (orig_location + 5, 0);
209*c42dbd0eSchristos if (jar_df)
210*c42dbd0eSchristos {
211*c42dbd0eSchristos if (find_in_jar_file (name, jar_df->get_jar_file ()))
212*c42dbd0eSchristos {
213*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE, NTXT ("DbeFile::get_location:%d FOUND name='%s' location='%s' jar='%s'\n"),
214*c42dbd0eSchristos (int) __LINE__, name, STR (location), STR (jar_df->get_location ()));
215*c42dbd0eSchristos inArchive = jar_df->inArchive;
216*c42dbd0eSchristos container = jar_df;
217*c42dbd0eSchristos return location;
218*c42dbd0eSchristos }
219*c42dbd0eSchristos }
220*c42dbd0eSchristos if (strncmp (orig_location, NTXT ("file:"), 5) == 0
221*c42dbd0eSchristos && !isJarOrZip (orig_location + 5))
222*c42dbd0eSchristos {
223*c42dbd0eSchristos DbeFile *df = new DbeFile (orig_location + 5);
224*c42dbd0eSchristos df->filetype = DbeFile::F_FILE;
225*c42dbd0eSchristos df->experiment = experiment;
226*c42dbd0eSchristos fnm = df->get_location ();
227*c42dbd0eSchristos if (fnm)
228*c42dbd0eSchristos {
229*c42dbd0eSchristos set_location (fnm);
230*c42dbd0eSchristos inArchive = df->inArchive;
231*c42dbd0eSchristos sbuf.st_mtime = df->sbuf.st_mtime;
232*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE, NTXT ("DbeFile::get_location:%d FOUND name='%s' orig_location='%s' location='%s'\n"),
233*c42dbd0eSchristos (int) __LINE__, name, orig_location, fnm);
234*c42dbd0eSchristos delete df;
235*c42dbd0eSchristos return location;
236*c42dbd0eSchristos }
237*c42dbd0eSchristos delete df;
238*c42dbd0eSchristos }
239*c42dbd0eSchristos }
240*c42dbd0eSchristos fnm = dbe_sprintf (NTXT ("%s/%s/%s"), experiment->get_expt_name (), SP_DYNAMIC_CLASSES, name);
241*c42dbd0eSchristos if (find_file (fnm))
242*c42dbd0eSchristos {
243*c42dbd0eSchristos inArchive = true;
244*c42dbd0eSchristos sbuf.st_mtime = 0; // Don't check timestamps
245*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE, NTXT ("DbeFile::get_location:%d FOUND name='%s' location='%s'\n"),
246*c42dbd0eSchristos (int) __LINE__, name, fnm);
247*c42dbd0eSchristos free (fnm);
248*c42dbd0eSchristos return location;
249*c42dbd0eSchristos }
250*c42dbd0eSchristos free (fnm);
251*c42dbd0eSchristos }
252*c42dbd0eSchristos }
253*c42dbd0eSchristos }
254*c42dbd0eSchristos
255*c42dbd0eSchristos if (dbeSession->archive_mode)
256*c42dbd0eSchristos {
257*c42dbd0eSchristos find_file (name);
258*c42dbd0eSchristos if (location)
259*c42dbd0eSchristos return location;
260*c42dbd0eSchristos }
261*c42dbd0eSchristos
262*c42dbd0eSchristos bool inPathMap = find_in_pathmap (name);
263*c42dbd0eSchristos if (location)
264*c42dbd0eSchristos return location;
265*c42dbd0eSchristos find_in_setpath (name, dbeSession->get_search_path ());
266*c42dbd0eSchristos if (location)
267*c42dbd0eSchristos return location;
268*c42dbd0eSchristos if ((filetype & (F_JAVACLASS | F_JAVA_SOURCE)) != 0)
269*c42dbd0eSchristos {
270*c42dbd0eSchristos find_in_classpath (name, dbeSession->get_classpath ());
271*c42dbd0eSchristos if (location)
272*c42dbd0eSchristos return location;
273*c42dbd0eSchristos }
274*c42dbd0eSchristos if (!inPathMap)
275*c42dbd0eSchristos find_file (name);
276*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE && (location == NULL),
277*c42dbd0eSchristos "DbeFile::get_location:%d NOT FOUND name='%s'\n", __LINE__, name);
278*c42dbd0eSchristos return location;
279*c42dbd0eSchristos }
280*c42dbd0eSchristos
281*c42dbd0eSchristos int
check_access(const char * filename)282*c42dbd0eSchristos DbeFile::check_access (const char *filename)
283*c42dbd0eSchristos {
284*c42dbd0eSchristos if (filename == NULL)
285*c42dbd0eSchristos return F_NOT_FOUND;
286*c42dbd0eSchristos int st = dbe_stat (filename, &sbuf);
287*c42dbd0eSchristos Dprintf (DEBUG_DBE_FILE, NTXT ("check_access: %d 0x%x %s\n"), st, filetype, filename);
288*c42dbd0eSchristos if (st == 0)
289*c42dbd0eSchristos {
290*c42dbd0eSchristos if (S_ISDIR (sbuf.st_mode))
291*c42dbd0eSchristos return F_DIRECTORY;
292*c42dbd0eSchristos else if (S_ISREG (sbuf.st_mode))
293*c42dbd0eSchristos return F_FILE;
294*c42dbd0eSchristos return F_UNKNOWN; // Symbolic link or unknown type of file
295*c42dbd0eSchristos }
296*c42dbd0eSchristos sbuf.st_atim.tv_sec = 0;
297*c42dbd0eSchristos sbuf.st_mtime = 0; // Don't check timestamps
298*c42dbd0eSchristos return F_NOT_FOUND; // File not found
299*c42dbd0eSchristos }
300*c42dbd0eSchristos
301*c42dbd0eSchristos bool
isJarOrZip(const char * fnm)302*c42dbd0eSchristos DbeFile::isJarOrZip (const char *fnm)
303*c42dbd0eSchristos {
304*c42dbd0eSchristos size_t len = strlen (fnm) - 4;
305*c42dbd0eSchristos return len > 0 && (strcmp (fnm + len, NTXT (".jar")) == 0
306*c42dbd0eSchristos || strcmp (fnm + len, NTXT (".zip")) == 0);
307*c42dbd0eSchristos }
308*c42dbd0eSchristos
309*c42dbd0eSchristos char *
find_file(const char * filename)310*c42dbd0eSchristos DbeFile::find_file (const char *filename)
311*c42dbd0eSchristos {
312*c42dbd0eSchristos switch (check_access (filename))
313*c42dbd0eSchristos {
314*c42dbd0eSchristos case F_DIRECTORY:
315*c42dbd0eSchristos if (filetype == F_DIR_OR_JAR)
316*c42dbd0eSchristos filetype |= F_DIRECTORY;
317*c42dbd0eSchristos if ((filetype & F_DIRECTORY) != 0)
318*c42dbd0eSchristos set_location (filename);
319*c42dbd0eSchristos break;
320*c42dbd0eSchristos case F_FILE:
321*c42dbd0eSchristos if (filetype == F_DIR_OR_JAR)
322*c42dbd0eSchristos {
323*c42dbd0eSchristos filetype |= F_FILE;
324*c42dbd0eSchristos if (isJarOrZip (filename))
325*c42dbd0eSchristos filetype |= F_JAR_FILE;
326*c42dbd0eSchristos }
327*c42dbd0eSchristos if ((filetype & F_DIRECTORY) == 0)
328*c42dbd0eSchristos set_location (filename);
329*c42dbd0eSchristos break;
330*c42dbd0eSchristos }
331*c42dbd0eSchristos return location;
332*c42dbd0eSchristos }
333*c42dbd0eSchristos
334*c42dbd0eSchristos DbeJarFile *
get_jar_file()335*c42dbd0eSchristos DbeFile::get_jar_file ()
336*c42dbd0eSchristos {
337*c42dbd0eSchristos if (jarFile == NULL)
338*c42dbd0eSchristos {
339*c42dbd0eSchristos char *fnm = get_location ();
340*c42dbd0eSchristos if (fnm)
341*c42dbd0eSchristos jarFile = dbeSession->get_JarFile (fnm);
342*c42dbd0eSchristos }
343*c42dbd0eSchristos return jarFile;
344*c42dbd0eSchristos }
345*c42dbd0eSchristos
346*c42dbd0eSchristos char *
find_package_name(const char * filename,const char * dirname)347*c42dbd0eSchristos DbeFile::find_package_name (const char *filename, const char *dirname)
348*c42dbd0eSchristos {
349*c42dbd0eSchristos char *nm = dbe_sprintf (NTXT ("%s/%s"), dirname, filename);
350*c42dbd0eSchristos if (!find_in_pathmap (nm))
351*c42dbd0eSchristos find_file (nm);
352*c42dbd0eSchristos free (nm);
353*c42dbd0eSchristos return location;
354*c42dbd0eSchristos }
355*c42dbd0eSchristos
356*c42dbd0eSchristos char *
find_in_directory(const char * filename,const char * dirname)357*c42dbd0eSchristos DbeFile::find_in_directory (const char *filename, const char *dirname)
358*c42dbd0eSchristos {
359*c42dbd0eSchristos if (filename && dirname)
360*c42dbd0eSchristos {
361*c42dbd0eSchristos char *nm = dbe_sprintf (NTXT ("%s/%s"), dirname, filename);
362*c42dbd0eSchristos find_file (nm);
363*c42dbd0eSchristos free (nm);
364*c42dbd0eSchristos }
365*c42dbd0eSchristos return location;
366*c42dbd0eSchristos }
367*c42dbd0eSchristos
368*c42dbd0eSchristos char *
find_in_jar_file(const char * filename,DbeJarFile * jfile)369*c42dbd0eSchristos DbeFile::find_in_jar_file (const char *filename, DbeJarFile *jfile)
370*c42dbd0eSchristos {
371*c42dbd0eSchristos // Read .jar or .zip
372*c42dbd0eSchristos if (jfile == NULL)
373*c42dbd0eSchristos return NULL;
374*c42dbd0eSchristos int entry = jfile->get_entry (filename);
375*c42dbd0eSchristos if (entry >= 0)
376*c42dbd0eSchristos {
377*c42dbd0eSchristos char *fnm = dbeSession->get_tmp_file_name (filename, true);
378*c42dbd0eSchristos long long fsize = jfile->copy (fnm, entry);
379*c42dbd0eSchristos if (fsize >= 0)
380*c42dbd0eSchristos {
381*c42dbd0eSchristos dbeSession->tmp_files->append (fnm);
382*c42dbd0eSchristos set_location (fnm);
383*c42dbd0eSchristos sbuf.st_size = fsize;
384*c42dbd0eSchristos sbuf.st_mtime = 0; // Don't check timestamps
385*c42dbd0eSchristos fnm = NULL;
386*c42dbd0eSchristos }
387*c42dbd0eSchristos free (fnm);
388*c42dbd0eSchristos }
389*c42dbd0eSchristos return location;
390*c42dbd0eSchristos }
391*c42dbd0eSchristos
392*c42dbd0eSchristos bool
find_in_pathmap(char * filename)393*c42dbd0eSchristos DbeFile::find_in_pathmap (char *filename)
394*c42dbd0eSchristos {
395*c42dbd0eSchristos Vector<pathmap_t*> *pathmaps = dbeSession->get_pathmaps ();
396*c42dbd0eSchristos bool inPathMap = false;
397*c42dbd0eSchristos if (strncmp (filename, NTXT ("./"), 2) == 0)
398*c42dbd0eSchristos filename += 2;
399*c42dbd0eSchristos for (int i = 0, sz = pathmaps ? pathmaps->size () : 0; i < sz; i++)
400*c42dbd0eSchristos {
401*c42dbd0eSchristos pathmap_t *pmp = pathmaps->fetch (i);
402*c42dbd0eSchristos size_t len = strlen (pmp->old_prefix);
403*c42dbd0eSchristos if (strncmp (pmp->old_prefix, filename, len) == 0
404*c42dbd0eSchristos && (filename[len] == '/' || filename[len] == '\0'))
405*c42dbd0eSchristos {
406*c42dbd0eSchristos inPathMap = true;
407*c42dbd0eSchristos if (find_in_directory (filename + len, pmp->new_prefix))
408*c42dbd0eSchristos {
409*c42dbd0eSchristos return inPathMap;
410*c42dbd0eSchristos }
411*c42dbd0eSchristos }
412*c42dbd0eSchristos }
413*c42dbd0eSchristos return inPathMap;
414*c42dbd0eSchristos }
415*c42dbd0eSchristos
416*c42dbd0eSchristos void
find_in_archives(char * filename)417*c42dbd0eSchristos DbeFile::find_in_archives (char *filename)
418*c42dbd0eSchristos {
419*c42dbd0eSchristos for (int i1 = 0, sz1 = dbeSession->expGroups->size (); i1 < sz1; i1++)
420*c42dbd0eSchristos {
421*c42dbd0eSchristos ExpGroup *gr = dbeSession->expGroups->fetch (i1);
422*c42dbd0eSchristos if (gr->founder)
423*c42dbd0eSchristos {
424*c42dbd0eSchristos char *nm = gr->founder->checkFileInArchive (filename, false);
425*c42dbd0eSchristos if (nm)
426*c42dbd0eSchristos {
427*c42dbd0eSchristos find_file (nm);
428*c42dbd0eSchristos if (location)
429*c42dbd0eSchristos {
430*c42dbd0eSchristos sbuf.st_mtime = 0; // Don't check timestamps
431*c42dbd0eSchristos return;
432*c42dbd0eSchristos }
433*c42dbd0eSchristos }
434*c42dbd0eSchristos }
435*c42dbd0eSchristos }
436*c42dbd0eSchristos }
437*c42dbd0eSchristos
438*c42dbd0eSchristos void
find_in_setpath(char * filename,Vector<char * > * searchPath)439*c42dbd0eSchristos DbeFile::find_in_setpath (char *filename, Vector<char*> *searchPath)
440*c42dbd0eSchristos {
441*c42dbd0eSchristos char *base = get_basename (filename);
442*c42dbd0eSchristos for (int i = 0, sz = searchPath ? searchPath->size () : 0; i < sz; i++)
443*c42dbd0eSchristos {
444*c42dbd0eSchristos char *spath = searchPath->fetch (i);
445*c42dbd0eSchristos // Check file in each experiment directory
446*c42dbd0eSchristos if (streq (spath, "$") || streq (spath, NTXT ("$expts")))
447*c42dbd0eSchristos {
448*c42dbd0eSchristos // find only in founders and only LoadObj.
449*c42dbd0eSchristos for (int i1 = 0, sz1 = dbeSession->expGroups->size (); i1 < sz1; i1++)
450*c42dbd0eSchristos {
451*c42dbd0eSchristos ExpGroup *gr = dbeSession->expGroups->fetch (i1);
452*c42dbd0eSchristos char *exp_name = gr->founder->get_expt_name ();
453*c42dbd0eSchristos if (gr->founder)
454*c42dbd0eSchristos {
455*c42dbd0eSchristos if ((filetype & (F_JAVACLASS | F_JAVA_SOURCE)) != 0)
456*c42dbd0eSchristos {
457*c42dbd0eSchristos // Find with the package name
458*c42dbd0eSchristos if (find_in_directory (filename, exp_name))
459*c42dbd0eSchristos return;
460*c42dbd0eSchristos }
461*c42dbd0eSchristos if (find_in_directory (base, exp_name))
462*c42dbd0eSchristos return;
463*c42dbd0eSchristos }
464*c42dbd0eSchristos }
465*c42dbd0eSchristos continue;
466*c42dbd0eSchristos }
467*c42dbd0eSchristos DbeFile *df = dbeSession->getDbeFile (spath, DbeFile::F_DIR_OR_JAR);
468*c42dbd0eSchristos if (df->get_location () == NULL)
469*c42dbd0eSchristos continue;
470*c42dbd0eSchristos if ((filetype & (F_JAVACLASS | F_JAVA_SOURCE)) != 0)
471*c42dbd0eSchristos {
472*c42dbd0eSchristos if ((df->filetype & F_JAR_FILE) != 0)
473*c42dbd0eSchristos {
474*c42dbd0eSchristos if (find_in_jar_file (filename, df->get_jar_file ()))
475*c42dbd0eSchristos {
476*c42dbd0eSchristos container = df;
477*c42dbd0eSchristos return;
478*c42dbd0eSchristos }
479*c42dbd0eSchristos continue;
480*c42dbd0eSchristos }
481*c42dbd0eSchristos else if ((df->filetype & F_DIRECTORY) != 0)
482*c42dbd0eSchristos // Find with the package name
483*c42dbd0eSchristos if (find_package_name (filename, spath))
484*c42dbd0eSchristos return;
485*c42dbd0eSchristos }
486*c42dbd0eSchristos if ((df->filetype & F_DIRECTORY) != 0)
487*c42dbd0eSchristos if (find_in_directory (base, df->get_location ()))
488*c42dbd0eSchristos return;
489*c42dbd0eSchristos }
490*c42dbd0eSchristos }
491*c42dbd0eSchristos
492*c42dbd0eSchristos void
find_in_classpath(char * filename,Vector<DbeFile * > * classPath)493*c42dbd0eSchristos DbeFile::find_in_classpath (char *filename, Vector<DbeFile*> *classPath)
494*c42dbd0eSchristos {
495*c42dbd0eSchristos for (int i = 0, sz = classPath ? classPath->size () : 0; i < sz; i++)
496*c42dbd0eSchristos {
497*c42dbd0eSchristos DbeFile *df = classPath->fetch (i);
498*c42dbd0eSchristos if (df->get_location () == NULL)
499*c42dbd0eSchristos continue;
500*c42dbd0eSchristos if ((df->filetype & F_JAR_FILE) != 0)
501*c42dbd0eSchristos {
502*c42dbd0eSchristos if (find_in_jar_file (filename, df->get_jar_file ()))
503*c42dbd0eSchristos {
504*c42dbd0eSchristos container = df;
505*c42dbd0eSchristos return;
506*c42dbd0eSchristos }
507*c42dbd0eSchristos }
508*c42dbd0eSchristos else if ((df->filetype & F_DIRECTORY) != 0)
509*c42dbd0eSchristos // Find with the package name
510*c42dbd0eSchristos if (find_package_name (filename, df->get_name ()))
511*c42dbd0eSchristos return;
512*c42dbd0eSchristos }
513*c42dbd0eSchristos }
514*c42dbd0eSchristos
515*c42dbd0eSchristos struct stat64 *
get_stat()516*c42dbd0eSchristos DbeFile::get_stat ()
517*c42dbd0eSchristos {
518*c42dbd0eSchristos if (sbuf.st_atim.tv_sec == 0)
519*c42dbd0eSchristos {
520*c42dbd0eSchristos int st = check_access (get_location (false));
521*c42dbd0eSchristos if (st == F_NOT_FOUND)
522*c42dbd0eSchristos return NULL;
523*c42dbd0eSchristos }
524*c42dbd0eSchristos return &sbuf;
525*c42dbd0eSchristos }
526*c42dbd0eSchristos
527*c42dbd0eSchristos bool
compare(DbeFile * df)528*c42dbd0eSchristos DbeFile::compare (DbeFile *df)
529*c42dbd0eSchristos {
530*c42dbd0eSchristos if (df == NULL)
531*c42dbd0eSchristos return false;
532*c42dbd0eSchristos struct stat64 *st1 = get_stat ();
533*c42dbd0eSchristos struct stat64 *st2 = df->get_stat ();
534*c42dbd0eSchristos if (st1 == NULL || st2 == NULL)
535*c42dbd0eSchristos return false;
536*c42dbd0eSchristos if (st1->st_size != st2->st_size)
537*c42dbd0eSchristos return false;
538*c42dbd0eSchristos if (st1->st_mtim.tv_sec != st2->st_mtim.tv_sec)
539*c42dbd0eSchristos return false;
540*c42dbd0eSchristos return true;
541*c42dbd0eSchristos }
542