1/*- 2 * See the file LICENSE for redistribution information. 3 * 4 * Copyright (c) 1996,2008 Oracle. All rights reserved. 5 * 6 * $Id: db_getlong.c,v 12.8 2008/01/08 20:58:08 bostic Exp $ 7 */ 8 9#include "db_config.h" 10 11#include "db_int.h" 12 13/* 14 * __db_getlong -- 15 * Return a long value inside of basic parameters. 16 * 17 * PUBLIC: int __db_getlong 18 * PUBLIC: __P((DB_ENV *, const char *, char *, long, long, long *)); 19 */ 20int 21__db_getlong(dbenv, progname, p, min, max, storep) 22 DB_ENV *dbenv; 23 const char *progname; 24 char *p; 25 long min, max, *storep; 26{ 27 long val; 28 char *end; 29 30 __os_set_errno(0); 31 val = strtol(p, &end, 10); 32 if ((val == LONG_MIN || val == LONG_MAX) && 33 __os_get_errno() == ERANGE) { 34 if (dbenv == NULL) 35 fprintf(stderr, 36 "%s: %s: %s\n", progname, p, strerror(ERANGE)); 37 else 38 dbenv->err(dbenv, ERANGE, "%s", p); 39 return (ERANGE); 40 } 41 if (p[0] == '\0' || (end[0] != '\0' && end[0] != '\n')) { 42 if (dbenv == NULL) 43 fprintf(stderr, 44 "%s: %s: Invalid numeric argument\n", progname, p); 45 else 46 dbenv->errx(dbenv, "%s: Invalid numeric argument", p); 47 return (EINVAL); 48 } 49 if (val < min) { 50 if (dbenv == NULL) 51 fprintf(stderr, 52 "%s: %s: Less than minimum value (%ld)\n", 53 progname, p, min); 54 else 55 dbenv->errx(dbenv, 56 "%s: Less than minimum value (%ld)", p, min); 57 return (ERANGE); 58 } 59 if (val > max) { 60 if (dbenv == NULL) 61 fprintf(stderr, 62 "%s: %s: Greater than maximum value (%ld)\n", 63 progname, p, max); 64 else 65 dbenv->errx(dbenv, 66 "%s: Greater than maximum value (%ld)", p, max); 67 return (ERANGE); 68 } 69 *storep = val; 70 return (0); 71} 72 73/* 74 * __db_getulong -- 75 * Return an unsigned long value inside of basic parameters. 76 * 77 * PUBLIC: int __db_getulong 78 * PUBLIC: __P((DB_ENV *, const char *, char *, u_long, u_long, u_long *)); 79 */ 80int 81__db_getulong(dbenv, progname, p, min, max, storep) 82 DB_ENV *dbenv; 83 const char *progname; 84 char *p; 85 u_long min, max, *storep; 86{ 87 u_long val; 88 char *end; 89 90 __os_set_errno(0); 91 val = strtoul(p, &end, 10); 92 if (val == ULONG_MAX && __os_get_errno() == ERANGE) { 93 if (dbenv == NULL) 94 fprintf(stderr, 95 "%s: %s: %s\n", progname, p, strerror(ERANGE)); 96 else 97 dbenv->err(dbenv, ERANGE, "%s", p); 98 return (ERANGE); 99 } 100 if (p[0] == '\0' || (end[0] != '\0' && end[0] != '\n')) { 101 if (dbenv == NULL) 102 fprintf(stderr, 103 "%s: %s: Invalid numeric argument\n", progname, p); 104 else 105 dbenv->errx(dbenv, "%s: Invalid numeric argument", p); 106 return (EINVAL); 107 } 108 if (val < min) { 109 if (dbenv == NULL) 110 fprintf(stderr, 111 "%s: %s: Less than minimum value (%lu)\n", 112 progname, p, min); 113 else 114 dbenv->errx(dbenv, 115 "%s: Less than minimum value (%lu)", p, min); 116 return (ERANGE); 117 } 118 119 /* 120 * We allow a 0 to substitute as a max value for ULONG_MAX because 121 * 1) accepting only a 0 value is unlikely to be necessary, and 2) 122 * we don't want callers to have to use ULONG_MAX explicitly, as it 123 * may not exist on all platforms. 124 */ 125 if (max != 0 && val > max) { 126 if (dbenv == NULL) 127 fprintf(stderr, 128 "%s: %s: Greater than maximum value (%lu)\n", 129 progname, p, max); 130 else 131 dbenv->errx(dbenv, 132 "%s: Greater than maximum value (%lu)", p, max); 133 return (ERANGE); 134 } 135 *storep = val; 136 return (0); 137} 138