1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * db_entry.cc
24 *
25 * Copyright (c) 1988-2001 by Sun Microsystems, Inc.
26 * All Rights Reserved.
27 */
28
29 #include <sys/types.h>
30 #include <stdio.h>
31 #include <string.h>
32
33 #include "db_headers.h"
34 #include "db_table.h" /* must come before db_entry */
35 #include "db_entry.h"
36 #include "nisdb_mt.h"
37
38 #define PRINT_WIDTH 32
39
40 void
print_entry(entryp location,entry_object * e)41 print_entry(entryp location, entry_object *e)
42 {
43 printf("entry at location %d: \n", location);
44
45 if (e == NULL) {
46 printf("\tnull object\n");
47 return;
48 }
49
50 int size = e->en_cols.en_cols_len, i, j, col_width;
51 entry_col * entry = e->en_cols.en_cols_val;
52
53 printf("\ttype: %s\n", e->en_type ? e->en_type : "none");
54 printf("\tnumber of columns: %d\n", size);
55
56 for (i = 0; i < size; i++) {
57 printf("\t\t%d: flags=0x%x, length=%d, value=",
58 i, entry[i].ec_flags, entry[i].ec_value.ec_value_len);
59 col_width = ((entry[i].ec_value.ec_value_len > PRINT_WIDTH) ?
60 PRINT_WIDTH : entry[i].ec_value.ec_value_len);
61 for (j = 0; j < col_width; j++) {
62 if (entry[i].ec_value.ec_value_val[j] < 32) {
63 putchar('^');
64 putchar(entry[i].ec_value.ec_value_val[j]+32);
65 } else {
66 putchar(entry[i].ec_value.ec_value_val[j]);
67 }
68 }
69
70 putchar('\n');
71 }
72 }
73
74 entry_object*
new_entry(entry_object * old)75 new_entry(entry_object *old)
76 {
77 entry_object* newobj = new entry_object;
78 if (newobj == NULL)
79 FATAL3("new_entry:: cannot allocate space", DB_MEMORY_LIMIT,
80 NULL);
81
82 if (copy_entry(old, newobj))
83 return (newobj);
84 else {
85 delete newobj;
86 return (NULL);
87 }
88 }
89
90 bool_t
copy_entry(entry_object * old,entry_object * nb)91 copy_entry(entry_object * old, entry_object *nb)
92 {
93 int tlen, j, i;
94 int num_cols = 0;
95 entry_col *cols, *newcols = NULL;
96
97 if (old == NULL) return FALSE;
98
99 if (old->en_type == NULL)
100 nb->en_type = NULL;
101 else {
102 nb->en_type = strdup(old->en_type);
103 if (nb->en_type == NULL)
104 FATAL3(
105 "copy_entry: cannot allocate space for entry type",
106 DB_MEMORY_LIMIT, FALSE);
107 }
108
109 num_cols = old->en_cols.en_cols_len;
110 cols = old->en_cols.en_cols_val;
111 if (num_cols == 0)
112 nb->en_cols.en_cols_val = NULL;
113 else {
114 newcols = new entry_col[num_cols];
115 if (newcols == NULL) {
116 if (nb->en_type)
117 delete nb->en_type;
118 FATAL3("copy_entry: cannot allocate space for columns",
119 DB_MEMORY_LIMIT, FALSE);
120 }
121 for (j = 0; j < num_cols; j++) {
122 newcols[j].ec_flags = cols[j].ec_flags;
123 tlen = newcols[j].ec_value.ec_value_len =
124 cols[j].ec_value.ec_value_len;
125 newcols[j].ec_value.ec_value_val = new char[ tlen ];
126 if (newcols[j].ec_value.ec_value_val == NULL) {
127 // cleanup space already allocated
128 if (nb->en_type)
129 delete nb->en_type;
130 for (i = 0; i < j; i++)
131 delete newcols[i].ec_value.ec_value_val;
132 delete newcols;
133 FATAL3(
134 "copy_entry: cannot allocate space for column value",
135 DB_MEMORY_LIMIT, FALSE);
136 }
137 memcpy(newcols[j].ec_value.ec_value_val,
138 cols[j].ec_value.ec_value_val,
139 tlen);
140 }
141 }
142 nb->en_cols.en_cols_len = num_cols;
143 nb->en_cols.en_cols_val = newcols;
144 return (TRUE);
145 }
146
147 void
free_entry(entry_object * obj)148 free_entry(entry_object * obj)
149 {
150 int i;
151 int num_cols;
152 entry_col *cols;
153
154 if (obj != NULL) {
155 num_cols = obj->en_cols.en_cols_len;
156 cols = obj->en_cols.en_cols_val;
157 for (i = 0; i < num_cols; i++)
158 if (cols[i].ec_value.ec_value_val != NULL)
159 delete cols[i].ec_value.ec_value_val;
160 if (cols)
161 delete cols;
162 if (obj->en_type)
163 delete obj->en_type;
164 delete obj;
165 }
166 }
167
168 bool_t
sameEntry(entry_object * a,entry_object * b)169 sameEntry(entry_object *a, entry_object *b) {
170 uint_t i;
171
172 if (a == 0)
173 return (b == 0);
174 if (b == 0)
175 return (FALSE);
176
177 if (a->en_type != 0 && b->en_type != 0) {
178 if (strcmp(a->en_type, b->en_type) != 0)
179 return (FALSE);
180 } else if (a->en_type != b->en_type) {
181 return (FALSE);
182 }
183
184 if (a->en_cols.en_cols_len != b->en_cols.en_cols_len)
185 return (FALSE);
186
187 for (i = 0; i < a->en_cols.en_cols_len; i++) {
188 if (a->en_cols.en_cols_val[i].ec_flags !=
189 b->en_cols.en_cols_val[i].ec_flags)
190 return (FALSE);
191 if (a->en_cols.en_cols_val[i].ec_value.ec_value_len !=
192 b->en_cols.en_cols_val[i].ec_value.ec_value_len)
193 return (FALSE);
194 if (memcmp(a->en_cols.en_cols_val[i].ec_value.ec_value_val,
195 b->en_cols.en_cols_val[i].ec_value.ec_value_val,
196 a->en_cols.en_cols_val[i].ec_value.ec_value_len) != 0)
197 return (FALSE);
198 }
199
200 return (TRUE);
201 }
202