100 lines
3.0 KiB
C++
100 lines
3.0 KiB
C++
/* winf.h
|
|
|
|
Copyright 2006, 2007, 2011 Red Hat, Inc.
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
details. */
|
|
|
|
#ifndef _WINF_H
|
|
#define _WINF_H
|
|
|
|
/* Hack for Cygwin processes. If the Windows command line length gets slightly
|
|
bigger than this value, the stack position is suddenly moved up by 64K for
|
|
no apparent reason, which results in subsequent forks failing. Since Cygwin
|
|
processes get the full command line as argv array anyway, this only affects
|
|
the maximum command line length of Cygwin applications which nonsensically
|
|
have a WinMain instead of a main entry point or which use GetCommandLine. */
|
|
#define MAXCYGWINCMDLEN 30000
|
|
|
|
#define MAXWINCMDLEN 32767
|
|
#define LINE_BUF_CHUNK (MAX_PATH * 2)
|
|
|
|
/* Add this flag in calls to spawn_guts if the calling function is one of
|
|
'p' type functions: execlp, execvp, spawnlp, spawnvp. Per POSIX, only
|
|
these p-type functions fall back to call /bin/sh if the file is not a
|
|
binary. The setting of _P_PATH_TYPE_EXEC is used as a bool value in
|
|
av::fixup to decide if the file should be evaluated as a script, or if
|
|
ENOEXEC should be returned. */
|
|
#define _P_PATH_TYPE_EXEC 0x100
|
|
/* Helper macro to mask actual mode and drop additional flags defined above. */
|
|
#define _P_MODE(x) ((x) & 0xff)
|
|
|
|
class av
|
|
{
|
|
char **argv;
|
|
int calloced;
|
|
public:
|
|
int argc;
|
|
bool win16_exe;
|
|
av (): argv (NULL) {}
|
|
av (int ac_in, const char * const *av_in) : calloced (0), argc (ac_in), win16_exe (false)
|
|
{
|
|
argv = (char **) cmalloc_abort (HEAP_1_ARGV, (argc + 5) * sizeof (char *));
|
|
memcpy (argv, av_in, (argc + 1) * sizeof (char *));
|
|
}
|
|
void *operator new (size_t, void *p) __attribute__ ((nothrow)) {return p;}
|
|
void set (int ac_in, const char * const *av_in) {new (this) av (ac_in, av_in);}
|
|
~av ()
|
|
{
|
|
if (argv)
|
|
{
|
|
for (int i = 0; i < calloced; i++)
|
|
if (argv[i])
|
|
cfree (argv[i]);
|
|
cfree (argv);
|
|
}
|
|
}
|
|
int unshift (const char *what, int conv = 0);
|
|
operator char **() {return argv;}
|
|
void all_calloced () {calloced = argc;}
|
|
void replace0_maybe (const char *arg0)
|
|
{
|
|
/* Note: Assumes that argv array has not yet been "unshifted" */
|
|
if (!calloced)
|
|
{
|
|
argv[0] = cstrdup1 (arg0);
|
|
calloced = true;
|
|
}
|
|
}
|
|
void dup_maybe (int i)
|
|
{
|
|
if (i >= calloced)
|
|
argv[i] = cstrdup1 (argv[i]);
|
|
}
|
|
void dup_all ()
|
|
{
|
|
for (int i = calloced; i < argc; i++)
|
|
argv[i] = cstrdup1 (argv[i]);
|
|
}
|
|
int fixup (const char *, path_conv&, const char *, bool);
|
|
};
|
|
|
|
class linebuf
|
|
{
|
|
public:
|
|
size_t ix;
|
|
char *buf;
|
|
size_t alloced;
|
|
linebuf () : ix (0), buf (NULL), alloced (0) {}
|
|
~linebuf () {if (buf) free (buf);}
|
|
void add (const char *, int) __attribute__ ((regparm (3)));
|
|
void add (const char *what) {add (what, strlen (what));}
|
|
void prepend (const char *, int);
|
|
void finish (bool) __attribute__ ((regparm (2)));
|
|
bool fromargv(av&, const char *, bool) __attribute__ ((regparm (3)));;
|
|
operator char *() {return buf;}
|
|
};
|
|
|
|
#endif /*_WINF_H*/
|