| 472 | |
| 473 | |
| 474 | static int parse_avp_def(struct dm_avp_def *avps, int *avp_count, char *line, int len) |
| 475 | { |
| 476 | char *p = line, *avp_name; |
| 477 | |
| 478 | avp_name = p; |
| 479 | while (*p && !isspace(*p)) { p++; len--; } |
| 480 | avps[*avp_count].name_len = p - avp_name; |
| 481 | |
| 482 | if (avps[*avp_count].name_len > 64) { |
| 483 | LOG_ERROR("AVP max name length exceeded (64)\n"); |
| 484 | return -1; |
| 485 | } |
| 486 | |
| 487 | memcpy(&avps[*avp_count].name, avp_name, avps[*avp_count].name_len); |
| 488 | avps[*avp_count].name[avps[*avp_count].name_len] = '\0'; |
| 489 | |
| 490 | while (isspace(*p)) { p++; len--; } |
| 491 | |
| 492 | if (*p != '|') |
| 493 | goto error; |
| 494 | |
| 495 | p++; len--; |
| 496 | while (isspace(*p)) { p++; len--; } |
| 497 | |
| 498 | switch (*p) { |
| 499 | case 'F': |
| 500 | if (len < strlen("FIXED_HEAD") || memcmp(p, "FIXED_HEAD", 10)) |
| 501 | goto error; |
| 502 | |
| 503 | avps[*avp_count].pos = RULE_FIXED_HEAD; |
| 504 | p += 10; |
| 505 | len -= 10; |
| 506 | break; |
| 507 | |
| 508 | case 'R': |
| 509 | if (len < strlen("REQUIRED") || memcmp(p, "REQUIRED", 8)) |
| 510 | goto error; |
| 511 | |
| 512 | avps[*avp_count].pos = RULE_REQUIRED; |
| 513 | p += 8; |
| 514 | len -= 8; |
| 515 | break; |
| 516 | |
| 517 | case 'O': |
| 518 | if (len < strlen("OPTIONAL") || memcmp(p, "OPTIONAL", 8)) |
| 519 | goto error; |
| 520 | |
| 521 | avps[*avp_count].pos = RULE_OPTIONAL; |
| 522 | p += 8; |
| 523 | len -= 8; |
| 524 | break; |
| 525 | |
| 526 | default: |
| 527 | LOG_ERROR("bad AVP flag in: '... | %s'\n", p); |
| 528 | goto error; |
| 529 | } |
| 530 | |
| 531 | while (isspace(*p)) { p++; len--; } |
no outgoing calls
no test coverage detected