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