Home | History | Annotate | Download | only in libnisdb
      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 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     30 
     31 
     32 #include <sys/types.h>
     33 #include <stdio.h>
     34 #include <string.h>
     35 
     36 #include "db_headers.h"
     37 #include "db_table.h"  /* must come before db_entry */
     38 #include "db_entry.h"
     39 #include "nisdb_mt.h"
     40 
     41 #define	PRINT_WIDTH 32
     42 
     43 void
     44 print_entry(entryp location, entry_object *e)
     45 {
     46 	printf("entry at location %d: \n", location);
     47 
     48 	if (e == NULL) {
     49 		printf("\tnull object\n");
     50 		return;
     51 	}
     52 
     53 	int size = e->en_cols.en_cols_len, i, j, col_width;
     54 	entry_col * entry = e->en_cols.en_cols_val;
     55 
     56 	printf("\ttype: %s\n", e->en_type ? e->en_type : "none");
     57 	printf("\tnumber of columns: %d\n", size);
     58 
     59 	for (i = 0; i < size; i++) {
     60 		printf("\t\t%d: flags=0x%x, length=%d, value=",
     61 			i, entry[i].ec_flags, entry[i].ec_value.ec_value_len);
     62 		col_width = ((entry[i].ec_value.ec_value_len > PRINT_WIDTH) ?
     63 				PRINT_WIDTH : entry[i].ec_value.ec_value_len);
     64 		for (j = 0; j < col_width; j++) {
     65 			if (entry[i].ec_value.ec_value_val[j] < 32) {
     66 				putchar('^');
     67 				putchar(entry[i].ec_value.ec_value_val[j]+32);
     68 			} else {
     69 				putchar(entry[i].ec_value.ec_value_val[j]);
     70 			}
     71 		}
     72 
     73 		putchar('\n');
     74 	}
     75 }
     76 
     77 entry_object*
     78 new_entry(entry_object *old)
     79 {
     80 	entry_object* newobj = new entry_object;
     81 	if (newobj == NULL)
     82 	    FATAL3("new_entry:: cannot allocate space", DB_MEMORY_LIMIT,
     83 			NULL);
     84 
     85 	if (copy_entry(old, newobj))
     86 		return (newobj);
     87 	else {
     88 	    delete newobj;
     89 	    return (NULL);
     90 	}
     91 }
     92 
     93 bool_t
     94 copy_entry(entry_object * old, entry_object *nb)
     95 {
     96 	int tlen, j, i;
     97 	int num_cols = 0;
     98 	entry_col *cols, *newcols = NULL;
     99 
    100 	if (old == NULL) return FALSE;
    101 
    102 	if (old->en_type == NULL)
    103 		nb->en_type = NULL;
    104 	else {
    105 		nb->en_type = strdup(old->en_type);
    106 		if (nb->en_type == NULL)
    107 			FATAL3(
    108 			    "copy_entry: cannot allocate space for entry type",
    109 			    DB_MEMORY_LIMIT, FALSE);
    110 	}
    111 
    112 	num_cols = old->en_cols.en_cols_len;
    113 	cols = old->en_cols.en_cols_val;
    114 	if (num_cols == 0)
    115 		nb->en_cols.en_cols_val = NULL;
    116 	else {
    117 		newcols = new entry_col[num_cols];
    118 		if (newcols == NULL) {
    119 			if (nb->en_type)
    120 			delete nb->en_type;
    121 			FATAL3("copy_entry: cannot allocate space for columns",
    122 				DB_MEMORY_LIMIT, FALSE);
    123 		}
    124 		for (j = 0; j < num_cols; j++) {
    125 			newcols[j].ec_flags = cols[j].ec_flags;
    126 			tlen = newcols[j].ec_value.ec_value_len =
    127 				cols[j].ec_value.ec_value_len;
    128 			newcols[j].ec_value.ec_value_val = new char[ tlen ];
    129 			if (newcols[j].ec_value.ec_value_val == NULL) {
    130 				// cleanup space already allocated
    131 				if (nb->en_type)
    132 					delete nb->en_type;
    133 				for (i = 0; i < j; i++)
    134 					delete newcols[i].ec_value.ec_value_val;
    135 				delete newcols;
    136 				FATAL3(
    137 			"copy_entry: cannot allocate space for column value",
    138 			DB_MEMORY_LIMIT, FALSE);
    139 			}
    140 			memcpy(newcols[j].ec_value.ec_value_val,
    141 				cols[j].ec_value.ec_value_val,
    142 				tlen);
    143 		}
    144 	}
    145 	nb->en_cols.en_cols_len = num_cols;
    146 	nb->en_cols.en_cols_val = newcols;
    147 	return (TRUE);
    148 }
    149 
    150 void
    151 free_entry(entry_object * obj)
    152 {
    153 	int i;
    154 	int num_cols;
    155 	entry_col *cols;
    156 
    157 	if (obj != NULL) {
    158 		num_cols = obj->en_cols.en_cols_len;
    159 		cols = obj->en_cols.en_cols_val;
    160 		for (i = 0; i < num_cols; i++)
    161 			if (cols[i].ec_value.ec_value_val != NULL)
    162 				delete cols[i].ec_value.ec_value_val;
    163 		if (cols)
    164 			delete cols;
    165 		if (obj->en_type)
    166 			delete obj->en_type;
    167 		delete obj;
    168 	}
    169 }
    170 
    171 bool_t
    172 sameEntry(entry_object *a, entry_object *b) {
    173 	uint_t	i;
    174 
    175 	if (a == 0)
    176 		return (b == 0);
    177 	if (b == 0)
    178 		return (FALSE);
    179 
    180 	if (a->en_type != 0 && b->en_type != 0) {
    181 		if (strcmp(a->en_type, b->en_type) != 0)
    182 			return (FALSE);
    183 	} else if (a->en_type != b->en_type) {
    184 		return (FALSE);
    185 	}
    186 
    187 	if (a->en_cols.en_cols_len != b->en_cols.en_cols_len)
    188 		return (FALSE);
    189 
    190 	for (i = 0; i < a->en_cols.en_cols_len; i++) {
    191 		if (a->en_cols.en_cols_val[i].ec_flags !=
    192 				b->en_cols.en_cols_val[i].ec_flags)
    193 			return (FALSE);
    194 		if (a->en_cols.en_cols_val[i].ec_value.ec_value_len !=
    195 			b->en_cols.en_cols_val[i].ec_value.ec_value_len)
    196 			return (FALSE);
    197 		if (memcmp(a->en_cols.en_cols_val[i].ec_value.ec_value_val,
    198 			b->en_cols.en_cols_val[i].ec_value.ec_value_val,
    199 			a->en_cols.en_cols_val[i].ec_value.ec_value_len) != 0)
    200 			return (FALSE);
    201 	}
    202 
    203 	return (TRUE);
    204 }
    205