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> 12SM_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 33char * 34sm_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 60char * 61sm_strdup(s) 62 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 91char * 92sm_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 119char * 120sm_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 150char * 151sm_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