#include #include #include #include #include #define BUFF_SIZE 4096 /* Converts a hex character to its integer value */ char from_hex(char ch) { return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10; } /* Converts an integer value to its hex character*/ char to_hex(char code) { static char hex[] = "0123456789abcdef"; return hex[code & 15]; } /* Returns a url-encoded version of str */ /* IMPORTANT: be sure to free() the returned string after use */ char *url_encode(char *str) { char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf; while (*pstr) { if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') *pbuf++ = *pstr; /* else if (*pstr == ' ') *pbuf++ = '+'; */ else *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15); pstr++; } *pbuf = '\0'; return buf; } /* Returns a url-decoded version of str */ /* IMPORTANT: be sure to free() the returned string after use */ char *url_decode(char *str) { char *pstr = str, *buf = malloc(strlen(str) + 1), *pbuf = buf; while (*pstr) { if (*pstr == '%') { if (pstr[1] && pstr[2]) { *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]); pstr += 2; } } else if (*pstr == '+') { *pbuf++ = ' '; } else { *pbuf++ = *pstr; } pstr++; } *pbuf = '\0'; return buf; } int main (void) { regex_t regexnm, regexgn, regexmi, regexbr, regexrn; unsigned char buffer[BUFF_SIZE]; unsigned char line[256]; unsigned char *meta[2]; unsigned char icyok = 0; int count, done = 0; int reti, br, metaint = 0; int i, m, n; int bsize; char *cp, *urlenc; char tmpstr[512]; reti = regcomp(®exnm, "^icy-name", 0); reti = regcomp(®exgn, "^icy-genre", 0); reti = regcomp(®exmi, "^icy-metaint", 0); reti = regcomp(®exbr, "^icy-br", 0); reti = regcomp(®exrn, "^\r\n$", 0); cp = fgets(line, 256, stdin); while (cp != NULL && !done) { reti = regexec(®exnm, line, 0, NULL, 0); if (!reti) { //fputs(line, stderr); meta[0] = strtok(line, ":"); meta[1] = strtok(NULL, "\r"); fprintf(stderr, "name=%s\n", meta[1]); urlenc = url_encode(meta[1]); sprintf(tmpstr, "curl -s -u root:arduino http://localhost/arduino/name/%c%s%c", '"', urlenc, '"'); system((char *)tmpstr); //fprintf(stderr, "curl=%s\n", tmpstr); free(urlenc); } reti = regexec(®exgn, line, 0, NULL, 0); if (!reti) { //fputs(line, stderr); meta[0] = strtok(line, ":"); meta[1] = strtok(NULL, "\r"); fprintf(stderr, "genre=%s\n", meta[1]); urlenc = url_encode(meta[1]); sprintf(tmpstr, "curl -s -u root:arduino http://localhost/arduino/genre/%c%s%c", '"', urlenc, '"'); system((char *)tmpstr); //fprintf(stderr, "curl=%s\n", tmpstr); free(urlenc); } reti = regexec(®exmi, line, 0, NULL, 0); if (!reti) { //fputs(line, stderr); meta[0] = strtok(line, ":"); meta[1] = strtok(NULL, "\r"); metaint = atoi(meta[1]); fprintf(stderr, "metaint=%i\n", metaint); } reti = regexec(®exbr, line, 0, NULL, 0); if (!reti) { //fputs(line, stderr); meta[0] = strtok(line, ":"); meta[1] = strtok(NULL, "\r"); br = atoi(meta[1]); fprintf(stderr, "br=%i\n", br); } reti = regexec(®exrn, line, 0, NULL, 0); if (!reti) { done = 1; fputs("\n", stderr); } if (!done) { cp = fgets(line, 256, stdin); } } if (metaint == 0) { n = 4; } else if (metaint > 0) { bsize = BUFF_SIZE; if ((metaint % bsize) != 0) { bsize = 4000; while ((metaint % bsize) != 0) { bsize -= 1000; if (bsize == 0) { fprintf(stderr, "Error: metaint is not multiple of bsize\n"); return 1; } } } n = metaint / bsize; } else { fprintf(stderr, "Error: metainf less then 0\n"); } fprintf(stderr, "bsize=%i\n", bsize); while (!feof(stdin)) { for (i = 0; i < n; i++) { count = fread(buffer, 1, bsize, stdin); fwrite(buffer, 1, count, stdout); } if (metaint > 0) { count = fread(buffer, 1, 1, stdin); m = buffer[0]; if (m != 0) { count = fread(buffer, 1, m * 16, stdin); //fwrite(buffer, 1, m * 16, stderr); //fputs("\n", stderr); meta[0] = strtok(buffer, "'"); meta[1] = strtok(NULL, "'"); fputs("StreamTitle=", stderr); fputs(meta[1], stderr); fputs("\n", stderr); urlenc = url_encode(meta[1]); sprintf(tmpstr, "curl -s -u root:arduino http://localhost/arduino/title/%c%s%c", '"', urlenc, '"'); system((char *)tmpstr); //fprintf(stderr, "curl=%s\n", tmpstr); free(urlenc); } } } return 0; }