resetting manifest requested domain to floor
[platform/upstream/db4.git] / common / db_getlong.c
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 1996-2009 Oracle.  All rights reserved.
5  *
6  * $Id$
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  */
20 int
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  */
80 int
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 }