1 2/* 3 * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT. 4 * You may freely copy it for use as a template for your own field types. 5 * If you develop a field type that might be of general use, please send 6 * it back to the ncurses maintainers for inclusion in the next version. 7 */ 8/*************************************************************************** 9* * 10* Author : Per Foreby, perf@efd.lth.se * 11* * 12***************************************************************************/ 13 14#include "form.priv.h" 15 16MODULE_ID("$Id: fty_ipv4.c,v 1.6 2004/05/29 19:13:48 tom Exp $") 17 18/*--------------------------------------------------------------------------- 19| Facility : libnform 20| Function : static bool Check_IPV4_Field( 21| FIELD * field, 22| const void * argp) 23| 24| Description : Validate buffer content to be a valid IP number (Ver. 4) 25| 26| Return Values : TRUE - field is valid 27| FALSE - field is invalid 28+--------------------------------------------------------------------------*/ 29static bool 30Check_IPV4_Field(FIELD *field, const void *argp GCC_UNUSED) 31{ 32 char *bp = field_buffer(field, 0); 33 int num = 0, len; 34 unsigned int d1, d2, d3, d4; 35 36 if (isdigit(UChar(*bp))) /* Must start with digit */ 37 { 38 num = sscanf(bp, "%u.%u.%u.%u%n", &d1, &d2, &d3, &d4, &len); 39 if (num == 4) 40 { 41 bp += len; /* Make bp point to what sscanf() left */ 42 while (*bp && isspace(UChar(*bp))) 43 bp++; /* Allow trailing whitespace */ 44 } 45 } 46 return ((num != 4 || *bp || d1 > 255 || d2 > 255 47 || d3 > 255 || d4 > 255) ? FALSE : TRUE); 48} 49 50/*--------------------------------------------------------------------------- 51| Facility : libnform 52| Function : static bool Check_IPV4_Character( 53| int c, 54| const void *argp ) 55| 56| Description : Check a character for unsigned type or period. 57| 58| Return Values : TRUE - character is valid 59| FALSE - character is invalid 60+--------------------------------------------------------------------------*/ 61static bool 62Check_IPV4_Character(int c, const void *argp GCC_UNUSED) 63{ 64 return ((isdigit(UChar(c)) || (c == '.')) ? TRUE : FALSE); 65} 66 67static FIELDTYPE typeIPV4 = 68{ 69 _RESIDENT, 70 1, /* this is mutable, so we can't be const */ 71 (FIELDTYPE *)0, 72 (FIELDTYPE *)0, 73 NULL, 74 NULL, 75 NULL, 76 Check_IPV4_Field, 77 Check_IPV4_Character, 78 NULL, 79 NULL 80}; 81 82NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_IPV4 = &typeIPV4; 83 84/* fty_ipv4.c ends here */ 85