Line data Source code
1 : /*------------------------------------------------------------------
2 : * strncpy_s.c / strcpy_s.c / strnlen_s.c
3 : *
4 : * October 2008, Bo Berry
5 : *
6 : * Copyright � 2008-2011 by Cisco Systems, Inc
7 : * All rights reserved.
8 :
9 : * safe_str_constraint.c
10 : *
11 : * October 2008, Bo Berry
12 : * 2012, Jonathan Toppins <jtoppins@users.sourceforge.net>
13 : *
14 : * Copyright � 2008, 2009, 2012 Cisco Systems
15 : * All rights reserved.
16 :
17 : * ignore_handler_s.c
18 : *
19 : * 2012, Jonathan Toppins <jtoppins@users.sourceforge.net>
20 : *
21 : * Copyright � 2012 Cisco Systems
22 : * All rights reserved.
23 : *
24 : * Permission is hereby granted, free of charge, to any person
25 : * obtaining a copy of this software and associated documentation
26 : * files (the "Software"), to deal in the Software without
27 : * restriction, including without limitation the rights to use,
28 : * copy, modify, merge, publish, distribute, sublicense, and/or
29 : * sell copies of the Software, and to permit persons to whom the
30 : * Software is furnished to do so, subject to the following
31 : * conditions:
32 : *
33 : * The above copyright notice and this permission notice shall be
34 : * included in all copies or substantial portions of the Software.
35 : *
36 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
37 : * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
38 : * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
39 : * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
40 : * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
41 : * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
42 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
43 : * OTHER DEALINGS IN THE SOFTWARE.
44 : *------------------------------------------------------------------
45 : */
46 : #ifndef EbAppString_h
47 : #define EbAppString_h
48 :
49 : #include <stddef.h>
50 : #include <stdint.h>
51 :
52 : #ifdef __cplusplus
53 : extern "C" {
54 : #endif // __cplusplus
55 :
56 : #ifndef _RSIZE_T_DEFINED
57 : typedef size_t rsize_t;
58 : #define _RSIZE_T_DEFINED
59 : #endif /* _RSIZE_T_DEFINED */
60 :
61 : #ifndef _ERRNO_T_DEFINED
62 : #define _ERRNO_T_DEFINED
63 : typedef int32_t errno_t;
64 : #endif /* _ERRNO_T_DEFINED */
65 :
66 : #ifndef EOK
67 : #define EOK ( 0 )
68 : #endif
69 :
70 : #ifndef ESZEROL
71 : #define ESZEROL ( 401 ) /* length is zero */
72 : #endif
73 :
74 : #ifndef ESLEMIN
75 : #define ESLEMIN ( 402 ) /* length is below min */
76 : #endif
77 :
78 : #ifndef ESLEMAX
79 : #define ESLEMAX ( 403 ) /* length exceeds max */
80 : #endif
81 :
82 : #ifndef ESNULLP
83 : #define ESNULLP ( 400 ) /* null ptr */
84 : #endif
85 :
86 : #ifndef ESOVRLP
87 : #define ESOVRLP ( 404 ) /* overlap undefined */
88 : #endif
89 :
90 : #ifndef ESEMPTY
91 : #define ESEMPTY ( 405 ) /* empty string */
92 : #endif
93 :
94 : #ifndef ESNOSPC
95 : #define ESNOSPC ( 406 ) /* not enough space for s2 */
96 : #endif
97 :
98 : #ifndef ESUNTERM
99 : #define ESUNTERM ( 407 ) /* unterminated string */
100 : #endif
101 :
102 : #ifndef ESNODIFF
103 : #define ESNODIFF ( 408 ) /* no difference */
104 : #endif
105 :
106 : #ifndef ESNOTFND
107 : #define ESNOTFND ( 409 ) /* not found */
108 : #endif
109 :
110 : #define RSIZE_MAX_STR ( 4UL << 10 ) /* 4KB */
111 : #define RCNEGATE(x) (x)
112 :
113 : #ifndef sldebug_printf
114 : #define sldebug_printf(...)
115 : #endif
116 :
117 : typedef void(*constraint_handler_t) (const char * /* msg */,
118 : void * /* ptr */,
119 : errno_t /* error */);
120 :
121 : /*
122 : * Function used by the libraries to invoke the registered
123 : * runtime-constraint handler. Always needed.
124 : */
125 : extern void invoke_safe_str_constraint_handler(
126 : const char *msg,
127 : void *ptr,
128 : errno_t error);
129 :
130 0 : static inline void handle_error(char *orig_dest, rsize_t orig_dmax,
131 : char *err_msg, errno_t err_code)
132 : {
133 : (void)orig_dmax;
134 0 : *orig_dest = '\0';
135 :
136 0 : invoke_safe_str_constraint_handler(err_msg, NULL, err_code);
137 0 : return;
138 : }
139 :
140 : #define sl_default_handler ignore_handler_s
141 : extern void ignore_handler_s(const char *msg, void *ptr, errno_t error);
142 :
143 : /* string copy */
144 : errno_t strcpy_ss(
145 : char *dest, rsize_t dmax, const char *src);
146 :
147 : /* fitted string copy */
148 : errno_t strncpy_ss(
149 : char *dest, rsize_t dmax, const char *src, rsize_t slen);
150 :
151 : /* string length */
152 : rsize_t strnlen_ss(
153 : const char *s, rsize_t smax);
154 :
155 : #define EB_STRNCPY(dst, dst_size, src, count) \
156 : strncpy_ss(dst, dst_size, src, count)
157 :
158 : #define EB_STRCPY(dst, size, src) \
159 : strcpy_ss(dst, size, src)
160 :
161 : #define EB_STRCMP(target,token) \
162 : strcmp(target,token)
163 :
164 : #define EB_STRLEN(target, max_size) \
165 : strnlen_ss(target, max_size)
166 :
167 : #ifdef __cplusplus
168 : }
169 : #endif // __cplusplus
170 :
171 : #endif // EbAppString_h
172 : /* File EOF */
|