📄 avpair.c
字号:
void rc_avpair_insert (VALUE_PAIR **a, VALUE_PAIR *p, VALUE_PAIR *b){ VALUE_PAIR *this_node = NULL; VALUE_PAIR *vp; if (*a == (VALUE_PAIR *) NULL) { *a = b; return; } if (!b) return; vp = *a; if ( p == (VALUE_PAIR *) NULL) /* run to end of "a" list */ { while (vp != (VALUE_PAIR *) NULL) { this_node = vp; vp = vp->next; } } else /* look for the "p" entry in the "a" list (or run to end) */ { this_node = *a; while (this_node != (VALUE_PAIR *) NULL) { if (this_node == p) { break; } this_node = this_node->next; } } /* add "b" at this_node */ vp = this_node->next; this_node->next = b; /* run to end of "b" and connect the rest of "a" */ while (b->next) b = b->next; b->next = vp; return;}/* * Function: rc_avpair_free * * Purpose: frees all value_pairs in the list * */void rc_avpair_free (VALUE_PAIR *pair){ VALUE_PAIR *next; while (pair != (VALUE_PAIR *) NULL) { next = pair->next; free (pair); pair = next; }}/* * Function: rc_fieldcpy * * Purpose: Copy a data field from the buffer. Advance the buffer * past the data field. * */static void rc_fieldcpy (char *string, char **uptr){ char *ptr; ptr = *uptr; if (*ptr == '"') { ptr++; while (*ptr != '"' && *ptr != '\0' && *ptr != '\n') { *string++ = *ptr++; } *string = '\0'; if (*ptr == '"') { ptr++; } *uptr = ptr; return; } while (*ptr != ' ' && *ptr != '\t' && *ptr != '\0' && *ptr != '\n' && *ptr != '=' && *ptr != ',') { *string++ = *ptr++; } *string = '\0'; *uptr = ptr; return;}/* * Function: rc_avpair_parse * * Purpose: parses the buffer to extract the attribute-value pairs. * * Returns: 0 = successful parse of attribute-value pair, * -1 = syntax (or other) error detected. * */#define PARSE_MODE_NAME 0#define PARSE_MODE_EQUAL 1#define PARSE_MODE_VALUE 2#define PARSE_MODE_INVALID 3int rc_avpair_parse (char *buffer, VALUE_PAIR **first_pair){ int mode; char attrstr[AUTH_ID_LEN]; char valstr[AUTH_ID_LEN]; DICT_ATTR *attr = NULL; DICT_VALUE *dval; VALUE_PAIR *pair; VALUE_PAIR *link; struct tm *tm; time_t timeval; mode = PARSE_MODE_NAME; while (*buffer != '\n' && *buffer != '\0') { if (*buffer == ' ' || *buffer == '\t') { buffer++; continue; } switch (mode) { case PARSE_MODE_NAME: /* Attribute Name */ rc_fieldcpy (attrstr, &buffer); if ((attr = rc_dict_findattr (attrstr)) == (DICT_ATTR *) NULL) { error("rc_avpair_parse: unknown attribute"); if (*first_pair) { rc_avpair_free(*first_pair); *first_pair = (VALUE_PAIR *) NULL; } return (-1); } mode = PARSE_MODE_EQUAL; break; case PARSE_MODE_EQUAL: /* Equal sign */ if (*buffer == '=') { mode = PARSE_MODE_VALUE; buffer++; } else { error("rc_avpair_parse: missing or misplaced equal sign"); if (*first_pair) { rc_avpair_free(*first_pair); *first_pair = (VALUE_PAIR *) NULL; } return (-1); } break; case PARSE_MODE_VALUE: /* Value */ rc_fieldcpy (valstr, &buffer); if ((pair = (VALUE_PAIR *) malloc (sizeof (VALUE_PAIR))) == (VALUE_PAIR *) NULL) { novm("rc_avpair_parse"); if (*first_pair) { rc_avpair_free(*first_pair); *first_pair = (VALUE_PAIR *) NULL; } return (-1); } strcpy (pair->name, attr->name); pair->attribute = attr->value; pair->type = attr->type; pair->vendorcode = attr->vendorcode; switch (pair->type) { case PW_TYPE_STRING: strcpy (pair->strvalue, valstr); pair->lvalue = strlen(valstr); break; case PW_TYPE_INTEGER: if (isdigit (*valstr)) { pair->lvalue = atoi (valstr); } else { if ((dval = rc_dict_findval (valstr)) == (DICT_VALUE *) NULL) { error("rc_avpair_parse: unknown attribute value: %s", valstr); if (*first_pair) { rc_avpair_free(*first_pair); *first_pair = (VALUE_PAIR *) NULL; } free (pair); return (-1); } else { pair->lvalue = dval->value; } } break; case PW_TYPE_IPADDR: pair->lvalue = rc_get_ipaddr(valstr); break; case PW_TYPE_DATE: timeval = time (0); tm = localtime (&timeval); tm->tm_hour = 0; tm->tm_min = 0; tm->tm_sec = 0; rc_str2tm (valstr, tm);#ifdef TIMELOCAL pair->lvalue = (UINT4) timelocal (tm);#else /* TIMELOCAL */ pair->lvalue = (UINT4) mktime (tm);#endif /* TIMELOCAL */ break; default: error("rc_avpair_parse: unknown attribute type %d", pair->type); if (*first_pair) { rc_avpair_free(*first_pair); *first_pair = (VALUE_PAIR *) NULL; } free (pair); return (-1); } pair->next = (VALUE_PAIR *) NULL; if (*first_pair == (VALUE_PAIR *) NULL) { *first_pair = pair; } else { link = *first_pair; while (link->next != (VALUE_PAIR *) NULL) { link = link->next; } link->next = pair; } mode = PARSE_MODE_NAME; break; default: mode = PARSE_MODE_NAME; break; } } return (0);}/* * Function: rc_avpair_tostr * * Purpose: Translate an av_pair into two strings * * Returns: 0 on success, -1 on failure * */int rc_avpair_tostr (VALUE_PAIR *pair, char *name, int ln, char *value, int lv){ DICT_VALUE *dval; char buffer[32]; struct in_addr inad; unsigned char *ptr; *name = *value = '\0'; if (!pair || pair->name[0] == '\0') { error("rc_avpair_tostr: pair is NULL or empty"); return (-1); } strncpy(name, pair->name, (size_t) ln); switch (pair->type) { case PW_TYPE_STRING: lv--; ptr = (unsigned char *) pair->strvalue; while (*ptr != '\0') { if (!(isprint (*ptr))) { sprintf (buffer, "\\%03o", *ptr); strncat(value, buffer, (size_t) lv); lv -= 4; if (lv < 0) break; } else { strncat(value, ptr, 1); lv--; if (lv < 0) break; } ptr++; } break; case PW_TYPE_INTEGER: dval = rc_dict_getval (pair->lvalue, pair->name); if (dval != (DICT_VALUE *) NULL) { strncpy(value, dval->name, (size_t) lv-1); } else { sprintf (buffer, "%ld", pair->lvalue); strncpy(value, buffer, (size_t) lv); } break; case PW_TYPE_IPADDR: inad.s_addr = htonl(pair->lvalue); strncpy (value, inet_ntoa (inad), (size_t) lv-1); break; case PW_TYPE_DATE: strftime (buffer, sizeof (buffer), "%m/%d/%y %H:%M:%S", gmtime ((time_t *) & pair->lvalue)); strncpy(value, buffer, lv-1); break; default: error("rc_avpair_tostr: unknown attribute type %d", pair->type); return (-1); break; } return 0;}/* * Function: rc_avpair_readin * * Purpose: get a sequence of attribute value pairs from the file input * and make them into a list of value_pairs * */VALUE_PAIR *rc_avpair_readin(FILE *input){ VALUE_PAIR *vp = NULL; char buffer[1024], *q; while (fgets(buffer, sizeof(buffer), input) != NULL) { q = buffer; while(*q && isspace(*q)) q++; if ((*q == '\n') || (*q == '#') || (*q == '\0')) continue; if (rc_avpair_parse(q, &vp) < 0) { error("rc_avpair_readin: malformed attribute: %s", buffer); rc_avpair_free(vp); return NULL; } } return vp;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -