1b3127a2dSJohn Baldwin /*- 2b3127a2dSJohn Baldwin * SPDX-License-Identifier: BSD-2-Clause 3b3127a2dSJohn Baldwin * 4b3127a2dSJohn Baldwin * Copyright (c) 2025 Chelsio Communications, Inc. 5b3127a2dSJohn Baldwin * Written by: John Baldwin <jhb@FreeBSD.org> 6b3127a2dSJohn Baldwin */ 7b3127a2dSJohn Baldwin 8b3127a2dSJohn Baldwin #ifndef __LIBUTILPP_HH__ 9b3127a2dSJohn Baldwin #define __LIBUTILPP_HH__ 10b3127a2dSJohn Baldwin 11*22ce7be7SJohn Baldwin #include <netdb.h> 12*22ce7be7SJohn Baldwin 13b3127a2dSJohn Baldwin #include <cstdarg> 14b3127a2dSJohn Baldwin #include <cstdio> 15b3127a2dSJohn Baldwin #include <cstdlib> 16b3127a2dSJohn Baldwin #include <memory> 17b3127a2dSJohn Baldwin 18b3127a2dSJohn Baldwin namespace freebsd { 19b3127a2dSJohn Baldwin /* 20b3127a2dSJohn Baldwin * FILE_up is a std::unique_ptr<> for FILE objects which uses 21b3127a2dSJohn Baldwin * fclose() to destroy the wrapped pointer. 22b3127a2dSJohn Baldwin */ 23b3127a2dSJohn Baldwin struct fclose_deleter { 24b3127a2dSJohn Baldwin void operator() (std::FILE *fp) const 25b3127a2dSJohn Baldwin { 26b3127a2dSJohn Baldwin std::fclose(fp); 27b3127a2dSJohn Baldwin } 28b3127a2dSJohn Baldwin }; 29b3127a2dSJohn Baldwin 30b3127a2dSJohn Baldwin using FILE_up = std::unique_ptr<std::FILE, fclose_deleter>; 31b3127a2dSJohn Baldwin 32b3127a2dSJohn Baldwin /* 33*22ce7be7SJohn Baldwin * addrinfo_up is a std::unique_ptr<> which uses 34*22ce7be7SJohn Baldwin * freeaddrinfo() to destroy the wrapped pointer. It is 35*22ce7be7SJohn Baldwin * intended to wrap arrays allocated by getaddrinfo(). 36*22ce7be7SJohn Baldwin */ 37*22ce7be7SJohn Baldwin struct freeaddrinfo_deleter { 38*22ce7be7SJohn Baldwin void operator() (struct addrinfo *ai) const 39*22ce7be7SJohn Baldwin { 40*22ce7be7SJohn Baldwin freeaddrinfo(ai); 41*22ce7be7SJohn Baldwin } 42*22ce7be7SJohn Baldwin }; 43*22ce7be7SJohn Baldwin 44*22ce7be7SJohn Baldwin using addrinfo_up = std::unique_ptr<addrinfo, freeaddrinfo_deleter>; 45*22ce7be7SJohn Baldwin 46*22ce7be7SJohn Baldwin /* 47b3127a2dSJohn Baldwin * malloc_up<T> is a std::unique_ptr<> which uses free() to 48b3127a2dSJohn Baldwin * destroy the wrapped pointer. This can be used to wrap 49b3127a2dSJohn Baldwin * pointers allocated implicitly by malloc() such as those 50b3127a2dSJohn Baldwin * returned by strdup(). 51b3127a2dSJohn Baldwin */ 52b3127a2dSJohn Baldwin template <class T> 53b3127a2dSJohn Baldwin struct free_deleter { 54b3127a2dSJohn Baldwin void operator() (T *p) const 55b3127a2dSJohn Baldwin { 56b3127a2dSJohn Baldwin std::free(p); 57b3127a2dSJohn Baldwin } 58b3127a2dSJohn Baldwin }; 59b3127a2dSJohn Baldwin 60b3127a2dSJohn Baldwin template <class T> 61b3127a2dSJohn Baldwin using malloc_up = std::unique_ptr<T, free_deleter<T>>; 62b3127a2dSJohn Baldwin 63b3127a2dSJohn Baldwin /* 64b3127a2dSJohn Baldwin * Returns a std::string containing the same output as 65b3127a2dSJohn Baldwin * sprintf(). Throws std::bad_alloc if an error occurs. 66b3127a2dSJohn Baldwin */ 67b3127a2dSJohn Baldwin std::string stringf(const char *fmt, ...) __printflike(1, 2); 68b3127a2dSJohn Baldwin std::string stringf(const char *fmt, std::va_list ap); 69b3127a2dSJohn Baldwin } 70b3127a2dSJohn Baldwin 71b3127a2dSJohn Baldwin #endif /* !__LIBUTILPP_HH__ */ 72