/*
* $Id: hdr_build.c,v 1.4 2001/07/13 18:53:35 ljb Exp $
*/
/*
* All the routines in this module are designed to
* build the header information that is used in
* the pipeline communication between modules.
*
* Header structure:
*
* ... fill in when completely specified
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <sys/types.h>
#include <irr_rpsl_check.h>
static char *append_list_attr (char *, char *);
/* JW must fix later
int F_IR = -1, F_NH = -1, F_MN = -1;
*/
void convert_toupper (char *_z) {
while (*_z) {
*_z = toupper(*_z);
_z++;
}
}
void convert_tolower (char *_z) {
while (*_z) {
*_z = tolower(*_z);
_z++;
}
}
/* This routine concat's x and y, putting a space
* beteen x and y. It assumes that the
* caller is placing the result in x, so the routine
* free's x if it points to something.
*
* The calling convention should be like this:
* x = myconcat (x, y);
* x and/or y may be NULL and routine will work.
*/
char *my_concat (char *x, char *y, int make_space) {
char buf[MAXLINE];
if (x == NULL)
buf[0] = '\0';
else {
strcpy (buf, x);
free (x);
}
if (y != NULL) {
if (buf[0] != '\0' && make_space)
strcat (buf, " ");
strcat (buf, y);
}
if (buf[0] == '\0')
return NULL;
else
return strdup (buf);
}
char *append_list_attr (char *curr_list, char *new_val) {
char *s, *p, *q;
if (new_val == NULL)
return curr_list;
s = strdup (new_val);
for (p = q = s; irrcheck_find_token (&p, &q) > 0;) {
if (*(q - 1) == ',')
*(q - 1) = '\0';
curr_list = my_concat (curr_list, p, 1);
}
free (s);
return curr_list;
}
void display_header_info (parse_info_t *hi) {
fprintf (ofile, "%s\n", HDR_START);
if (hi->errors)
fprintf (ofile, "%s\n", SYNTAX_ERRORS);
else if (hi->warns)
fprintf (ofile, "%s\n", SYNTAX_WARNS);
if (hi->type != NO_OBJECT)
fprintf (ofile, "%s%s\n", OBJ_TYPE, obj_type[hi->type]);
if (hi->obj_key != NULL) {
fprintf (ofile, "%s%s", OBJ_KEY, hi->obj_key);
if (hi->second_key != NULL)
fprintf (ofile, " %s", hi->second_key);
fprintf (ofile, "\n");
}
if (hi->op != NULL)
fprintf (ofile, "%s%s\n", OP, hi->op); /* could be 'DEL'
* see syntax_attrs.c
*/
if (hi->source != NULL)
fprintf (ofile, "%s %s\n", SOURCE, hi->source);
if (hi->mnt_by != NULL)
fprintf (ofile, "%s %s\n", MNT_BY, hi->mnt_by);
if (hi->override != NULL)
fprintf (ofile, "%s %s\n", OVERRIDE, hi->override);
if (hi->password != NULL)
fprintf (ofile, "%s %s\n", PASSWORD, hi->password);
if (hi->check_notify != NULL)
fprintf (ofile, "%s %s\n", CHECK_NOTIFY, hi->check_notify);
if (hi->check_mnt_nfy != NULL)
fprintf (ofile, "%s %s\n", CHECK_MNT_NFY, hi->check_mnt_nfy);
if (hi->keycertfn != NULL)
fprintf (ofile, "%s %s\n", KEYCERTFN, hi->keycertfn);
if (hi->cookies != NULL)
fprintf (ofile, "%s", hi->cookies);
fprintf (ofile, "%s\n", HDR_END);
}
void build_header_info (parse_info_t *obj, char *attr_val) {
if (attr_val == NULL)
return;
fprintf (dfile, "build_header_info () attr_val (%s)\n", attr_val);
if (obj->obj_key == NULL &&
obj->type != NO_OBJECT &&
obj->curr_attr >= 0 &&
attr_is_key[obj->curr_attr] >= 0) {
obj->obj_key = strdup (attr_val);
return;
}
/* JW need to add back in when we add nic handles
if ((obj->curr_attr == F_OR ||
obj->curr_attr == F_NH) &&
obj->second_key == NULL) {
obj->second_key = strdup (attr_val);
return;
}
*/
if (obj->curr_attr == F_OR &&
obj->second_key == NULL) {
obj->second_key = strdup (attr_val);
return;
}
if (obj->curr_attr == F_SO &&
obj->source == NULL) {
obj->source = strdup (attr_val);
return;
}
if (obj->curr_attr == F_MB) {
obj->mnt_by = append_list_attr (obj->mnt_by, attr_val);
return;
}
if (obj->curr_attr == F_NY) {
obj->check_notify = append_list_attr (obj->check_notify, attr_val);
return;
}
/* JW need to add back in when we add maintainer objects
if (obj->curr_attr == F_MN) {
obj->check_mnt_nfy = append_list_attr (obj->check_mnt_nfy, attr_val);
return;
}
*/
}
syntax highlighted by Code2HTML, v. 0.9.1