1 /*
2 ** objects.c for elfsh
3 **
4 ** Started on Mon Feb 24 12:21:12 2003 mayhem
5 ** Last update Wed Apr 16 19:45:16 2003 mayhem
6 */
7 #include "elfsh.h"
8
9
10
11
12 /* Now comes Level 1 objects hash functions */
vm_create_L1ENT(void * get_obj,void * get_obj_idx,void * get_obj_nam,hash_t * l2_hash,void * get_entptr,void * get_entval,void * set_entval,u_int elem_size)13 elfshL1_t *vm_create_L1ENT(void *get_obj,
14 void *get_obj_idx,
15 void *get_obj_nam,
16 hash_t *l2_hash,
17 void *get_entptr,
18 void *get_entval,
19 void *set_entval,
20 u_int elem_size)
21 {
22 elfshL1_t *new;
23
24 XALLOC(new, sizeof (elfshL1_t), NULL);
25 new->get_obj = get_obj;
26 new->get_obj_idx = get_obj_idx;
27 new->get_obj_nam = get_obj_nam;
28 new->get_entptr = get_entptr;
29 new->get_entval = get_entval;
30 new->set_entval = set_entval;
31 new->l2list = l2_hash;
32 new->elem_size = elem_size;
33 return (new);
34 }
35
36
37 /* Now comes Level 2 objects hash functions */
vm_create_L2ENT(void * get_obj,void * set_obj,char type,void * get_name,void * set_name,void * get_data,void * set_data)38 elfshL2_t *vm_create_L2ENT(void *get_obj,
39 void *set_obj,
40 char type,
41 void *get_name,
42 void *set_name,
43 void *get_data,
44 void *set_data)
45 {
46 elfshL2_t *new;
47
48 XALLOC(new, sizeof (elfshL1_t), NULL);
49 new->get_obj = get_obj;
50 new->set_obj = set_obj;
51 new->get_name = get_name;
52 new->set_name = set_name;
53 new->type = type;
54 new->get_data = get_data;
55 new->set_data = set_data;
56 return (new);
57 }
58
59
60 /* Convert an elfshpath_t object in a different typed one */
vm_convert_object(elfshpath_t * obj,u_int objtype)61 int vm_convert_object(elfshpath_t *obj, u_int objtype)
62 {
63 u_long val;
64
65 if (obj->type != ELFSH_OBJINT || objtype != ELFSH_OBJSTR)
66 ELFSH_SETERROR("[elfsh:convert_object] Requested conversion unsupported\n",
67 -1);
68 val = (obj->immed ? obj->immed_val.ent : obj->get_obj(obj->parent));
69 XALLOC(obj->immed_val.str, sizeof(val), -1);
70 memcpy(obj->immed_val.str, &val, sizeof(val));
71 obj->type = ELFSH_OBJSTR;
72 obj->immed = 1;
73 obj->size = sizeof(long);
74 obj->sizelem = 0;
75 return (0);
76 }
77
78 /* Verify an object sanity */
vm_check_object(elfshpath_t * pobj)79 int vm_check_object(elfshpath_t *pobj)
80 {
81 switch (pobj->type)
82 {
83 case ELFSH_OBJRAW:
84 if (pobj->immed == 1)
85 break;
86 if (pobj->get_data == NULL || pobj->set_data == NULL)
87 ELFSH_SETERROR("[elfsh:check_object] Invalid object path\n", -1);
88 break;
89 case ELFSH_OBJSTR:
90 if (pobj->immed == 1)
91 break;
92 if (pobj->get_name == NULL || pobj->set_name == NULL)
93 ELFSH_SETERROR("[elfsh:check_object] Invalid object path\n", -1);
94 break;
95 case ELFSH_OBJINT:
96 if (pobj->immed == 1)
97 break;
98 if (pobj->get_obj == NULL || pobj->set_obj == NULL)
99 ELFSH_SETERROR("[elfsh:check_object] Invalid object path\n", -1);
100 break;
101 default:
102 ELFSH_SETERROR("[elfsh:check_object] Unknown object type\n", -1);
103 }
104 return (0);
105 }
106