header.c (1858B)
1 #include <skalibs/strerr.h> 2 3 #include "netstring.h" 4 #include "header.h" 5 6 miniroon_error set_header_version(miniroon_header *header, const bytebuffer source) { 7 if(strbbcmp(source, "capv0") == 0) { 8 header->version = V0; 9 } else { 10 return miniroon_err1(MINIROON_EHDR_INV_VERSION, "Unhandled miniroon version"); 11 } 12 return MINIROON_OK; 13 } 14 15 miniroon_error set_header_action(miniroon_header *header, const bytebuffer source) { 16 if(strbbcmp(source, "revoke") == 0) { 17 header->action = REVOKE; 18 } else if(strbbcmp(source, "invoke") == 0) { 19 header->action = INVOKE; 20 } else if(strbbcmp(source, "invoke-once") == 0) { 21 header->action = INVOKE_ONCE; 22 } else { 23 return miniroon_err1(MINIROON_EHDR_INV_ACTION, "Unhandled miniroon action"); 24 } 25 return MINIROON_OK; 26 } 27 28 miniroon_error parse_header(miniroon_header *header, const bytebuffer source) { 29 dbg_print_bb1("Got header", source); 30 netstring_chunk c; 31 netstring_chunk_init(&c, source); 32 33 if(!netstring_chunk_next(&c)) { 34 return miniroon_err1(MINIROON_EHDR_NO_VERSION, "Mising version in miniroon header"); 35 } 36 dbg_print_bb1("Header > Version", c.inner); 37 if(set_header_version(header, c.inner) != MINIROON_OK) { 38 return miniroon_current_error; 39 } 40 41 if(!netstring_chunk_next(&c)) { 42 return miniroon_err1(MINIROON_EHDR_NO_ID, "Mising ID in miniroon header"); 43 } 44 dbg_print_bb1("Header > ID", c.inner); 45 header->id = c.inner; 46 47 if(!netstring_chunk_next(&c)) { 48 return miniroon_err1(MINIROON_EHDR_NO_ACTION, "Mising action in miniroon header"); 49 } 50 dbg_print_bb1("Header > Action", c.inner); 51 if(set_header_action(header, c.inner) != MINIROON_OK) { 52 return miniroon_current_error; 53 } 54 55 if(netstring_chunk_next(&c)) { 56 return miniroon_err1(MINIROON_EHDR_EXTRA, "Extraneous data in miniroon header"); 57 } 58 59 return MINIROON_OK; 60 } 61 62 /* vim: sts=2 sw=2 et 63 */