xref: /freebsd/contrib/sendmail/libsm/strdup.c (revision 3c4ba5f55438f7afd4f4b0b56f88f2bb505fd6a6)
1 /*
2  * Copyright (c) 2000-2001, 2003 Proofpoint, Inc. and its suppliers.
3  *	All rights reserved.
4  *
5  * By using this file, you agree to the terms and conditions set
6  * forth in the LICENSE file which can be found at the top level of
7  * the sendmail distribution.
8  *
9  */
10 
11 #include <sm/gen.h>
12 SM_RCSID("@(#)$Id: strdup.c,v 1.16 2013-11-22 20:51:43 ca Exp $")
13 
14 #include <sm/heap.h>
15 #include <sm/string.h>
16 
17 /*
18 **  SM_STRNDUP_X -- Duplicate a string of a given length
19 **
20 **	Allocates memory and copies source string (of given length) into it.
21 **
22 **	Parameters:
23 **		s -- string to copy.
24 **		n -- length to copy.
25 **
26 **	Returns:
27 **		copy of string, raises exception if out of memory.
28 **
29 **	Side Effects:
30 **		allocate memory for new string.
31 */
32 
33 char *
34 sm_strndup_x(s, n)
35 	const char *s;
36 	size_t n;
37 {
38 	char *d = sm_malloc_x(n + 1);
39 
40 	(void) memcpy(d, s, n);
41 	d[n] = '\0';
42 	return d;
43 }
44 
45 /*
46 **  SM_STRDUP -- Duplicate a string
47 **
48 **	Allocates memory and copies source string into it.
49 **
50 **	Parameters:
51 **		s -- string to copy.
52 **
53 **	Returns:
54 **		copy of string, NULL if out of memory.
55 **
56 **	Side Effects:
57 **		allocate memory for new string.
58 */
59 
60 char *
61 sm_strdup(s)
62 	const char *s;
63 {
64 	size_t l;
65 	char *d;
66 
67 	l = strlen(s) + 1;
68 	d = sm_malloc_tagged(l, "sm_strdup", 0, sm_heap_group());
69 	if (d != NULL)
70 		(void) sm_strlcpy(d, s, l);
71 	return d;
72 }
73 
74 #if DO_NOT_USE_STRCPY
75 
76 /*
77 **  SM_STRDUP_X -- Duplicate a string
78 **
79 **	Allocates memory and copies source string into it.
80 **
81 **	Parameters:
82 **		s -- string to copy.
83 **
84 **	Returns:
85 **		copy of string, exception if out of memory.
86 **
87 **	Side Effects:
88 **		allocate memory for new string.
89 */
90 
91 char *
92 sm_strdup_x(s)
93 	const char *s;
94 {
95 	size_t l;
96 	char *d;
97 
98 	l = strlen(s) + 1;
99 	d = sm_malloc_tagged_x(l, "sm_strdup_x", 0, sm_heap_group());
100 	(void) sm_strlcpy(d, s, l);
101 	return d;
102 }
103 
104 /*
105 **  SM_PSTRDUP_X -- Duplicate a string (using "permanent" memory)
106 **
107 **	Allocates memory and copies source string into it.
108 **
109 **	Parameters:
110 **		s -- string to copy.
111 **
112 **	Returns:
113 **		copy of string, exception if out of memory.
114 **
115 **	Side Effects:
116 **		allocate memory for new string.
117 */
118 
119 char *
120 sm_pstrdup_x(s)
121 	const char *s;
122 {
123 	size_t l;
124 	char *d;
125 
126 	l = strlen(s) + 1;
127 	d = sm_pmalloc_x(l);
128 	(void) sm_strlcpy(d, s, l);
129 	return d;
130 }
131 
132 /*
133 **  SM_STRDUP_X -- Duplicate a string
134 **
135 **	Allocates memory and copies source string into it.
136 **
137 **	Parameters:
138 **		s -- string to copy.
139 **		file -- name of source file
140 **		line -- line in source file
141 **		group -- heap group
142 **
143 **	Returns:
144 **		copy of string, exception if out of memory.
145 **
146 **	Side Effects:
147 **		allocate memory for new string.
148 */
149 
150 char *
151 sm_strdup_tagged_x(s, file, line, group)
152 	const char *s;
153 	char *file;
154 	int line, group;
155 {
156 	size_t l;
157 	char *d;
158 
159 	l = strlen(s) + 1;
160 	d = sm_malloc_tagged_x(l, file, line, group);
161 	(void) sm_strlcpy(d, s, l);
162 	return d;
163 }
164 
165 #endif /* DO_NOT_USE_STRCPY */
166 
167