Ejemplo n.º 1
0
static int getVars(char ***cgiKeys, char *buf, size_t buflen)
{
    char    **keyList, *eq, *cp, *pp, *newbuf;
    int     i, keyCount;

    if (buflen > 0) {
        if ((newbuf = malloc(buflen + 1)) == 0) {
            error("Can't allocate memory");
            return 0;
        }
        strncpy(newbuf, buf, buflen);
        newbuf[buflen] = '\0';
        buf = newbuf;
    }

    /*
        Change all plus signs back to spaces
     */
    keyCount = (buflen > 0) ? 1 : 0;
    for (cp = buf; cp < &buf[buflen]; cp++) {
        if (*cp == '+') {
            *cp = ' ';
        } else if (*cp == '&') {
            keyCount++;
        }
    }
    if (keyCount == 0) {
        return 0;
    }

    /*
        Crack the input into name/value pairs 
     */
    keyList = malloc((keyCount * 2) * sizeof(char**));

    i = 0;
    for (pp = strtok(buf, "&"); pp; pp = strtok(0, "&")) {
        if ((eq = strchr(pp, '=')) != 0) {
            *eq++ = '\0';
            descape(pp);
            descape(eq);
        } else {
            descape(pp);
        }
        if (i < (keyCount * 2)) {
            keyList[i++] = pp;
            keyList[i++] = eq;
        }
    }
    *cgiKeys = keyList;
    return keyCount;
}
Ejemplo n.º 2
0
int main( int argc, char **argv )
{
	int i = 1, j = 0, sch = 0;
	while ( i < argc )
	{
		if ( (argv[i][0] == '-') && isin(argv[i][1],"en-")
			&& getopts(argv[i]+1) ) i++;
		if ( stopargs ) break;
	}
	char skip = 0;
	while ( i < argc )
	{
		if ( !(opt&O_ESC) )
		{
			fputs(argv[i],stdout);
			putchar(((i+1)==argc)?((opt&O_NONL)?'\0':'\n'):' ');
			i++;
			continue;
		}
		j = skip = 0;
		while ( !skip )
		{
			sch = descape(argv[i]+j);
			j += sch;
			if ( sch == -1 ) return 0;
			if ( !sch ) skip = 1;
		}
		putchar((i<(argc-1))?' ':'\n');
		i++;
	}
	return 0;
}
Ejemplo n.º 3
0
static int getVars(MprCtx ctx, char ***cgiKeys, char *buf, int buflen)
{
    char    **keyList;
    char    *eq, *cp, *pp;
    int     i, keyCount;

    /*
     *  Change all plus signs back to spaces
     */
    keyCount = (buflen > 0) ? 1 : 0;
    for (cp = buf; cp < &buf[buflen]; cp++) {
        if (*cp == '+') {
            *cp = ' ';
        } else if (*cp == '&') {
            keyCount++;
        }
    }

    if (keyCount == 0) {
        return 0;
    }

    /*
     *  Crack the input into name/value pairs 
     */
    keyList = (char**) mprAlloc(ctx, (keyCount * 2) * (int) sizeof(char**));

    i = 0;
    for (pp = strtok(buf, "&"); pp; pp = strtok(0, "&")) {
        if ((eq = strchr(pp, '=')) != 0) {
            *eq++ = '\0';
            descape(pp);
            descape(eq);
        } else {
            descape(pp);
        }
        if (i < (keyCount * 2)) {
            keyList[i++] = pp;
            keyList[i++] = eq;
        }
    }
    *cgiKeys = keyList;
    return keyCount;
}
Ejemplo n.º 4
0
/*
    If there is a HTTP_SWITCHES argument in the query string, examine that instead of the original argv
 */
static int getArgv(int *pargc, char ***pargv, int originalArgc, char **originalArgv)
{
    char    *switches, *next, sbuf[1024];
    int     i;

    *pargc = 0;
    if (getQueryString(&queryBuf, &queryLen) < 0) {
        return -1;
    }
    numQueryKeys = getVars(&queryKeys, queryBuf, queryLen);

    switches = 0;
    for (i = 0; i < numQueryKeys; i += 2) {
        if (strcmp(queryKeys[i], "HTTP_SWITCHES") == 0) {
            switches = queryKeys[i+1];
            break;
        }
    }

    if (switches == 0) {
        switches = getenv("HTTP_SWITCHES");
    }
    if (switches) {
        strncpy(sbuf, switches, sizeof(sbuf) - 1);
        descape(sbuf);
        next = strtok(sbuf, " \t\n");
        i = 1;
        for (i = 1; next && i < (MAX_ARGV - 1); i++) {
            argvList[i] = next;
            next = strtok(0, " \t\n");
        }
        argvList[0] = originalArgv[0];
        *pargv = argvList;
        *pargc = i;

    } else {
        *pargc = originalArgc;
        *pargv = originalArgv;
    }
    return 0;
}
Ejemplo n.º 5
0
int main( void )
{
	int prec[ 2 ], pstc[ 2 ]; // PRE-Conversion, POST-Conversion 
	int cnvstt = DFLT; // CoNVersion STaTe

	while( ( prec[ 1 ] = getchar() ) != EOF )
	{
		/* Reads ahead if the latest input character is a '\' */
		if( prec[ 1 ] == '\\' )
		{
			prec[ 0 ] = prec[ 1 ];
			if( ( prec[ 1 ] = getchar() ) == EOF ) // prevents overflow
			{
				putchar( prec[ 0 ] );
				break;
			}
		}

		/* Determines conversion state: escape character to literal
		   representation, or vice versa */
		if( cnvstt == DFLT )
		{
			if( prec[ 0 ] == '\\' )
			{
				switch( prec[ 1 ] )
				{
					case 'a': case 'b': case 'f': case 'n': case 'r':
					case 't': case 'v': case '?': case '\'': case '"':
						cnvstt = LR2EC;
				}
			}
			else
			{
				switch( prec[ 1 ] )
				{
					case '\a':  case '\b': case '\f': case '\n': case '\r':
					case '\t': case '\v': case '\?': case '\'': case '\"':
						cnvstt = EC2LR;
				}
			}
		}

		/* Prints output */
		if( prec[ 0 ] == '\\' )
		{
			if( descape( prec, pstc ) && cnvstt == LR2EC )
			{
				putchar( pstc[ 1 ] );
			}
			else
			{
				printf( "%c%c", pstc[ 0 ], pstc[ 1 ] );
			}
			prec[ 0 ] = 'X'; // prec[ 0 ] must be set to anything but '\\'
		}
		else if( cnvstt == EC2LR && escape( prec, pstc ) )
		{
			printf( "%c%c", pstc[ 0 ], pstc[ 1 ] );
		}
		else
		{
			putchar( prec[ 1 ] );
		}
	}

	return 0;
}