1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30
31
32 #include <stdio.h>
33 #include <stdarg.h>
34 #include <unistd.h>
35 #include <string.h>
36 #include <stdlib.h>
37 #include <errno.h>
38 #include "pkglocale.h"
39 #include "pkgerr.h"
40
41 static char *ProgName = NULL; /* Set via set_prog_name() */
42
43
44 static void
error_and_exit(int error_num)45 error_and_exit(int error_num)
46 {
47 (void) fprintf(stderr, "%d\n", error_num);
48 exit(99);
49 }
50
51 static void (*fatal_err_func)() = &error_and_exit;
52
53 char *
set_prog_name(char * name)54 set_prog_name(char *name)
55 {
56 if (name == NULL)
57 return (NULL);
58 if ((name = strdup(name)) == NULL) {
59 (void) fprintf(stderr,
60 "set_prog_name(): strdup(name) failed.\n");
61 exit(1);
62 }
63 ProgName = strrchr(name, '/');
64 if (!ProgName++)
65 ProgName = name;
66
67 return (ProgName);
68 }
69
70 char *
get_prog_name(void)71 get_prog_name(void)
72 {
73 return (ProgName);
74 }
75
76
77 /*PRINTFLIKE1*/
78 void
progerr(char * fmt,...)79 progerr(char *fmt, ...)
80 {
81 va_list ap;
82
83 va_start(ap, fmt);
84
85 if (ProgName && *ProgName)
86 (void) fprintf(stderr, pkg_gt("%s: ERROR: "), ProgName);
87 else
88 (void) fprintf(stderr, pkg_gt(" ERROR: "));
89
90 (void) vfprintf(stderr, fmt, ap);
91
92 va_end(ap);
93
94 (void) fprintf(stderr, "\n");
95 }
96
97 void
pkgerr(PKG_ERR * err)98 pkgerr(PKG_ERR *err)
99 {
100 int i;
101
102 for (i = 0; i < pkgerr_num(err); i++) {
103 progerr("%s", pkgerr_get(err, i));
104 }
105 }
106
107
108 /*
109 * set_memalloc_failure_func()
110 * Allows an appliation to specify the function to be called when
111 * a memory allocation function fails.
112 * Parameters:
113 * (*alloc_proc)(int) - specifies the function to call if fatal error
114 * (such as being unable to allocate memory) occurs.
115 * Return:
116 * none
117 * Status:
118 * Public
119 */
120 void
set_memalloc_failure_func(void (* alloc_proc)(int))121 set_memalloc_failure_func(void (*alloc_proc)(int))
122 {
123 if (alloc_proc != (void (*)())NULL)
124 fatal_err_func = alloc_proc;
125 }
126
127 /*
128 * xmalloc()
129 * Alloc 'size' bytes from heap using malloc()
130 * Parameters:
131 * size - number of bytes to malloc
132 * Return:
133 * NULL - malloc() failure
134 * void * - pointer to allocated structure
135 * Status:
136 * public
137 */
138 void *
xmalloc(size_t size)139 xmalloc(size_t size)
140 {
141 void *tmp;
142
143 if ((tmp = (void *) malloc(size)) == NULL) {
144 fatal_err_func(errno);
145 return (NULL);
146 } else
147 return (tmp);
148 }
149
150 /*
151 * xrealloc()
152 * Calls realloc() with the specfied parameters. xrealloc()
153 * checks for realloc failures and adjusts the return value
154 * automatically.
155 * Parameters:
156 * ptr - pointer to existing data block
157 * size - number of bytes additional
158 * Return:
159 * NULL - realloc() failed
160 * void * - pointer to realloc'd structured
161 * Status:
162 * public
163 */
164 void *
xrealloc(void * ptr,size_t size)165 xrealloc(void *ptr, size_t size)
166 {
167 void *tmp;
168
169 if ((tmp = (void *)realloc(ptr, size)) == (void *)NULL) {
170 fatal_err_func(errno);
171 return ((void *)NULL);
172 } else
173 return (tmp);
174 }
175
176 /*
177 * xstrdup()
178 * Allocate space for the string from the heap, copy 'str' into it,
179 * and return a pointer to it.
180 * Parameters:
181 * str - string to duplicate
182 * Return:
183 * NULL - duplication failed or 'str' was NULL
184 * char * - pointer to newly allocated/initialized structure
185 * Status:
186 * public
187 */
188 char *
xstrdup(char * str)189 xstrdup(char *str)
190 {
191 char *tmp;
192
193 if (str == NULL)
194 return ((char *)NULL);
195
196 if ((tmp = strdup(str)) == NULL) {
197 fatal_err_func(errno);
198 return ((char *)NULL);
199 } else
200 return (tmp);
201 }
202