*/
#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
#include <xen/xen.h>
extern int main(int argc, char **argv);
+static void parseargs(void *cmdline, int *nargs, char **outarray) {
+ char *p = cmdline;
+ char *out = 0;
+ int quote = -1; /* -1 means outside arg, 0 or '"' or '\'' inside */
+
+ *nargs = 0;
+
+ for (;;) {
+ int ac = *p++;
+ int rc = ac;
+ if (ac == '\\')
+ rc = *p++;
+ if (!rc || ac==' ' || ac=='\n' || ac=='\t') {
+ /* any kind of delimiter */
+ if (!rc || quote==0) {
+ /* ending an argument */
+ if (out)
+ *out++ = 0;
+ quote = -1;
+ }
+ if (!rc)
+ /* definitely quit then */
+ break;
+ if (quote<0)
+ /* not in an argument now */
+ continue;
+ }
+ if (quote<0) {
+ /* starting an argument */
+ if (outarray)
+ outarray[*nargs] = out = p-1;
+ (*nargs)++;
+ quote = 0;
+ }
+ if (quote > 0 && ac == quote) {
+ quote = 0;
+ continue;
+ }
+ if (ac == '\'' || ac == '"') {
+ quote = ac;
+ continue;
+ }
+ if (out)
+ *out++ = rc;
+ }
+}
+
int
__default_app_main(start_info_t *si)
{
- char argv0[] = "rumpuser-xen";
- char *argv[3] = { argv0, (char*)si->cmd_line, 0 };
+ char argv0[] = "rumpuser-xen";
+ int nargs;
+ char **argv;
+
+ parseargs(si->cmd_line, &nargs, 0);
+ argv = malloc(sizeof(*argv) * (nargs+3));
+ argv[0] = argv0;
+ parseargs(si->cmd_line, &nargs, argv+1);
+ argv[nargs+1] = 0;
+ argv[nargs+2] = 0;
- return main(2, argv);
+ return main(nargs+1, argv);
}
__weak_alias(app_main,__default_app_main)