1 | /*************************************** 2 | $Revision: 1.9 $ 3 | 4 | Miscellaneous functions to support UD 5 | 6 | Status: NOT REVUED, NOT TESTED 7 | 8 | Author(s): Chris Ottrey, Andrei Robachevsky 9 | 10 | ******************/ /****************** 11 | Modification History: 12 | andrei (17/01/2000) Created. 13 | ******************/ /****************** 14 | Copyright (c) 2000 RIPE NCC 15 | 16 | All Rights Reserved 17 | 18 | Permission to use, copy, modify, and distribute this software and its 19 | documentation for any purpose and without fee is hereby granted, 20 | provided that the above copyright notice appear in all copies and that 21 | both that copyright notice and this permission notice appear in 22 | supporting documentation, and that the name of the author not be 23 | used in advertising or publicity pertaining to distribution of the 24 | software without specific, written prior permission. 25 | 26 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 27 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 28 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 29 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 30 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 31 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 32 | ***************************************/ 33 | #include "ud.h" 34 | #include "ud_int.h" 35 | 36 | void attribute_free(void *data, void *ptr) 37 | { 38 | Attribute_t *attr = data; 39 | 40 | free(attr->value); 41 | free(attr); 42 | } 43 | 44 | 45 | Attribute_t *attribute_upd(Attribute_t *attr, int newtype, char *newvalue) 46 | { 47 | attr->type=newtype; 48 | free(attr->value); 49 | attr->value=g_strdup(newvalue); 50 | return(attr); 51 | } 52 | 53 | Attribute_t *attribute_new1(int type, const char *value) 54 | { 55 | char *n; 56 | Attribute_t *attr = NULL; 57 | 58 | attr = (Attribute_t *)calloc(1, sizeof(Attribute_t)+1); 59 | attr->type = type; 60 | 61 | /* check for end-of-line comments */ 62 | n = index(value, '#'); 63 | /* if there is no comment check for trailing \n */ 64 | if(n == NULL) n = index(value, '\n'); 65 | /* now copy the clean value into the attribute */ 66 | if(n == NULL) attr->value = g_strdup(value); 67 | else attr->value = g_strndup(value, (n - value)); 68 | /* Strip the whitespace */ 69 | g_strstrip(attr->value); 70 | return(attr); 71 | 72 | } 73 | 74 | Attribute_t *attribute_new(const char *line) { 75 | Attribute_t *attr = NULL; 76 | int type; 77 | char *colon; 78 | gchar *token; 79 | 80 | 81 | colon = index(line, ':'); 82 | if (colon != NULL) { 83 | if (line[0] =='*') { 84 | token = g_strndup(line+1, 2); 85 | type = DF_attribute_code2type(token); 86 | } 87 | else { 88 | token = g_strndup(line, (colon - line)); 89 | type = DF_attribute_name2type(token); 90 | } 91 | if(token)free(token); 92 | 93 | colon+=2; 94 | if (type >= 0) { 95 | attr=attribute_new1(type, colon); 96 | } 97 | else { 98 | /* fprintf(stderr, "ERROR: Bad attribute: %s\n", token);*/ 99 | } 100 | } 101 | else { 102 | /* fprintf(stderr, "ERROR: Not an attribute: %s\n", line);*/ 103 | } 104 | return attr; 105 | } /* attribute_new() */ 106 | 107 | 108 | void object_free(Object_t *obj) { 109 | if (obj) { 110 | g_slist_foreach(obj->attributes, attribute_free, NULL); 111 | g_slist_free(obj->attributes); 112 | g_string_free(obj->object, TRUE); 113 | free(obj); 114 | } 115 | } /* object_free() */ 116 | 117 | Object_t *object_new(const char *line) { 118 | Object_t *obj = NULL; 119 | 120 | int type; 121 | char *colon; 122 | gchar *token; 123 | 124 | colon = index(line, ':'); 125 | if (colon != NULL) { 126 | if (line[0] =='*') { 127 | token = g_strndup(line+1, 2); 128 | type = DF_class_code2type(token); 129 | } 130 | else { 131 | token = g_strndup(line, (colon - line)); 132 | type = DF_class_name2type(token); 133 | } 134 | if(token)free(token); 135 | 136 | if (type >= 0) { 137 | obj = (Object_t *)calloc(1, sizeof(Object_t)+1); 138 | obj->attributes = NULL; 139 | obj->object = g_string_sized_new(STR_XXXL); 140 | obj->type = type; 141 | } 142 | else { 143 | /* fprintf(stderr, "ERROR: Object has an invalid class: %s\n");*/ 144 | } 145 | } 146 | else { 147 | /* fprintf(stderr, "ERROR: No colon found in line: %s\n", line);*/ 148 | } 149 | 150 | return obj; 151 | } /* object_new() */ 152 | 153 | 154 | 155 | 156 | /************************************************************ 157 | *void transaction_free(Transaction_t *tr) 158 | * 159 | * **********************************************************/ 160 | void transaction_free(Transaction_t *tr) { 161 | if(tr) { 162 | g_string_free(tr->error_script, TRUE); 163 | /* free nic_handle_t structure used for NHR stuff */ 164 | if(tr->nh)free_nh(tr->nh); 165 | if(tr->save)free(tr->save); 166 | free(tr); 167 | } 168 | } /* transaction_free() */ 169 | 170 | /************************************************************ 171 | *Transaction_t *transaction_new(SQ_connection_t *sql_connection, C_Type_t class_type) 172 | * 173 | * **********************************************************/ 174 | Transaction_t *transaction_new(SQ_connection_t *sql_connection, C_Type_t class_type) { 175 | Transaction_t *tr = (Transaction_t *)calloc(1, sizeof(Transaction_t)); 176 | 177 | if (tr != NULL) { 178 | tr->sql_connection = sql_connection; 179 | tr->class_type = class_type; 180 | tr->thread_upd=TR_UPDATE; 181 | tr->thread_ins=TR_INSERT; 182 | tr->object_id = 0; /* Just in case*/ 183 | tr->succeeded = 1; 184 | tr->error=0; 185 | tr->error_script = g_string_sized_new(STR_XL); 186 | tr->dummy = 0; /* By default do not create dummies except for sets*/ 187 | tr->ndummy=0; 188 | tr->action=100; 189 | tr->load_pass=0; /* by default*/ 190 | tr->sequence_id=1; /* we start from 1*/ 191 | tr->save=NULL; 192 | tr->nh=NULL; 193 | tr->packptr=NULL; 194 | } 195 | return tr; 196 | } /* transaction_new() */