Exemple #1
0
int webclientReadResponse(int s, char* buf, int size)
{
    int len, bodylen = 0;
    bool chunked = false;

    // read through the headers - figure out the content length scheme
    while ((len = tcpReadLine(s, webclientBuf, WEBCLIENT_BUFFER_SIZE))) {
        if (!strncasecmp(webclientBuf, "Content-Length", 14)) // check for content length
            bodylen = atoi(&webclientBuf[16]);
        else if (!strncasecmp(webclientBuf, "Transfer-Encoding: chunked", 26)) // check to see if we're chunked
            chunked = true;
        else if (strncmp(webclientBuf, "\r\n", 2) == 0) // final CRLF means end of headers
            break;
    }

    if (len <= 0)
        return 0;

    int content_read = 0;
    // read the actual response data into the caller's buffer, if there's any to grab
    if (chunked) { // first see if it's chunked
        int chunklen = 1;
        while (chunklen != 0 && content_read < size) {
            len = tcpReadLine(s, webclientBuf, WEBCLIENT_BUFFER_SIZE);
            if (siscanf(webclientBuf, "%x", &chunklen) != 1) // the first part of the chunk should indicate the chunk's length (hex)
                break;
            if (chunklen == 0) // an empty chunk indicates the end of the transfer
                break;
            if (chunklen > (size - content_read)) // make sure we have enough room to read this chunk, based on what we've already read
                chunklen = size - content_read;
            content_read += tcpRead(s, buf, chunklen);
            tcpReadLine(s, webclientBuf, WEBCLIENT_BUFFER_SIZE); // slurp out the remaining newlines
        }
    }
    // otherwise see if we got a content length
    else if (bodylen > 0) {
        while ((len = tcpRead(s, buf, size - content_read))) {
            content_read += len;
            buf += len;
            if (content_read >= bodylen)
                break;
        }
    }
    // lastly, just try to read until we get cut off
    else {
        while (content_read < size) {
            len = tcpRead(s, buf, size - content_read);
            if (len <= 0)
                break;
            content_read += len;
            buf += len;
        }
    }
    return content_read;
}
Exemple #2
0
struct ip_addr str2ip(const char* str)
{
        int a,b,c,d;
        uint32_t ip = 0;

        if (siscanf(str,"%d.%d.%d.%d",&a,&b,&c,&d) != 4)
                goto out;

        if (a < 0 || a > 255 || b < 0 || b > 255 ||
            c < 0 || c > 255 || d < 0 || d > 255)
                goto out;

#if BYTE_ORDER == LITTLE_ENDIAN
        ip = (d << 24) | (c << 16) | (b << 8) | a;
#else
        ip = (a << 24) | (b << 16) | (c << 8) | d;
#endif

 out:
        return *(struct ip_addr*) &ip;
}
Exemple #3
0
//---------------------------------------------------------------------------------
ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
//---------------------------------------------------------------------------------

	char chr;

	int i, count = 0;
	char *tmp = (char*)ptr;
	int intensity = 0;

	if(!tmp || len<=0) return -1;

	i = 0;

	while(*tmp!='\0' && i<len) {

		chr = *(tmp++);
		i++; count++;

		if ( chr == 0x1b && *tmp == '[' ) {
			bool escaping = true;
			char *escapeseq	= tmp;
			int escapelen = 0;

			do {
				chr = *(tmp++);
				i++; count++; escapelen++;
				int parameter;

				switch (chr) {
					/////////////////////////////////////////
					// Cursor directional movement
					/////////////////////////////////////////
					case 'A':
						siscanf(escapeseq,"[%dA", &parameter);
						currentConsole->cursorY  =  (currentConsole->cursorY  - parameter) < 0 ? 0 : currentConsole->cursorY  - parameter;
						escaping = false;
						break;
					case 'B':
						siscanf(escapeseq,"[%dB", &parameter);
						currentConsole->cursorY  =  (currentConsole->cursorY  + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY  + parameter;
						escaping = false;
						break;
					case 'C':
						siscanf(escapeseq,"[%dC", &parameter);
						currentConsole->cursorX  =  (currentConsole->cursorX  + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX  + parameter;
						escaping = false;
						break;
					case 'D':
						siscanf(escapeseq,"[%dD", &parameter);
						currentConsole->cursorX  =  (currentConsole->cursorX  - parameter) < 0 ? 0 : currentConsole->cursorX  - parameter;
						escaping = false;
						break;
						/////////////////////////////////////////
						// Cursor position movement
						/////////////////////////////////////////
					case 'H':
					case 'f':
						siscanf(escapeseq,"[%d;%df", &currentConsole->cursorY , &currentConsole->cursorX );
						escaping = false;
						break;
						/////////////////////////////////////////
						// Screen clear
						/////////////////////////////////////////
					case 'J':
						consoleCls(escapeseq[escapelen-2]);
						escaping = false;
						break;
						/////////////////////////////////////////
						// Line clear
						/////////////////////////////////////////
					case 'K':
						consoleClearLine(escapeseq[escapelen-2]);
						escaping = false;
						break;
						/////////////////////////////////////////
						// Save cursor position
						/////////////////////////////////////////
					case 's':
						currentConsole->prevCursorX  = currentConsole->cursorX ;
						currentConsole->prevCursorY  = currentConsole->cursorY ;
						escaping = false;
						break;
						/////////////////////////////////////////
						// Load cursor position
						/////////////////////////////////////////
					case 'u':
						currentConsole->cursorX  = currentConsole->prevCursorX ;
						currentConsole->cursorY  = currentConsole->prevCursorY ;
						escaping = false;
						break;
						/////////////////////////////////////////
						// Color scan codes
						/////////////////////////////////////////
					case 'm':
						siscanf(escapeseq,"[%d;%dm", &parameter, &intensity);

						//only handle 30-37,39 and intensity for the color changes
						parameter -= 30; 

						//39 is the reset code
						if(parameter == 9){
							parameter = 15;
						}
						else if(parameter > 8){ 
							parameter -= 2;
						}
						else if(intensity){
							parameter += 8;
						}
						if(parameter < 16 && parameter >= 0){
							currentConsole->fontCurPal = parameter << 12;
						}

						escaping = false;
						break;
				}
			} while (escaping);
			continue;
		}

		consolePrintChar(chr);
	}

	return count;
}
//---------------------------------------------------------------------------------
int con_write(struct _reent *r,int fd,const char *ptr,int len) {
//---------------------------------------------------------------------------------

	if (!consoleInitialised) return -1;

	char chr;

	int i, count = 0;
	char *tmp = (char*)ptr;

	if(!tmp || len<=0) return -1;

	i = 0;
	while(*tmp!='\0' && i<len) {

		chr = *(tmp++);
		i++; count++;

		if ( chr == 0x1b && *tmp == '[' ) {
			bool escaping = true;
			char *escapeseq	= tmp;
			int escapelen = 0;

			do {
				chr = *(tmp++);
				i++; count++; escapelen++;
				int parameter;

				switch (chr) {
					/////////////////////////////////////////
					// Cursor directional movement
					/////////////////////////////////////////
					case 'A':
						siscanf(escapeseq,"[%dA", &parameter);
						row =  (row - parameter) < 0 ? 0 : row - parameter;
						escaping = false;
						break;
					case 'B':
						siscanf(escapeseq,"[%dB", &parameter);
						row =  (row + parameter) > CONSOLE_HEIGHT - 1 ? CONSOLE_HEIGHT - 1 : row + parameter;
						escaping = false;
						break;
					case 'C':
						siscanf(escapeseq,"[%dC", &parameter);
						col =  (col + parameter) > CONSOLE_WIDTH - 1 ? CONSOLE_WIDTH - 1 : col + parameter;
						escaping = false;
						break;
					case 'D':
						siscanf(escapeseq,"[%dC", &parameter);
						col =  (col - parameter) < 0 ? 0 : col - parameter;
						escaping = false;
						break;
					/////////////////////////////////////////
					// Cursor position movement
					/////////////////////////////////////////
					case 'H':
					case 'f':
						siscanf(escapeseq,"[%d;%df", &row, &col);
						escaping = false;
						break;
					/////////////////////////////////////////
					// Screen clear
					/////////////////////////////////////////
					case 'J':
						consoleCls(escapeseq[escapelen-2]);
						escaping = false;
						break;
					/////////////////////////////////////////
					// Line clear
					/////////////////////////////////////////
					case 'K':
						consoleClearLine(escapeseq[escapelen-2]);
						escaping = false;
						break;
					/////////////////////////////////////////
					// Save cursor position
					/////////////////////////////////////////
					case 's':
						savedX = col;
						savedY = row;
						escaping = false;
						break;
					/////////////////////////////////////////
					// Load cursor position
					/////////////////////////////////////////
					case 'u':
						col = savedX;
						row = savedY;
						escaping = false;
						break;
				}
			} while (escaping);
		continue;
		}

		consolePrintChar(chr);
	}

	return count;
}
Exemple #5
0
//---------------------------------------------------------------------------------
ssize_t con_write(struct _reent *r,void *fileStruct ,const char *ptr,size_t len) {
//---------------------------------------------------------------------------------
	char chr;

	if (!consoleInitialised) return -1;

	int i, count = 0;
	char *tmp = (char*)ptr;

	if(!tmp || len<=0) return -1;

	i = 0;
	while(*tmp!='\0' && i<len) {

		chr = *(tmp++);
		i++; count++;

		if ( chr == 0x1b && *tmp == '[' ) {
			bool escaping = true;
			char *escapeseq	= tmp;
			int escapelen = 0;

			do {
				chr = *(tmp++);
				i++; count++; escapelen++;
				int parameter;
				switch (chr) {
					case 'H':
						siscanf(escapeseq,"[%d;%dH", &consoleY, &consoleX);
						escaping = false;
						break;
					case 'f':
						siscanf(escapeseq,"[%d;%df", &consoleY, &consoleX);
						escaping = false;
						break;
					case 'A':
						siscanf(escapeseq,"[%dA", &parameter);
						consoleY =  (consoleY - parameter) < 0 ? 0 : consoleY - parameter;
						escaping = false;
						break;
					case 'B':
						siscanf(escapeseq,"[%dB", &parameter);
						consoleY =  (consoleY + parameter) > CONSOLE_HEIGHT - 1 ? CONSOLE_HEIGHT - 1 : consoleY + parameter;
						escaping = false;
						break;
					case 'C':
						siscanf(escapeseq,"[%dC", &parameter);
						consoleX =  (consoleX + parameter) > CONSOLE_WIDTH - 1 ? CONSOLE_WIDTH - 1 : consoleX + parameter;
						escaping = false;
						break;
					case 'D':
						siscanf(escapeseq,"[%dC", &parameter);
						consoleX =  (consoleX - parameter) < 0 ? 0 : consoleX - parameter;
						escaping = false;
						break;
					case 'K':
						escaping = false;
						break;
					case 's':
						savedX = consoleX;
						savedY = consoleY;
						escaping = false;
						break;
					case 'u':
						consoleX = savedX;
						consoleY = savedY;
						escaping = false;
						break;
					case 'J':
						if ( escapeseq[escapelen-2] == '2') {
							consoleCls();
							consoleX = 0;
							consoleY = 0;
						}
						escaping = false;
					break;
				}
			} while (escaping);
		continue;
		}

		consolePrintChar(chr);
	}

	return count;
}