17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 51f6eb021SLiane Praza * Common Development and Distribution License (the "License"). 61f6eb021SLiane Praza * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22*cb174861Sjoyce mcintosh * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 237c478bd9Sstevel@tonic-gate */ 247c478bd9Sstevel@tonic-gate 257c478bd9Sstevel@tonic-gate #include "libuutil_common.h" 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #include <stdarg.h> 287c478bd9Sstevel@tonic-gate #include <stdio.h> 297c478bd9Sstevel@tonic-gate #include <stdlib.h> 307c478bd9Sstevel@tonic-gate #include <string.h> 317c478bd9Sstevel@tonic-gate 327c478bd9Sstevel@tonic-gate void * 337c478bd9Sstevel@tonic-gate uu_zalloc(size_t n) 347c478bd9Sstevel@tonic-gate { 357c478bd9Sstevel@tonic-gate void *p = malloc(n); 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate if (p == NULL) { 387c478bd9Sstevel@tonic-gate uu_set_error(UU_ERROR_SYSTEM); 397c478bd9Sstevel@tonic-gate return (NULL); 407c478bd9Sstevel@tonic-gate } 417c478bd9Sstevel@tonic-gate 427c478bd9Sstevel@tonic-gate (void) memset(p, 0, n); 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate return (p); 457c478bd9Sstevel@tonic-gate } 467c478bd9Sstevel@tonic-gate 477c478bd9Sstevel@tonic-gate void 487c478bd9Sstevel@tonic-gate uu_free(void *p) 497c478bd9Sstevel@tonic-gate { 507c478bd9Sstevel@tonic-gate free(p); 517c478bd9Sstevel@tonic-gate } 527c478bd9Sstevel@tonic-gate 537c478bd9Sstevel@tonic-gate char * 541f6eb021SLiane Praza uu_strdup(const char *str) 551f6eb021SLiane Praza { 561f6eb021SLiane Praza char *buf = NULL; 571f6eb021SLiane Praza 581f6eb021SLiane Praza if (str != NULL) { 591f6eb021SLiane Praza size_t sz; 601f6eb021SLiane Praza 611f6eb021SLiane Praza sz = strlen(str) + 1; 621f6eb021SLiane Praza buf = uu_zalloc(sz); 631f6eb021SLiane Praza if (buf != NULL) 641f6eb021SLiane Praza (void) memcpy(buf, str, sz); 651f6eb021SLiane Praza } 661f6eb021SLiane Praza return (buf); 671f6eb021SLiane Praza } 681f6eb021SLiane Praza 69*cb174861Sjoyce mcintosh /* 70*cb174861Sjoyce mcintosh * Duplicate up to n bytes of a string. Kind of sort of like 71*cb174861Sjoyce mcintosh * strdup(strlcpy(s, n)). 72*cb174861Sjoyce mcintosh */ 73*cb174861Sjoyce mcintosh char * 74*cb174861Sjoyce mcintosh uu_strndup(const char *s, size_t n) 75*cb174861Sjoyce mcintosh { 76*cb174861Sjoyce mcintosh size_t len; 77*cb174861Sjoyce mcintosh char *p; 78*cb174861Sjoyce mcintosh 79*cb174861Sjoyce mcintosh len = strnlen(s, n); 80*cb174861Sjoyce mcintosh p = uu_zalloc(len + 1); 81*cb174861Sjoyce mcintosh if (p == NULL) 82*cb174861Sjoyce mcintosh return (NULL); 83*cb174861Sjoyce mcintosh 84*cb174861Sjoyce mcintosh if (len > 0) 85*cb174861Sjoyce mcintosh (void) memcpy(p, s, len); 86*cb174861Sjoyce mcintosh p[len] = '\0'; 87*cb174861Sjoyce mcintosh 88*cb174861Sjoyce mcintosh return (p); 89*cb174861Sjoyce mcintosh } 90*cb174861Sjoyce mcintosh 91*cb174861Sjoyce mcintosh /* 92*cb174861Sjoyce mcintosh * Duplicate a block of memory. Combines malloc with memcpy, much as 93*cb174861Sjoyce mcintosh * strdup combines malloc, strlen, and strcpy. 94*cb174861Sjoyce mcintosh */ 95*cb174861Sjoyce mcintosh void * 96*cb174861Sjoyce mcintosh uu_memdup(const void *buf, size_t sz) 97*cb174861Sjoyce mcintosh { 98*cb174861Sjoyce mcintosh void *p; 99*cb174861Sjoyce mcintosh 100*cb174861Sjoyce mcintosh p = uu_zalloc(sz); 101*cb174861Sjoyce mcintosh if (p == NULL) 102*cb174861Sjoyce mcintosh return (NULL); 103*cb174861Sjoyce mcintosh (void) memcpy(p, buf, sz); 104*cb174861Sjoyce mcintosh return (p); 105*cb174861Sjoyce mcintosh } 106*cb174861Sjoyce mcintosh 1071f6eb021SLiane Praza char * 1087c478bd9Sstevel@tonic-gate uu_msprintf(const char *format, ...) 1097c478bd9Sstevel@tonic-gate { 1107c478bd9Sstevel@tonic-gate va_list args; 1117c478bd9Sstevel@tonic-gate char attic[1]; 1127c478bd9Sstevel@tonic-gate uint_t M, m; 1137c478bd9Sstevel@tonic-gate char *b; 1147c478bd9Sstevel@tonic-gate 1157c478bd9Sstevel@tonic-gate va_start(args, format); 1167c478bd9Sstevel@tonic-gate M = vsnprintf(attic, 1, format, args); 1177c478bd9Sstevel@tonic-gate va_end(args); 1187c478bd9Sstevel@tonic-gate 1197c478bd9Sstevel@tonic-gate for (;;) { 1207c478bd9Sstevel@tonic-gate m = M; 1217c478bd9Sstevel@tonic-gate if ((b = uu_zalloc(m + 1)) == NULL) 1227c478bd9Sstevel@tonic-gate return (NULL); 1237c478bd9Sstevel@tonic-gate 1247c478bd9Sstevel@tonic-gate va_start(args, format); 1257c478bd9Sstevel@tonic-gate M = vsnprintf(b, m + 1, format, args); 1267c478bd9Sstevel@tonic-gate va_end(args); 1277c478bd9Sstevel@tonic-gate 1287c478bd9Sstevel@tonic-gate if (M == m) 1297c478bd9Sstevel@tonic-gate break; /* sizes match */ 1307c478bd9Sstevel@tonic-gate 1317c478bd9Sstevel@tonic-gate uu_free(b); 1327c478bd9Sstevel@tonic-gate } 1337c478bd9Sstevel@tonic-gate 1347c478bd9Sstevel@tonic-gate return (b); 1357c478bd9Sstevel@tonic-gate } 136