X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flib%2Fbackdoor.c;h=efb1b4c39fcd481c62db6ce34c64ef62547571d5;hb=3fc16f6e9abc98a3bd5427eb210669860609a224;hp=ac90f3c8fe9ed9602d8688031c46a7986179f676;hpb=8256dc4ff8f7c0a1f76c2d3a601b92d67aa8acfe;p=pintos-anon diff --git a/src/lib/backdoor.c b/src/lib/backdoor.c index ac90f3c..efb1b4c 100644 --- a/src/lib/backdoor.c +++ b/src/lib/backdoor.c @@ -3,8 +3,9 @@ #include #include -static void -marshal_int32 (int32_t value, void (*out) (uint8_t, void *aux), void *aux) +void +backdoor_put_int32 (int32_t value, + void (*out) (uint8_t, void *aux), void *aux) { out ((value >> 24) & 0xff, aux); out ((value >> 16) & 0xff, aux); @@ -12,9 +13,19 @@ marshal_int32 (int32_t value, void (*out) (uint8_t, void *aux), void *aux) out (value & 0xff, aux); } -static void -marshal_bytes (const void *buffer, size_t cnt, - void (*out) (uint8_t, void *aux), void *aux) +void +backdoor_put_uint32 (uint32_t value, + void (*out) (uint8_t, void *aux), void *aux) +{ + out ((value >> 24) & 0xff, aux); + out ((value >> 16) & 0xff, aux); + out ((value >> 8) & 0xff, aux); + out (value & 0xff, aux); +} + +void +backdoor_put_bytes (const void *buffer, size_t cnt, + void (*out) (uint8_t, void *aux), void *aux) { const uint8_t *p = buffer; size_t i; @@ -23,196 +34,64 @@ marshal_bytes (const void *buffer, size_t cnt, out (p[i], aux); } -enum backdoor_error -backdoor_vmarshal (const char *types, va_list args, - void (*out) (uint8_t, void *aux), void *aux) +void +backdoor_put_string (const char *string, + void (*out) (uint8_t, void *aux), void *aux) { - const char *p = types; - - for (;;) - { - /* Find next type character. */ - while (*p == ' ') - p++; - if (*p == '\0') - return BACKDOOR_OK; - - out (*p, aux); - switch (*p++) - { - case 's': - if (*p == '\'') - { - const char *end = strchr (++p, '\''); - marshal_int32 (end - p, out, aux); - marshal_bytes (p, end - p, out, aux); - p = end + 1; - } - else - { - const char *s = va_arg (args, const char *); - marshal_int32 (strlen (s), out, aux); - marshal_bytes (s, strlen (s), out, aux); - } - break; - - case 'i': - marshal_int32 (va_arg (args, int32_t), out, aux); - break; - - case 'B': - { - const void *buffer = va_arg (args, const void *); - size_t size = va_arg (args, size_t); - marshal_int32 (size, out, aux); - marshal_bytes (buffer, size, out, aux); - } - break; + size_t length = strlen (string); - case 'b': - marshal_int32 (va_arg (args, int), out, aux); - break; + backdoor_put_uint32 (length, out, aux); + backdoor_put_bytes (string, length, out, aux); +} - default: - return BACKDOOR_BAD_TYPE; - } - } +void +backdoor_put_bool (bool b, + void (*out) (uint8_t, void *aux), void *aux) +{ + backdoor_put_uint32 (b, out, aux); } -static bool -unmarshal_int32 (int32_t *value, - bool (*in) (uint8_t *, void *aux), void *aux) +int32_t +backdoor_get_int32 (uint8_t (*in) (void *aux), void *aux) { - int32_t tmp; + int32_t value; int i; - tmp = 0; - for (i = 0; i < 4; i++) - { - uint8_t b; - if (!in (&b, aux)) - return false; + value = 0; + for (i = 0; i < 4; i++) + value = (value << 8) | in (aux); + return value; +} - tmp = (tmp << 8) | b; - } - *value = tmp; - return true; +uint32_t +backdoor_get_uint32 (uint8_t (*in) (void *aux), void *aux) +{ + return backdoor_get_int32 (in, aux); } -static bool -unmarshal_bytes (void *buffer, size_t cnt, - bool (*in) (uint8_t *, void *aux), void *aux) +char * +backdoor_get_string (uint8_t (*in) (void *aux), void *aux) +{ + size_t length = backdoor_get_uint32 (in, aux); + char *string = malloc (length + 1); + backdoor_get_bytes (string, length, in, aux); + string[length] = '\0'; + return string; +} + +void +backdoor_get_bytes (void *buffer, size_t cnt, + uint8_t (*in) (void *aux), void *aux) { uint8_t *p = buffer; size_t i; - for (i = 0; i < cnt; i++) - if (!in (&p[i], aux)) - return false; - return true; + for (i = 0; i < cnt; i++) + p[i] = in (aux); } -enum backdoor_error -backdoor_vunmarshal (const char *types, va_list args, - bool (*in) (uint8_t *, void *aux), void *aux) +bool +backdoor_get_bool (uint8_t (*in) (void *aux), void *aux) { - const char *p = types; - - for (;;) - { - uint8_t c; - - /* Find next type character. */ - while (*p == ' ') - p++; - if (*p == '\0') - return BACKDOOR_OK; - - /* Check type character in input. */ - if (!in (&c, aux)) - return BACKDOOR_UNEXPECTED_EOF; - if (c != *p++) - return BACKDOOR_TYPE_MISMATCH; - - switch (c) - { - case 's': - { - int32_t length; - - if (!unmarshal_int32 (&length, in, aux)) - return BACKDOOR_UNEXPECTED_EOF; - if (length < 0) - return BACKDOOR_NEGATIVE_SIZE; - if (*p == '\'') - { - const char *end = strchr (++p, '\''); - if (length != end - p) - return BACKDOOR_STRING_MISMATCH; - while (p < end) - { - uint8_t q; - if (!in (&q, aux)) - return BACKDOOR_UNEXPECTED_EOF; - if (q != *p++) - return BACKDOOR_STRING_MISMATCH; - } - p++; - } - else - { - char *s = malloc (length + 1); - if (s == NULL) - return BACKDOOR_NOMEM; - if (!unmarshal_bytes (s, length, in, aux)) - { - free (s); - return BACKDOOR_UNEXPECTED_EOF; - } - s[length] = '\0'; - *va_arg (args, char **) = s; - } - } - break; - - case 'i': - if (!unmarshal_int32 (va_arg (args, int32_t *), in, aux)) - return BACKDOOR_UNEXPECTED_EOF; - break; - - case 'B': - { - int32_t size; - void *buffer; - - if (!unmarshal_int32 (&size, in, aux)) - return BACKDOOR_UNEXPECTED_EOF; - if (size < 0) - return BACKDOOR_NEGATIVE_SIZE; - buffer = malloc (size); - if (size > 0 && buffer == NULL) - return BACKDOOR_NOMEM; - if (!unmarshal_bytes (buffer, size, in, aux)) - { - free (buffer); - return BACKDOOR_UNEXPECTED_EOF; - } - *va_arg (args, size_t *) = size; - *va_arg (args, void **) = buffer; - } - break; - - case 'b': - { - int32_t b; - if (!unmarshal_int32 (&b, in, aux)) - return BACKDOOR_UNEXPECTED_EOF; - *va_arg (args, bool *) = b; - } - break; - - default: - return BACKDOOR_BAD_TYPE; - } - } + return backdoor_get_uint32 (in, aux) != 0; }