1671
* Configure PATH. On Windows, sometimes PATH is not set correctly
1675
configure_path (void)
1679
fp = fopen ("c:\\windows\\system32\\route.exe", "rb");
1682
const int bufsiz = 4096;
1683
struct gc_arena gc = gc_new ();
1684
struct buffer oldpath = alloc_buf_gc (bufsiz, &gc);
1685
struct buffer newpath = alloc_buf_gc (bufsiz, &gc);
1686
const char* delim = ";";
1689
status = GetEnvironmentVariable ("PATH", BPTR(&oldpath), (DWORD)BCAP(&oldpath));
1695
*BPTR(&oldpath) = '\0';
1698
buf_printf (&newpath, "C:\\WINDOWS\\System32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem%s%s",
1701
SetEnvironmentVariable ("PATH", BSTR(&newpath));
1703
status = GetEnvironmentVariable ("PATH", BPTR(&oldpath), (DWORD)BCAP(&oldpath));
1705
printf ("PATH: %s\n", BSTR(&oldpath));
1652
* Return the next largest power of 2
1653
* or u if u is a power of 2.
1656
adjust_power_of_2 (size_t u)
1670
* A printf-like function (that only recognizes a subset of standard printf
1671
* format operators) that prints arguments to an argv list instead
1672
* of a standard string. This is used to build up argv arrays for passing
1677
argv_init (struct argv *a)
1693
argv_reset (struct argv *a)
1696
for (i = 0; i < a->argc; ++i)
1703
argv_extend (struct argv *a, const size_t newcap)
1705
if (newcap > a->capacity)
1709
ALLOC_ARRAY_CLEAR (newargv, char *, newcap);
1710
for (i = 0; i < a->argc; ++i)
1711
newargv[i] = a->argv[i];
1714
a->capacity = newcap;
1719
argv_grow (struct argv *a, const size_t add)
1721
const size_t newargc = a->argc + add + 1;
1722
ASSERT (newargc > a->argc);
1723
argv_extend (a, adjust_power_of_2 (newargc));
1727
argv_append (struct argv *a, char *str) /* str must have been malloced or be NULL */
1730
a->argv[a->argc++] = str;
1734
argv_clone (const struct argv *a, const size_t headroom)
1740
for (i = 0; i < headroom; ++i)
1741
argv_append (&r, NULL);
1744
for (i = 0; i < a->argc; ++i)
1745
argv_append (&r, string_alloc (a->argv[i], NULL));
1751
argv_insert_head (const struct argv *a, const char *head)
1755
r = argv_clone (a, 1);
1756
r.argv[0] = string_alloc (head, NULL);
1762
argv_term (const char **f)
1765
const char *term = NULL;
1798
ASSERT (termlen > 0);
1799
ret = malloc (termlen + 1);
1800
check_malloc_return (ret);
1801
memcpy (ret, term, termlen);
1802
ret[termlen] = '\0';
1810
argv_str (const struct argv *a, struct gc_arena *gc, const unsigned int flags)
1813
return print_argv ((const char **)a->argv, gc, flags);
1819
argv_msg (const int msglev, const struct argv *a)
1821
struct gc_arena gc = gc_new ();
1822
msg (msglev, "%s", argv_str (a, &gc, 0));
1827
argv_msg_prefix (const int msglev, const struct argv *a, const char *prefix)
1829
struct gc_arena gc = gc_new ();
1830
msg (msglev, "%s: %s", prefix, argv_str (a, &gc, 0));
1835
argv_printf (struct argv *a, const char *format, ...)
1838
va_start (arglist, format);
1839
argv_printf_arglist (a, format, 0, arglist);
1844
argv_printf_cat (struct argv *a, const char *format, ...)
1847
va_start (arglist, format);
1848
argv_printf_arglist (a, format, APA_CAT, arglist);
1853
argv_printf_arglist (struct argv *a, const char *format, const unsigned int flags, va_list arglist)
1855
struct gc_arena gc = gc_new ();
1857
const char *f = format;
1859
if (!(flags & APA_CAT))
1861
argv_extend (a, 1); /* ensure trailing NULL */
1863
while ((term = argv_term (&f)) != NULL)
1867
if (!strcmp (term, "%s"))
1869
char *s = va_arg (arglist, char *);
1872
argv_append (a, string_alloc (s, NULL));
1874
else if (!strcmp (term, "%sc"))
1876
char *s = va_arg (arglist, char *);
1880
char *parms[MAX_PARMS+1];
1883
nparms = parse_line (s, parms, MAX_PARMS, "SCRIPT-ARGV", 0, M_FATAL, &gc);
1884
for (i = 0; i < nparms; ++i)
1885
argv_append (a, string_alloc (parms[i], NULL));
1888
argv_append (a, string_alloc ("", NULL));
1890
else if (!strcmp (term, "%d"))
1893
openvpn_snprintf (numstr, sizeof (numstr), "%d", va_arg (arglist, int));
1894
argv_append (a, string_alloc (numstr, NULL));
1896
else if (!strcmp (term, "%u"))
1899
openvpn_snprintf (numstr, sizeof (numstr), "%u", va_arg (arglist, unsigned int));
1900
argv_append (a, string_alloc (numstr, NULL));
1902
else if (!strcmp (term, "%s/%d"))
1905
char *s = va_arg (arglist, char *);
1910
openvpn_snprintf (numstr, sizeof (numstr), "%d", va_arg (arglist, int));
1913
const size_t len = strlen(s) + strlen(numstr) + 2;
1914
char *combined = (char *) malloc (len);
1915
check_malloc_return (combined);
1917
strcpy (combined, s);
1918
strcat (combined, "/");
1919
strcat (combined, numstr);
1920
argv_append (a, combined);
1923
else if (!strcmp (term, "%s%s"))
1925
char *s1 = va_arg (arglist, char *);
1926
char *s2 = va_arg (arglist, char *);
1931
combined = (char *) malloc (strlen(s1) + strlen(s2) + 1);
1932
check_malloc_return (combined);
1933
strcpy (combined, s1);
1934
strcat (combined, s2);
1935
argv_append (a, combined);
1943
argv_append (a, term);
1713
1949
#ifdef ARGV_TEST
1715
1951
argv_test (void)
1717
1953
struct gc_arena gc = gc_new ();
1742
1977
printf ("%s\n", s);
1745
argv_printf (&a, "foo bar %d", 99);
1746
s = argv_str (&a, &gc, PA_BRACKET);
1750
s = argv_str (&a, &gc, PA_BRACKET);
1754
argv_printf (&a, "foo bar %d", 99);
1755
argv_printf_cat (&a, "bar %d foo", 42);
1980
argv_printf (&a, "%sc foo bar %d", "\"multi term\" command following \\\"spaces", 99);
1981
s = argv_str (&a, &gc, PA_BRACKET);
1985
s = argv_str (&a, &gc, PA_BRACKET);
1989
argv_printf (&a, "foo bar %d", 99);
1990
argv_printf_cat (&a, "bar %d foo %sc", 42, "nonesuch");
1756
1991
argv_printf_cat (&a, "cool %s %d u %s/%d end", "frood", 4, "hello", 7);
1757
1992
s = argv_str (&a, &gc, PA_BRACKET);
1758
1993
printf ("%s\n", s);
1761
while (fgets (line, sizeof(line), stdin) != NULL)
1764
const char *f = line;
1998
while (fgets (line, sizeof(line), stdin) != NULL)
2001
const char *f = line;
1767
while ((term = argv_term (&f)) != NULL)
1769
printf ("[%d] '%s'\n", i, term);
2004
while ((term = argv_term (&f)) != NULL)
2006
printf ("[%d] '%s'\n", i, term);
1776
2014
argv_reset (&a);