Bump GPLv2+ to GPLv3+ for some files, clarify BSD 2-clause. Everything else stays under GPLv3+. New Linking Exception exempts resulting executables from LGPLv3 section 4. Add CONTRIBUTORS file to keep track of licensing. Remove 'Copyright Red Hat Inc' comments. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
		
			
				
	
	
		
			141 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* winf.cc
 | |
| 
 | |
| This software is a copyrighted work licensed under the terms of the
 | |
| Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | |
| details. */
 | |
| 
 | |
| #include "winsup.h"
 | |
| #include <stdlib.h>
 | |
| #include "cygerrno.h"
 | |
| #include "security.h"
 | |
| #include "path.h"
 | |
| #include "fhandler.h"
 | |
| #include "dtable.h"
 | |
| #include "cygheap.h"
 | |
| #include "tls_pbuf.h"
 | |
| #include "winf.h"
 | |
| #include "sys/cygwin.h"
 | |
| 
 | |
| void
 | |
| linebuf::finish (bool cmdlenoverflow_ok)
 | |
| {
 | |
|   if (!ix)
 | |
|     add ("", 1);
 | |
|   else
 | |
|     {
 | |
|       if (ix-- > MAXCYGWINCMDLEN && cmdlenoverflow_ok)
 | |
| 	ix = MAXCYGWINCMDLEN - 1;
 | |
|       buf[ix] = '\0';
 | |
|     }
 | |
| }
 | |
| 
 | |
| void
 | |
| linebuf::add (const char *what, int len)
 | |
| {
 | |
|   size_t newix = ix + len;
 | |
|   if (newix >= alloced || !buf)
 | |
|     {
 | |
|       alloced += LINE_BUF_CHUNK + newix;
 | |
|       buf = (char *) realloc (buf, alloced + 1);
 | |
|     }
 | |
|   memcpy (buf + ix, what, len);
 | |
|   ix = newix;
 | |
|   buf[ix] = '\0';
 | |
| }
 | |
| 
 | |
| void
 | |
| linebuf::prepend (const char *what, int len)
 | |
| {
 | |
|   int buflen;
 | |
|   size_t newix;
 | |
|   if ((newix = ix + len) >= alloced)
 | |
|     {
 | |
|       alloced += LINE_BUF_CHUNK + newix;
 | |
|       buf = (char *) realloc (buf, alloced + 1);
 | |
|       buf[ix] = '\0';
 | |
|     }
 | |
|   if ((buflen = strlen (buf)))
 | |
|       memmove (buf + len, buf, buflen + 1);
 | |
|   else
 | |
|       buf[newix] = '\0';
 | |
|   memcpy (buf, what, len);
 | |
|   ix = newix;
 | |
| }
 | |
| 
 | |
| bool
 | |
| linebuf::fromargv (av& newargv, const char *real_path, bool cmdlenoverflow_ok)
 | |
| {
 | |
|   bool success = true;
 | |
|   for (int i = 0; i < newargv.argc; i++)
 | |
|     {
 | |
|       char *p = NULL;
 | |
|       const char *a;
 | |
| 
 | |
|       a = i ? newargv[i] : (char *) real_path;
 | |
|       int len = strlen (a);
 | |
|       if (len != 0 && !strpbrk (a, " \t\n\r\""))
 | |
| 	add (a, len);
 | |
|       else
 | |
| 	{
 | |
| 	  add ("\"", 1);
 | |
| 	  /* Handle embedded special characters " and \.
 | |
| 	     A " is always preceded by a \.
 | |
| 	     A \ is not special unless it precedes a ".  If it does,
 | |
| 	     then all preceding \'s must be doubled to avoid having
 | |
| 	     the Windows command line parser interpret the \ as quoting
 | |
| 	     the ".  This rule applies to a string of \'s before the end
 | |
| 	     of the string, since cygwin/windows uses a " to delimit the
 | |
| 	     argument. */
 | |
| 	  for (; (p = strpbrk (a, "\"\\")); a = ++p)
 | |
| 	    {
 | |
| 	      add (a, p - a);
 | |
| 	      /* Find length of string of backslashes */
 | |
| 	      int n = strspn (p, "\\");
 | |
| 	      if (!n)
 | |
| 		add ("\\\"", 2);	/* No backslashes, so it must be a ".
 | |
| 					       The " has to be protected with a backslash. */
 | |
| 	      else
 | |
| 		{
 | |
| 		  add (p, n);	/* Add the run of backslashes */
 | |
| 		  /* Need to double up all of the preceding
 | |
| 		     backslashes if they precede a quote or EOS. */
 | |
| 		  if (!p[n] || p[n] == '"')
 | |
| 		    add (p, n);
 | |
| 		  p += n - 1;		/* Point to last backslash */
 | |
| 		}
 | |
| 	    }
 | |
| 	  if (*a)
 | |
| 	    add (a);
 | |
| 	  add ("\"", 1);
 | |
| 	}
 | |
|       add (" ", 1);
 | |
|     }
 | |
| 
 | |
|   finish (cmdlenoverflow_ok);
 | |
| 
 | |
|   if (ix >= MAXWINCMDLEN)
 | |
|     {
 | |
|       debug_printf ("command line too long (>32K), return E2BIG");
 | |
|       set_errno (E2BIG);
 | |
|       success = false;
 | |
|     }
 | |
| 
 | |
|   return success;
 | |
| }
 | |
| 
 | |
| int
 | |
| av::unshift (const char *what)
 | |
| {
 | |
|   char **av;
 | |
|   av = (char **) crealloc (argv, (argc + 2) * sizeof (char *));
 | |
|   if (!av)
 | |
|     return 0;
 | |
| 
 | |
|   argv = av;
 | |
|   memmove (argv + 1, argv, (argc + 1) * sizeof (char *));
 | |
|   *argv = cstrdup1 (what);
 | |
|   calloced++;
 | |
|   argc++;
 | |
|   return 1;
 | |
| }
 |