diff options
Diffstat (limited to 'lib/libRTV/httpfsclient.c')
-rw-r--r-- | lib/libRTV/httpfsclient.c | 401 |
1 files changed, 0 insertions, 401 deletions
diff --git a/lib/libRTV/httpfsclient.c b/lib/libRTV/httpfsclient.c deleted file mode 100644 index c53ad6a9b1..0000000000 --- a/lib/libRTV/httpfsclient.c +++ /dev/null @@ -1,401 +0,0 @@ -#ifndef __GNUC__ -#pragma code_seg( "RTV_TEXT" ) -#pragma data_seg( "RTV_DATA" ) -#pragma bss_seg( "RTV_BSS" ) -#pragma const_seg( "RTV_RD" ) -#endif - -/* - * Copyright (C) 2002 John Todd Larason <jtl@molehill.org> - * - * Parts based on ReplayPC 0.3 by Matthew T. Linehan and others - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "httpfsclient.h" -#include "sleep.h" -#include "crypt.h" - -#include <stdarg.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> - -int hfs_output_errors = 1; - -#define ARGBUFSIZE 2048 -static int make_httpfs_url(char * dst, size_t size, - const char * address, const char * command, - va_list args) -{ - char * d, * tag, * value, *argp; - int argno = 0; - size_t l, argl; - char argbuf[ARGBUFSIZE]; /* XXX bad, should fix this */ - - (void) size; - - l = strlen(address) + strlen(command) + strlen("http:///httpfs-?"); - if (l >= size) { - //if (hfs_output_errors) - //fprintf(stderr, "Error: make_httpfs_url: address + command too long for buffer\n"); - return -1; - } - - d = dst; - d += sprintf(d, "http://%s/httpfs-%s?", address, command); - - argp = argbuf; - argl = 0; - while ((tag = va_arg(args, char *)) != NULL) { - value = va_arg(args, char *); - if (value == NULL) { - continue; - } - if (argno) - argl++; - argl += strlen(tag)+1+strlen(value); - if (argl >= sizeof(argbuf)) { - //if (hfs_output_errors) - //fprintf(stderr, "Error: make_httpfs_url: with arg %s, argbuf too small\n", tag); - return -1; - } - if (argno) - *argp++ = '&'; - argp += sprintf(argp, "%s=%s", tag, value); - argno++; - } - - if (replaytv_version.major >= 5 || - (replaytv_version.major == 4 && replaytv_version.minor >= 3)) { - unsigned char ctext[ARGBUFSIZE+32] ; - u32 ctextlen; - unsigned int i; - - if (l + strlen("__Q_=") + 2*argl + 32 >= size) { - //if (hfs_output_errors) - // fprintf(stderr, "Error: make_httpfs_url: encrypted args too large for buffer\n"); - return -1; - } - - strcpy(d, "__Q_="); - d += strlen(d); - rtv_encrypt(argbuf, argl, (char*)ctext, sizeof ctext, &ctextlen, 1); - for (i = 0; i < ctextlen; i++) - d += sprintf(d, "%02x", ctext[i]); - } else { - if (l + argl >= size) { - //if (hfs_output_errors) - //fprintf(stderr, "Error: make_httpfs_url: args too large for buffer\n"); - return -1; - } - strcpy(d, argbuf); - } - - return 0; -} - -static int add_httpfs_headers(struct hc * hc) -{ - hc_add_req_header(hc, "Authorization", "Basic Uk5TQmFzaWM6QTd4KjgtUXQ=" ); - hc_add_req_header(hc, "User-Agent", "Replay-HTTPFS/1"); - hc_add_req_header(hc, "Accept-Encoding", "text/plain"); - - return 0; -} - -static struct hc * make_request(const char * address, const char * command, - va_list ap) -{ - struct hc * hc = NULL; - char url[URLSIZE]; - int http_status; - - if (make_httpfs_url(url, sizeof url, address, command, ap) < 0) - goto exit; - - hc = hc_start_request(url); - if (!hc) { - if (hfs_output_errors) - perror("Error: make_request(): hc_start_request()"); - if (errno == 0) { -// fprintf(stderr, "Check your clock.\n" - // "The system clock must be within 40 seconds of the Replay's."); - } - goto exit; - } - - if (add_httpfs_headers(hc)) { - goto exit; - } - - hc_send_request(hc); - - http_status = hc_get_status(hc); - if (http_status/100 != 2) { - //if (hfs_output_errors) - //fprintf(stderr, "Error: http status %d\n", http_status); - goto exit; - } - - return hc; - -exit: - if (hc) - hc_free(hc); - return NULL; -} - - -unsigned long hfs_do_simple(char ** presult, const char * address, - const char * command, ...) -{ - va_list ap; - struct hc * hc; - char * tmp, * e; - int http_status; - unsigned long rtv_status; - - va_start(ap, command); - hc = make_request(address, command, ap); - va_end(ap); - - if (!hc) - return -1; - - http_status = hc_get_status(hc); - if (http_status/100 != 2) { - //if (hfs_output_errors) - // fprintf(stderr, "Error: http status %d\n", http_status); - hc_free(hc); - return http_status; - } - - tmp = (char*)hc_read_all(hc); - hc_free(hc); - - e = strchr(tmp, '\n'); - if (e) { - *presult = strdup(e+1); - rtv_status = strtoul(tmp, NULL, 10); - free(tmp); - return rtv_status; - } else if (http_status == 204) { - *presult = NULL; - free(tmp); - return 0; - } else { - //if (hfs_output_errors) - // fprintf(stderr, "Error: end of httpfs status line not found\n"); - return -1; - } -} - -struct hfs_data -{ - void (*fn)(unsigned char *, size_t, void *); - void * v; - unsigned long status; - u16 msec_delay; - u8 firsttime; - char * buffer; - size_t bufLen; -}; - -/* XXX should this free the buf, or make a new one on the first block - * and let our caller free them if it wants? */ -static void hfs_callback(unsigned char * buf, size_t len, void * vd) -{ - struct hfs_data * data = vd; - unsigned char * buf_data_start; - - if (data->firsttime) { - unsigned char * e; - - data->firsttime = 0; - - /* First line: error code */ - e = (unsigned char*)strchr((char*)buf, '\n'); - if (e) - *e = '\0'; - data->status = strtoul((char*)buf, NULL, 16); - - e++; - len -= (e - buf); - buf_data_start = e; - } else { - buf_data_start = buf; - } - - data->fn(buf_data_start, len, data->v); - free(buf); - - if (data->msec_delay) - rtv_sleep(data->msec_delay); -} - -unsigned long hfs_do_chunked(void (*fn)(unsigned char *, size_t, void *), - void *v, - const char * address, - u16 msec_delay, - const char * command, - ...) -{ - struct hfs_data data; - struct hc * hc; - va_list ap; - - va_start(ap, command); - hc = make_request(address, command, ap); - va_end(ap); - - if (!hc) - return -1; - - memset(&data, 0, sizeof data); - data.fn = fn; - data.v = v; - data.firsttime = 1; - data.msec_delay = msec_delay; - - hc_read_pieces(hc, hfs_callback, &data); - hc_free(hc); - - return data.status; -} - -unsigned long hfs_do_post_simple(char ** presult, const char * address, - int (*fn)(unsigned char *, size_t, void *), - void *v, - unsigned long size, - const char * command, ...) -{ - char buf[URLSIZE]; - va_list ap; - struct hc * hc; - char * tmp, * e; - int http_status; - unsigned long rtv_status; - - va_start(ap, command); - if (make_httpfs_url(buf, sizeof buf, address, command, ap) < 0) - return -1; - va_end(ap); - - errno = 0; - hc = hc_start_request(buf); - if (!hc) { - if (hfs_output_errors) - perror("Error: hfs_do_simple(): hc_start_request()"); - if (errno == 0) { - //fprintf(stderr, "Check your clock.\n" - // "The system clock must be within 40 seconds of the Replay's."); - } - return -1; - } - sprintf(buf, "%lu", size); - if (add_httpfs_headers(hc) != 0) - return -1; - - hc_add_req_header(hc, "Content-Length", buf); - - hc_post_request(hc, fn, v); - - http_status = hc_get_status(hc); - if (http_status/100 != 2) { - //if (hfs_output_errors) - // fprintf(stderr, "Error: http status %d\n", http_status); - hc_free(hc); - return http_status; - } - - tmp = (char*)hc_read_all(hc); - hc_free(hc); - - e = strchr(tmp, '\n'); - if (e) { - *presult = strdup(e+1); - rtv_status = strtoul(tmp, NULL, 10); - free(tmp); - return rtv_status; - } else if (http_status == 204) { - *presult = NULL; - free(tmp); - return 0; - } else { - //if (hfs_output_errors) - //fprintf(stderr, "Error: end of httpfs status line not found\n"); - return -1; - } -} - - -static void hfs_callback2(unsigned char * buf, size_t len, void * vd) -{ - struct hfs_data * data = vd; - unsigned char * buf_data_start; - - if (data->firsttime) { - unsigned char * e; - - data->firsttime = 0; - - /* First line: error code */ - e = (unsigned char*)strchr((char*)buf, '\n'); - if (e) - *e = '\0'; - data->status = strtoul((char*)buf, NULL, 16); - - e++; - len -= (e - buf); - buf_data_start = e; - } else { - buf_data_start = buf; - } - - /* append to buffer, this may be called multiple times */ - memcpy(data->buffer+data->bufLen, buf_data_start, len); - data->bufLen += len; - free(buf); -} - -struct hc * hfs_do_chunked_open(const char * address, const char * command, ...) -{ - struct hc * hc; - va_list ap; - - va_start(ap, command); - hc = make_request(address, command, ap); - va_end(ap); - - return hc; -} - -size_t hfs_do_chunked_read(struct hc * hc, char * buf, size_t pos, size_t len) -{ - struct hfs_data data; - - memset(&data, 0, sizeof data); - data.buffer = buf; - if (!pos) - data.firsttime = 1; - - hc_read_pieces_len(hc, hfs_callback2, &data, len); - - return data.bufLen; -} - -void hfs_do_chunked_close(struct hc * hc) -{ - hc_free(hc); -} - |