Setup 2.218.2.8 [Was: Re: Setup 2.218.2.6...]

Charles Wilson cwilson@ece.gatech.edu
Tue May 14 19:38:00 GMT 2002


This one works for me.  W2K, "install from local dir", local dir == 
remote SMB share.  Cool beans!

--Chuck

Christopher Faylor wrote:

> On Tue, May 14, 2002 at 01:27:46PM -0400, Christopher Faylor wrote:
> 
>>On Tue, May 14, 2002 at 01:10:05PM -0400, Charles Wilson wrote:
>>
>>>Christopher Faylor wrote:
>>>
>>>
>>>>On Tue, May 14, 2002 at 10:40:19AM -0400, Charles Wilson wrote:
>>>>
>>>>
>>>>>Still doesn't work when installing from a "local" directory (although it 
>>>>>works fine when installing from internet)
>>>>>
>>>>>Once it begins parsing setup.ini, it dies almost immediately.  But, 
>>>>>there is no warning or error popup.
>>>>>
>>>>>
>>>>If I send you a debuggable setup.exe, would you mind running it and
>>>>getting a back trace?
>>>>
>>>Yeah, I could do that.
>>>
>>Actually, I think I duplicated the problem.
>>
>>Stay tuned.
>>
> 
> The attached patch seems to fix this and some other problems.
> 
> I've uploaded a new version to sourceware.
> 
> At least some of the below should be useful on the trunk, too.
> 
> cgf
> 
> 2002-05-14  Christopher Faylor  <cgf@redhat.com>
> 
>         * filemanip.h (trail): Declare.
>         * filemanip.cc (trail): New function.
>         (find_tar_ext): Use trail() instead of strstr().
>         * fromcwd.cc (check_ini): Ditto.
>         * ini.cc (find_routine): Ditto.  Don't tack local_dir to path since it
>         should now be fully qualified.  Set ini_filename.  Reset error_buf and
>         error_count for any subsequent ini file parsing.
>         (ini_filename): New static variable for parse error reporting.
>         (yyerror): Use full path of setup.ini in error message.  Subtract one
>         from line number if at bol.
>         * find.cc (found_part): Eliminate.
>         (find_sub): Call for_each with full path found rather than just file
>         component.
>         (find): Don't calculate found_part.
>         * inilex.l (ini_init): Flush input buffer and reset line number.
>         (yybol): New function.  Exports YY_AT_BOL.
>         * iniparse.y: Increase stack depth to allow more tokens to be processed.
>         (yyparse): Remove newline from error condition to allow subsequent
>         per-line error processing to proceed normally.
> 
> Index: ChangeLog
> ===================================================================
> RCS file: /cvs/cygwin-apps/setup/ChangeLog,v
> retrieving revision 2.218.2.6
> diff -u -p -r2.218.2.6 ChangeLog
> --- ChangeLog	14 May 2002 04:32:44 -0000	2.218.2.6
> +++ ChangeLog	14 May 2002 22:45:15 -0000
> @@ -1,5 +1,27 @@
>  2002-05-14  Christopher Faylor  <cgf@redhat.com>
>  
> +	* filemanip.h (trail): Declare.
> +	* filemanip.cc (trail): New function.
> +	(find_tar_ext): Use trail() instead of strstr().
> +	* fromcwd.cc (check_ini): Ditto.
> +	* ini.cc (find_routine): Ditto.  Don't tack local_dir to path since it
> +	should now be fully qualified.  Set ini_filename.  Reset error_buf and
> +	error_count for any subsequent ini file parsing.
> +	(ini_filename): New static variable for parse error reporting.
> +	(yyerror): Use full path of setup.ini in error message.  Subtract one
> +	from line number if at bol.
> +	* find.cc (found_part): Eliminate.
> +	(find_sub): Call for_each with full path found rather than just file
> +	component.
> +	(find): Don't calculate found_part.
> +	* inilex.l (ini_init): Flush input buffer and reset line number.
> +	(yybol): New function.  Exports YY_AT_BOL.
> +	* iniparse.y: Increase stack depth to allow more tokens to be processed.
> +	(yyparse): Remove newline from error condition to allow subsequent
> +	per-line error processing to proceed normally.
> +
> +2002-05-14  Christopher Faylor  <cgf@redhat.com>
> +
>  	* find.cc (find_sub): Be more defensive in preserving trailing parts of
>  	components when doing recursive directory searches or calling user
>  	supplied for_each().
> Index: filemanip.cc
> ===================================================================
> RCS file: /cvs/cygwin-apps/setup/filemanip.cc,v
> retrieving revision 2.6
> diff -u -p -r2.6 filemanip.cc
> --- filemanip.cc	19 Feb 2002 04:33:28 -0000	2.6
> +++ filemanip.cc	14 May 2002 22:45:16 -0000
> @@ -72,12 +72,12 @@ find_tar_ext (const char *path)
>  {
>    char *end = strchr (path, '\0');
>    /* check in longest first order */
> -  char *ext;
> -  if ((ext = strstr (path, ".tar.bz2")) && (end - ext) == 8)
> +  const char *ext;
> +  if ((ext = trail (path, ".tar.bz2")) && (end - ext) == 8)
>      return ext - path;
> -  if ((ext = strstr (path, ".tar.gz")) && (end - ext) == 7)
> +  if ((ext = trail (path, ".tar.gz")) && (end - ext) == 7)
>      return ext - path;
> -  if ((ext = strstr (path, ".tar")) && (end - ext) == 4)
> +  if ((ext = trail (path, ".tar")) && (end - ext) == 4)
>      return ext - path;
>    return 0;
>  }
> @@ -140,6 +140,19 @@ parse_filename (String const &in_fn, fil
>    f.ver = *ver ? ver : "0.0";
>    delete[] p;
>    return 1;
> +}
> +
> +const char *
> +trail (const char *haystack, const char *needle)
> +{
> +  /* See if the path ends in a trailing setup.ini component.
> +     Just return if it doesn't. */
> +  unsigned len = strlen (haystack);
> +  int prefix_len = len - strlen (needle);
> +  if (prefix_len < 0
> +      || strcasecmp (haystack += prefix_len, needle) != 0)
> +    return NULL;
> +  return haystack;
>  }
>  
>  String
> Index: filemanip.h
> ===================================================================
> RCS file: /cvs/cygwin-apps/setup/filemanip.h,v
> retrieving revision 1.7
> diff -u -p -r1.7 filemanip.h
> --- filemanip.h	19 Feb 2002 04:33:28 -0000	1.7
> +++ filemanip.h	14 May 2002 22:45:16 -0000
> @@ -30,3 +30,4 @@ int parse_filename (String const & in_fn
>  String base (String const &);
>  unsigned int get_file_size (String const &);
>  String backslash (String const &);
> +const char * trail (const char *, const char *);
> Index: find.cc
> ===================================================================
> RCS file: /cvs/cygwin-apps/setup/find.cc,v
> retrieving revision 2.3.6.1
> diff -u -p -r2.3.6.1 find.cc
> --- find.cc	14 May 2002 04:32:44 -0000	2.3.6.1
> +++ find.cc	14 May 2002 22:45:16 -0000
> @@ -30,7 +30,7 @@ static const char *cvsid =
>  #include "String++.h"
>  #include "find.h"
>  
> -static char dir[_MAX_PATH], *found_part;
> +static char dir[_MAX_PATH];
>  
>  static int
>  find_sub (void (*for_each) (char *, unsigned int))
> @@ -60,7 +60,7 @@ find_sub (void (*for_each) (char *, unsi
>  	find_sub (for_each);
>        else
>  	{
> -	  for_each (found_part, wfd.nFileSizeLow);
> +	  for_each (dir, wfd.nFileSizeLow);
>  	  rv++;
>  	}
>  
> @@ -75,7 +75,6 @@ int
>  find (String const &starting_dir, void (*_for_each) (char *, unsigned int))
>  {
>    strcpy (dir, starting_dir.cstr_oneuse());
> -  found_part = dir + strlen (dir) + 1;
>  
>    return find_sub (_for_each);
>  }
> Index: fromcwd.cc
> ===================================================================
> RCS file: /cvs/cygwin-apps/setup/fromcwd.cc,v
> retrieving revision 2.22
> diff -u -p -r2.22 fromcwd.cc
> --- fromcwd.cc	18 Feb 2002 13:53:06 -0000	2.22
> +++ fromcwd.cc	14 May 2002 22:45:18 -0000
> @@ -141,7 +141,7 @@ static bool found_ini;
>  static void
>  check_ini (char *path, unsigned int fsize)
>  {
> -  if (fsize && strstr (path, "setup.ini"))
> +  if (fsize && trail (path, "setup.ini"))
>      found_ini = true;
>  }
>  
> Index: ini.cc
> ===================================================================
> RCS file: /cvs/cygwin-apps/setup/ini.cc,v
> retrieving revision 2.22.2.1
> diff -u -p -r2.22.2.1 ini.cc
> --- ini.cc	14 May 2002 04:32:45 -0000	2.22.2.1
> +++ ini.cc	14 May 2002 22:45:19 -0000
> @@ -43,6 +43,7 @@ static const char *cvsid =
>  #include "site.h"
>  #include "rfc1738.h"
>  #include "find.h"
> +#include "filemanip.h"
>  
>  #include "io_stream.h"
>  
> @@ -62,27 +63,28 @@ static int error_count = 0;
>  
>  static int local_ini;
>  
> +static const char *ini_filename;
> +
>  static void
>  find_routine (char *path, unsigned int fsize)
>  {
> -  /* See if the path ends in a trailing setup.ini component.
> -     Just return if it doesn't. */
> -  unsigned pathlen = strlen (path);
> -  unsigned pathprefix_len = pathlen - 10;
> -  if (pathlen < strlen ("setup.ini")
> -      || strcasecmp (path + pathprefix_len, "\\setup.ini") != 0)
> +  const char *setup_ini = trail (path, "\\setup.ini");
> +
> +  if (setup_ini == NULL)
>      return;
>  
> -  io_stream *ini_file = io_stream::open (String ("file://") + local_dir + "/" +
> +  unsigned pathprefix_len = setup_ini - path;
> +
> +  io_stream *ini_file = io_stream::open (String ("file://") +
>  					 path, "rb");
>    if (!ini_file)
>      {
> -    note (NULL, IDS_SETUPINI_MISSING, (String ("file://") + local_dir + "/" +
> +    note (NULL, IDS_SETUPINI_MISSING, (String ("file://") +
>  				       path).cstr_oneuse());
>      return;
>      }
>    else
> -    log (LOG_BABBLE, String ("Found ini file - file://") + local_dir + "/" + path);
> +    log (LOG_BABBLE, String ("Found ini file - file://") + path);
>  
>    /* FIXME: only use most recent copy */
>    setup_timestamp = 0;
> @@ -96,12 +98,15 @@ find_routine (char *path, unsigned int f
>    String mirror = rfc1738_unescape_part (path_prefix);
>    ini_init (ini_file, mirror);
>  
> -  /*yydebug = 1; */
> +  /*yydebug = 1;*/
>  
> +  ini_filename = path;
>    if (yyparse () || error_count > 0)
>      MessageBox (0, error_buf, error_count == 1 ? "Parse Error" : "Parse Errors", 0);
>    else
>      local_ini++;
> +  *error_buf = '\0';
> +  error_count = 0;
>  }
>  
>  static int
> @@ -251,15 +256,15 @@ do_ini (HINSTANCE h, HWND owner)
>    CreateThread (NULL, 0, do_ini_thread_reflector, context, 0, &threadID);
>  }
>  
> -
>  extern int yylineno;
> +extern int yybol ();
>  
>  extern "C" int
>  yyerror (char *s, ...)
>  {
> -  char buf[1000];
> +  char buf[MAX_PATH + 1000];
>    int len;
> -  sprintf (buf, "setup.ini line %d: ", yylineno);
> +  sprintf (buf, "%s line %d: ", ini_filename, yylineno - yybol ());
>    va_list args;
>    va_start (args, s);
>    vsprintf (buf + strlen (buf), s, args);
> Index: iniparse.y
> ===================================================================
> RCS file: /cvs/cygwin-apps/setup/iniparse.y,v
> retrieving revision 2.27.2.1
> diff -u -p -r2.27.2.1 iniparse.y
> --- iniparse.y	10 May 2002 10:59:05 -0000	2.27.2.1
> +++ iniparse.y	14 May 2002 22:45:20 -0000
> @@ -37,6 +37,7 @@ int yylex ();
>  #include "cygpackage.h"
>  
>  #define YYERROR_VERBOSE 1
> +#define YYINITDEPTH 1000
>  /*#define YYDEBUG 1*/
>  
>  static packagemeta *cp = 0;
> @@ -108,9 +109,8 @@ simple_line
>   | T_TEST			{ trust = TRUST_TEST; cpv = new cygpackage (cp->name); }
>   | T_UNKNOWN			{ trust = TRUST_UNKNOWN; }
>   | /* empty */
> - | error '\n' { yylineno --;
> -		yyerror ("unrecognized line in package %s (do you have the latest setup?)", cp->name.cstr_oneuse());
> -		yylineno ++;
> + | error  {	yyerror ("unrecognized line in package %s (do you have the latest setup?)", cp->name.cstr_oneuse());
> +		yyerrok;
>  	      }
>   ;
>  
> Index: inilex.l
> ===================================================================
> RCS file: /cvs/cygwin-apps/setup/inilex.l,v
> retrieving revision 2.14.2.1
> retrieving revision 2.14.2.3
> diff -u -p -r2.14.2.1 -r2.14.2.3
> --- inilex.l	4 May 2002 01:21:59 -0000	2.14.2.1
> +++ inilex.l	14 May 2002 22:49:19 -0000	2.14.2.3
> @@ -113,6 +113,8 @@ ini_init(io_stream *stream, String const
>    if (parse_mirror)
>      delete[] parse_mirror;
>    parse_mirror = mirror.cstr();
> +  YY_FLUSH_BUFFER;
> +  yylineno = 1;
>  }
>  
>  static int
> @@ -142,4 +144,10 @@ ignore_line ()
>        if (c == '\n')
>  	return;
>      }
> +}
> +
> +int
> +yybol ()
> +{
> +  return !!YY_AT_BOL ();
>  }
> 




More information about the Cygwin-apps mailing list