xref: /netbsd-src/external/gpl3/binutils.old/dist/gprofng/src/DbeFile.cc (revision c42dbd0ed2e61fe6eda8590caa852ccf34719964)
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