Working backdoor filesystem implementation.
[pintos-anon] / src / lib / backdoor.c
1 #include "backdoor.h"
2 #include <stdbool.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 void
7 backdoor_put_int32 (int32_t value,
8                     void (*out) (uint8_t, void *aux), void *aux)
9 {
10   out ((value >> 24) & 0xff, aux);
11   out ((value >> 16) & 0xff, aux);
12   out ((value >> 8) & 0xff, aux);
13   out (value & 0xff, aux);
14 }
15
16 void
17 backdoor_put_uint32 (uint32_t value,
18                      void (*out) (uint8_t, void *aux), void *aux)
19 {
20   out ((value >> 24) & 0xff, aux);
21   out ((value >> 16) & 0xff, aux);
22   out ((value >> 8) & 0xff, aux);
23   out (value & 0xff, aux);
24 }
25
26 void
27 backdoor_put_bytes (const void *buffer, size_t cnt,
28                     void (*out) (uint8_t, void *aux), void *aux) 
29 {
30   const uint8_t *p = buffer;
31   size_t i;
32
33   for (i = 0; i < cnt; i++)
34     out (p[i], aux);
35 }
36
37 void
38 backdoor_put_string (const char *string,
39                      void (*out) (uint8_t, void *aux), void *aux) 
40 {
41   size_t length = strlen (string);
42
43   backdoor_put_uint32 (length, out, aux);
44   backdoor_put_bytes (string, length, out, aux);
45 }
46
47 void
48 backdoor_put_bool (bool b,
49                    void (*out) (uint8_t, void *aux), void *aux) 
50 {
51   backdoor_put_uint32 (b, out, aux);
52 }
53
54 int32_t
55 backdoor_get_int32 (uint8_t (*in) (void *aux), void *aux) 
56 {
57   int32_t value;
58   int i;
59
60   value = 0;
61   for (i = 0; i < 4; i++)
62     value = (value << 8) | in (aux);
63   return value;
64 }
65
66 uint32_t
67 backdoor_get_uint32 (uint8_t (*in) (void *aux), void *aux) 
68 {
69   return backdoor_get_int32 (in, aux);
70 }
71
72 char *
73 backdoor_get_string (uint8_t (*in) (void *aux), void *aux) 
74 {
75   size_t length = backdoor_get_uint32 (in, aux);
76   char *string = malloc (length + 1);
77   backdoor_get_bytes (string, length, in, aux);
78   string[length] = '\0';
79   return string;
80 }
81
82 void
83 backdoor_get_bytes (void *buffer, size_t cnt,
84                     uint8_t (*in) (void *aux), void *aux)
85 {
86   uint8_t *p = buffer;
87   size_t i;
88
89   for (i = 0; i < cnt; i++)
90     p[i] = in (aux);
91 }
92
93 bool
94 backdoor_get_bool (uint8_t (*in) (void *aux), void *aux) 
95 {
96   return backdoor_get_uint32 (in, aux) != 0;
97 }