190792Sgshapiro/* 2261194Sgshapiro * 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> 12266527SgshapiroSM_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