From 4173b5448cf4c3b945fe8dd40d5186870b787f71 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 27 Jan 2013 22:45:10 +0000 Subject: filling unused key slots with 0xff reading infinite number of bytes after update git-svn-id: https://svn.spreadspace.org/avr/trunk@76 aa12f405-d877-488e-9caf-2d797e2a1cc7 --- usb-i2c-sl018/update-keys.c | 60 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 11 deletions(-) (limited to 'usb-i2c-sl018') diff --git a/usb-i2c-sl018/update-keys.c b/usb-i2c-sl018/update-keys.c index dc082ed..5b80c97 100644 --- a/usb-i2c-sl018/update-keys.c +++ b/usb-i2c-sl018/update-keys.c @@ -20,24 +20,46 @@ * along with spreadspace avr utils. If not, see . */ +#include #include #include -#define MAX_KEY_LEN 7 +#define KEY_LEN_MAX 7 +#define MAX_KEYS 128 -char generate_csum(char* key) +char generate_csum(char* data) { - return 0xFF; + uint16_t sum1 = 0xf, sum2 = 0xf, len = KEY_LEN_MAX; + do { sum2 += ( sum1 += *data++ ); } while (--len); + return sum2<<4 | sum1; } int main(int argc, char* argv[]) { + if(argc<2) { + fprintf(stderr, "Usage: update-keys \n"); + return -1; + } + + FILE* dev; + dev = fopen(argv[1], "r+"); + if(!dev) { + fprintf(stderr, "fopen failed!\n"); + return -2; + } + + fprintf(dev, "e"); + char* line = NULL; size_t len = 0; + int line_num = 0; + uint8_t key[KEY_LEN_MAX+1]; + int key_num = 0; for(;;) { ssize_t ret = getline(&line, &len, stdin); - if(ret <= 0) return 0; + if(ret <= 0) break; + line_num++; int i; for(i=0; i MAX_KEY_LEN*2) { - fprintf(stderr, "ignoring invalid key (odd number of digits or empty string or too long): %s\n", line); + if(i & 1 || i == 0 || i > KEY_LEN_MAX*2) { + fprintf(stderr, "ignoring invalid key (odd number of digits or empty string or too long) at line %d\n", line_num); continue; } - char key[MAX_KEY_LEN+1]; + uint8_t tmp[3]; int j; - char tmp[3]; tmp[2] = 0; for(j = 0; j<(i/2); ++j) { tmp[0] = line[j*2]; tmp[1] = line[j*2 + 1]; key[j] = (char)strtoul(tmp, NULL, 16); } - for(j=i/2; j < MAX_KEY_LEN; ++j) { + for(j=i/2; j < KEY_LEN_MAX; ++j) { key[j] = 0; } - key[MAX_KEY_LEN] = generate_csum(key); - ret = fwrite(key, MAX_KEY_LEN+1, 1, stdout); + key[KEY_LEN_MAX] = generate_csum(key); + fwrite(key, KEY_LEN_MAX+1, 1, dev); + key_num++; + if(key_num > MAX_KEYS) { + fprintf(stderr, "reached maximum number of key slots (%d), will ignore remaining keys\n", MAX_KEYS); + break; + } + } + + printf("read %d keys from STDIN\n", key_num); + + int i; + for(i=0; i<=KEY_LEN_MAX; ++i) key[i] = 0xFF; + for(i=key_num; i < MAX_KEYS; ++i) + fwrite(key, KEY_LEN_MAX+1, 1, dev); + + char tmp; + while(fread(&tmp, 1, 1, dev)) { + fwrite(&tmp, 1, 1, dev); } return 0; -- cgit v1.2.3