190792Sgshapiro/*
2261363Sgshapiro * Copyright (c) 2000-2001, 2003 Proofpoint, Inc. and its suppliers.
390792Sgshapiro *	All rights reserved.
490792Sgshapiro *
590792Sgshapiro * By using this file, you agree to the terms and conditions set
690792Sgshapiro * forth in the LICENSE file which can be found at the top level of
790792Sgshapiro * the sendmail distribution.
890792Sgshapiro *
990792Sgshapiro */
1090792Sgshapiro
1190792Sgshapiro#include <sm/gen.h>
12266692SgshapiroSM_RCSID("@(#)$Id: strdup.c,v 1.16 2013-11-22 20:51:43 ca Exp $")
1390792Sgshapiro
1490792Sgshapiro#include <sm/heap.h>
1590792Sgshapiro#include <sm/string.h>
1690792Sgshapiro
1790792Sgshapiro/*
1890792Sgshapiro**  SM_STRNDUP_X -- Duplicate a string of a given length
1990792Sgshapiro**
2090792Sgshapiro**	Allocates memory and copies source string (of given length) into it.
2190792Sgshapiro**
2290792Sgshapiro**	Parameters:
2390792Sgshapiro**		s -- string to copy.
2490792Sgshapiro**		n -- length to copy.
2590792Sgshapiro**
2690792Sgshapiro**	Returns:
2790792Sgshapiro**		copy of string, raises exception if out of memory.
2890792Sgshapiro**
2990792Sgshapiro**	Side Effects:
3090792Sgshapiro**		allocate memory for new string.
3190792Sgshapiro*/
3290792Sgshapiro
3390792Sgshapirochar *
3490792Sgshapirosm_strndup_x(s, n)
3590792Sgshapiro	const char *s;
3690792Sgshapiro	size_t n;
3790792Sgshapiro{
3890792Sgshapiro	char *d = sm_malloc_x(n + 1);
3990792Sgshapiro
4090792Sgshapiro	(void) memcpy(d, s, n);
4190792Sgshapiro	d[n] = '\0';
4290792Sgshapiro	return d;
4390792Sgshapiro}
4490792Sgshapiro
4590792Sgshapiro/*
4690792Sgshapiro**  SM_STRDUP -- Duplicate a string
4790792Sgshapiro**
4890792Sgshapiro**	Allocates memory and copies source string into it.
4990792Sgshapiro**
5090792Sgshapiro**	Parameters:
5190792Sgshapiro**		s -- string to copy.
5290792Sgshapiro**
5390792Sgshapiro**	Returns:
5490792Sgshapiro**		copy of string, NULL if out of memory.
5590792Sgshapiro**
5690792Sgshapiro**	Side Effects:
5790792Sgshapiro**		allocate memory for new string.
5890792Sgshapiro*/
5990792Sgshapiro
6090792Sgshapirochar *
6190792Sgshapirosm_strdup(s)
6290792Sgshapiro	char *s;
6390792Sgshapiro{
6490792Sgshapiro	size_t l;
6590792Sgshapiro	char *d;
6690792Sgshapiro
6790792Sgshapiro	l = strlen(s) + 1;
6890792Sgshapiro	d = sm_malloc_tagged(l, "sm_strdup", 0, sm_heap_group());
6990792Sgshapiro	if (d != NULL)
7090792Sgshapiro		(void) sm_strlcpy(d, s, l);
7190792Sgshapiro	return d;
7290792Sgshapiro}
73132943Sgshapiro
74132943Sgshapiro#if DO_NOT_USE_STRCPY
75132943Sgshapiro
76132943Sgshapiro/*
77132943Sgshapiro**  SM_STRDUP_X -- Duplicate a string
78132943Sgshapiro**
79132943Sgshapiro**	Allocates memory and copies source string into it.
80132943Sgshapiro**
81132943Sgshapiro**	Parameters:
82132943Sgshapiro**		s -- string to copy.
83132943Sgshapiro**
84132943Sgshapiro**	Returns:
85132943Sgshapiro**		copy of string, exception if out of memory.
86132943Sgshapiro**
87132943Sgshapiro**	Side Effects:
88132943Sgshapiro**		allocate memory for new string.
89132943Sgshapiro*/
90132943Sgshapiro
91132943Sgshapirochar *
92132943Sgshapirosm_strdup_x(s)
93132943Sgshapiro	const char *s;
94132943Sgshapiro{
95132943Sgshapiro	size_t l;
96132943Sgshapiro	char *d;
97132943Sgshapiro
98132943Sgshapiro	l = strlen(s) + 1;
99132943Sgshapiro	d = sm_malloc_tagged_x(l, "sm_strdup_x", 0, sm_heap_group());
100132943Sgshapiro	(void) sm_strlcpy(d, s, l);
101132943Sgshapiro	return d;
102132943Sgshapiro}
103132943Sgshapiro
104132943Sgshapiro/*
105132943Sgshapiro**  SM_PSTRDUP_X -- Duplicate a string (using "permanent" memory)
106132943Sgshapiro**
107132943Sgshapiro**	Allocates memory and copies source string into it.
108132943Sgshapiro**
109132943Sgshapiro**	Parameters:
110132943Sgshapiro**		s -- string to copy.
111132943Sgshapiro**
112132943Sgshapiro**	Returns:
113132943Sgshapiro**		copy of string, exception if out of memory.
114132943Sgshapiro**
115132943Sgshapiro**	Side Effects:
116132943Sgshapiro**		allocate memory for new string.
117132943Sgshapiro*/
118132943Sgshapiro
119132943Sgshapirochar *
120132943Sgshapirosm_pstrdup_x(s)
121132943Sgshapiro	const char *s;
122132943Sgshapiro{
123132943Sgshapiro	size_t l;
124132943Sgshapiro	char *d;
125132943Sgshapiro
126132943Sgshapiro	l = strlen(s) + 1;
127132943Sgshapiro	d = sm_pmalloc_x(l);
128132943Sgshapiro	(void) sm_strlcpy(d, s, l);
129132943Sgshapiro	return d;
130132943Sgshapiro}
131132943Sgshapiro
132132943Sgshapiro/*
133132943Sgshapiro**  SM_STRDUP_X -- Duplicate a string
134132943Sgshapiro**
135132943Sgshapiro**	Allocates memory and copies source string into it.
136132943Sgshapiro**
137132943Sgshapiro**	Parameters:
138132943Sgshapiro**		s -- string to copy.
139132943Sgshapiro**		file -- name of source file
140132943Sgshapiro**		line -- line in source file
141132943Sgshapiro**		group -- heap group
142132943Sgshapiro**
143132943Sgshapiro**	Returns:
144132943Sgshapiro**		copy of string, exception if out of memory.
145132943Sgshapiro**
146132943Sgshapiro**	Side Effects:
147132943Sgshapiro**		allocate memory for new string.
148132943Sgshapiro*/
149132943Sgshapiro
150132943Sgshapirochar *
151132943Sgshapirosm_strdup_tagged_x(s, file, line, group)
152132943Sgshapiro	const char *s;
153132943Sgshapiro	char *file;
154132943Sgshapiro	int line, group;
155132943Sgshapiro{
156132943Sgshapiro	size_t l;
157132943Sgshapiro	char *d;
158132943Sgshapiro
159132943Sgshapiro	l = strlen(s) + 1;
160132943Sgshapiro	d = sm_malloc_tagged_x(l, file, line, group);
161132943Sgshapiro	(void) sm_strlcpy(d, s, l);
162132943Sgshapiro	return d;
163132943Sgshapiro}
164132943Sgshapiro
165132943Sgshapiro#endif /* DO_NOT_USE_STRCPY */
166132943Sgshapiro
167