xref: /onnv-gate/usr/src/cmd/svr4pkg/libinst/depchk.c (revision 9781:ccf49524d5dc)
1*9781SMoriah.Waterland@Sun.COM /*
2*9781SMoriah.Waterland@Sun.COM  * CDDL HEADER START
3*9781SMoriah.Waterland@Sun.COM  *
4*9781SMoriah.Waterland@Sun.COM  * The contents of this file are subject to the terms of the
5*9781SMoriah.Waterland@Sun.COM  * Common Development and Distribution License (the "License").
6*9781SMoriah.Waterland@Sun.COM  * You may not use this file except in compliance with the License.
7*9781SMoriah.Waterland@Sun.COM  *
8*9781SMoriah.Waterland@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9781SMoriah.Waterland@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*9781SMoriah.Waterland@Sun.COM  * See the License for the specific language governing permissions
11*9781SMoriah.Waterland@Sun.COM  * and limitations under the License.
12*9781SMoriah.Waterland@Sun.COM  *
13*9781SMoriah.Waterland@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*9781SMoriah.Waterland@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9781SMoriah.Waterland@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*9781SMoriah.Waterland@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*9781SMoriah.Waterland@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9781SMoriah.Waterland@Sun.COM  *
19*9781SMoriah.Waterland@Sun.COM  * CDDL HEADER END
20*9781SMoriah.Waterland@Sun.COM  */
21*9781SMoriah.Waterland@Sun.COM 
22*9781SMoriah.Waterland@Sun.COM /*
23*9781SMoriah.Waterland@Sun.COM  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24*9781SMoriah.Waterland@Sun.COM  * Use is subject to license terms.
25*9781SMoriah.Waterland@Sun.COM  */
26*9781SMoriah.Waterland@Sun.COM 
27*9781SMoriah.Waterland@Sun.COM 
28*9781SMoriah.Waterland@Sun.COM /*
29*9781SMoriah.Waterland@Sun.COM  * System includes
30*9781SMoriah.Waterland@Sun.COM  */
31*9781SMoriah.Waterland@Sun.COM 
32*9781SMoriah.Waterland@Sun.COM #include <stdio.h>
33*9781SMoriah.Waterland@Sun.COM #include <limits.h>
34*9781SMoriah.Waterland@Sun.COM #include <string.h>
35*9781SMoriah.Waterland@Sun.COM #include <stdlib.h>
36*9781SMoriah.Waterland@Sun.COM #include <unistd.h>
37*9781SMoriah.Waterland@Sun.COM #include <errno.h>
38*9781SMoriah.Waterland@Sun.COM #include <sys/types.h>
39*9781SMoriah.Waterland@Sun.COM #include <locale.h>
40*9781SMoriah.Waterland@Sun.COM #include <libintl.h>
41*9781SMoriah.Waterland@Sun.COM #include <assert.h>
42*9781SMoriah.Waterland@Sun.COM 
43*9781SMoriah.Waterland@Sun.COM /*
44*9781SMoriah.Waterland@Sun.COM  * local pkg command library includes
45*9781SMoriah.Waterland@Sun.COM  */
46*9781SMoriah.Waterland@Sun.COM 
47*9781SMoriah.Waterland@Sun.COM #include "libinst.h"
48*9781SMoriah.Waterland@Sun.COM #include "messages.h"
49*9781SMoriah.Waterland@Sun.COM 
50*9781SMoriah.Waterland@Sun.COM /*
51*9781SMoriah.Waterland@Sun.COM  * forward declarations
52*9781SMoriah.Waterland@Sun.COM  */
53*9781SMoriah.Waterland@Sun.COM 
54*9781SMoriah.Waterland@Sun.COM static int
55*9781SMoriah.Waterland@Sun.COM collectError(int *r_numZones, char **r_zoneNames, char *a_packageName,
56*9781SMoriah.Waterland@Sun.COM 	depckl_t *a_dck, int a_depIndex, depckErrorRecord_t *a_eir,
57*9781SMoriah.Waterland@Sun.COM 	int a_errIndex);
58*9781SMoriah.Waterland@Sun.COM 
59*9781SMoriah.Waterland@Sun.COM /*
60*9781SMoriah.Waterland@Sun.COM  * *****************************************************************************
61*9781SMoriah.Waterland@Sun.COM  * global external (public) functions
62*9781SMoriah.Waterland@Sun.COM  * *****************************************************************************
63*9781SMoriah.Waterland@Sun.COM  */
64*9781SMoriah.Waterland@Sun.COM 
65*9781SMoriah.Waterland@Sun.COM int
depchkReportErrors(depckl_t * a_dck)66*9781SMoriah.Waterland@Sun.COM depchkReportErrors(depckl_t *a_dck)
67*9781SMoriah.Waterland@Sun.COM {
68*9781SMoriah.Waterland@Sun.COM 	char	*packageName;
69*9781SMoriah.Waterland@Sun.COM 	char	*zonenames;
70*9781SMoriah.Waterland@Sun.COM 	char	msgbuf[4096];
71*9781SMoriah.Waterland@Sun.COM 	int	err;
72*9781SMoriah.Waterland@Sun.COM 	int	i;
73*9781SMoriah.Waterland@Sun.COM 	int	numzones = 0;
74*9781SMoriah.Waterland@Sun.COM 
75*9781SMoriah.Waterland@Sun.COM 	/* entry assertions */
76*9781SMoriah.Waterland@Sun.COM 
77*9781SMoriah.Waterland@Sun.COM 	assert(a_dck != (depckl_t *)NULL);
78*9781SMoriah.Waterland@Sun.COM 
79*9781SMoriah.Waterland@Sun.COM 	/* entry debugging info */
80*9781SMoriah.Waterland@Sun.COM 
81*9781SMoriah.Waterland@Sun.COM 	echoDebug(DBG_DEPCHK_ENTRY);
82*9781SMoriah.Waterland@Sun.COM 
83*9781SMoriah.Waterland@Sun.COM 	zonenames = (char *)NULL;
84*9781SMoriah.Waterland@Sun.COM 
85*9781SMoriah.Waterland@Sun.COM 	/* go through dependency table, collect, collapse, report errors */
86*9781SMoriah.Waterland@Sun.COM 
87*9781SMoriah.Waterland@Sun.COM 	for (i = 0; a_dck[i].name != (char *)NULL; i++) {
88*9781SMoriah.Waterland@Sun.COM 		int	j;
89*9781SMoriah.Waterland@Sun.COM 		depckError_t	*erc;
90*9781SMoriah.Waterland@Sun.COM 
91*9781SMoriah.Waterland@Sun.COM 		if (zonenames != (char *)NULL) {
92*9781SMoriah.Waterland@Sun.COM 			free(zonenames);
93*9781SMoriah.Waterland@Sun.COM 			zonenames = (char *)NULL;
94*9781SMoriah.Waterland@Sun.COM 		}
95*9781SMoriah.Waterland@Sun.COM 
96*9781SMoriah.Waterland@Sun.COM 		erc = a_dck[i].record;
97*9781SMoriah.Waterland@Sun.COM 		if (erc->er_numEntries == 0) {
98*9781SMoriah.Waterland@Sun.COM 			continue;
99*9781SMoriah.Waterland@Sun.COM 		}
100*9781SMoriah.Waterland@Sun.COM 
101*9781SMoriah.Waterland@Sun.COM 		for (j = 0; j < erc->er_numEntries; j++) {
102*9781SMoriah.Waterland@Sun.COM 			int	k;
103*9781SMoriah.Waterland@Sun.COM 			depckErrorRecord_t *eir;
104*9781SMoriah.Waterland@Sun.COM 
105*9781SMoriah.Waterland@Sun.COM 			if (zonenames != (char *)NULL) {
106*9781SMoriah.Waterland@Sun.COM 				free(zonenames);
107*9781SMoriah.Waterland@Sun.COM 				zonenames = (char *)NULL;
108*9781SMoriah.Waterland@Sun.COM 			}
109*9781SMoriah.Waterland@Sun.COM 
110*9781SMoriah.Waterland@Sun.COM 			eir = &erc->er_theEntries[j];
111*9781SMoriah.Waterland@Sun.COM 			packageName = eir->ier_packageName;
112*9781SMoriah.Waterland@Sun.COM 			for (k = 0; k < eir->ier_numZones; k++) {
113*9781SMoriah.Waterland@Sun.COM 				int err;
114*9781SMoriah.Waterland@Sun.COM 
115*9781SMoriah.Waterland@Sun.COM 				err = collectError(&numzones, &zonenames,
116*9781SMoriah.Waterland@Sun.COM 					packageName, a_dck, i, eir, k);
117*9781SMoriah.Waterland@Sun.COM 				if (err != 0) {
118*9781SMoriah.Waterland@Sun.COM 					if (zonenames != (char *)NULL) {
119*9781SMoriah.Waterland@Sun.COM 						free(zonenames);
120*9781SMoriah.Waterland@Sun.COM 						zonenames = (char *)NULL;
121*9781SMoriah.Waterland@Sun.COM 					}
122*9781SMoriah.Waterland@Sun.COM 					return (err);
123*9781SMoriah.Waterland@Sun.COM 				}
124*9781SMoriah.Waterland@Sun.COM 			}
125*9781SMoriah.Waterland@Sun.COM 
126*9781SMoriah.Waterland@Sun.COM 			if (a_dck[i].ignore_values == (char *)NULL) {
127*9781SMoriah.Waterland@Sun.COM 				continue;
128*9781SMoriah.Waterland@Sun.COM 			}
129*9781SMoriah.Waterland@Sun.COM 
130*9781SMoriah.Waterland@Sun.COM 			if (a_dck[i].err_msg == (char **)NULL) {
131*9781SMoriah.Waterland@Sun.COM 				(void) snprintf(msgbuf, sizeof (msgbuf),
132*9781SMoriah.Waterland@Sun.COM 					ERR_DEPENDENCY_IGNORED, a_dck[i].name,
133*9781SMoriah.Waterland@Sun.COM 					packageName,
134*9781SMoriah.Waterland@Sun.COM 					numzones == 1 ? "zone" : "zones",
135*9781SMoriah.Waterland@Sun.COM 					zonenames ? zonenames : "?");
136*9781SMoriah.Waterland@Sun.COM 			} else {
137*9781SMoriah.Waterland@Sun.COM 				/* LINTED variable format specifier to ... */
138*9781SMoriah.Waterland@Sun.COM 				(void) snprintf(msgbuf, sizeof (msgbuf),
139*9781SMoriah.Waterland@Sun.COM 					*a_dck[i].err_msg, "package",
140*9781SMoriah.Waterland@Sun.COM 					packageName,
141*9781SMoriah.Waterland@Sun.COM 					numzones == 1 ? "zone" : "zones",
142*9781SMoriah.Waterland@Sun.COM 					zonenames ? zonenames : "??");
143*9781SMoriah.Waterland@Sun.COM 			}
144*9781SMoriah.Waterland@Sun.COM 
145*9781SMoriah.Waterland@Sun.COM 			if (a_dck[i].depcklFunc != NULL) {
146*9781SMoriah.Waterland@Sun.COM 				/* call check function */
147*9781SMoriah.Waterland@Sun.COM 				err = (a_dck[i].depcklFunc)(msgbuf,
148*9781SMoriah.Waterland@Sun.COM 					packageName);
149*9781SMoriah.Waterland@Sun.COM 				echoDebug(DBG_DEPCHK_REPORT_ERROR,
150*9781SMoriah.Waterland@Sun.COM 					a_dck[i].ignore_values, err,
151*9781SMoriah.Waterland@Sun.COM 					packageName, msgbuf);
152*9781SMoriah.Waterland@Sun.COM 				if (err != 0) {
153*9781SMoriah.Waterland@Sun.COM 					if (zonenames != (char *)NULL) {
154*9781SMoriah.Waterland@Sun.COM 						free(zonenames);
155*9781SMoriah.Waterland@Sun.COM 						zonenames = (char *)NULL;
156*9781SMoriah.Waterland@Sun.COM 					}
157*9781SMoriah.Waterland@Sun.COM 					return (err);
158*9781SMoriah.Waterland@Sun.COM 				}
159*9781SMoriah.Waterland@Sun.COM 			} else {
160*9781SMoriah.Waterland@Sun.COM 				/* no check function - just report message */
161*9781SMoriah.Waterland@Sun.COM 				echoDebug(DBG_DEPCHK_IGNORE_ERROR,
162*9781SMoriah.Waterland@Sun.COM 					a_dck[i].ignore_values, packageName,
163*9781SMoriah.Waterland@Sun.COM 					msgbuf);
164*9781SMoriah.Waterland@Sun.COM 				ptext(stderr, "\\n%s", msgbuf);
165*9781SMoriah.Waterland@Sun.COM 			}
166*9781SMoriah.Waterland@Sun.COM 		}
167*9781SMoriah.Waterland@Sun.COM 	}
168*9781SMoriah.Waterland@Sun.COM 
169*9781SMoriah.Waterland@Sun.COM 	if (zonenames != (char *)NULL) {
170*9781SMoriah.Waterland@Sun.COM 		free(zonenames);
171*9781SMoriah.Waterland@Sun.COM 		zonenames = (char *)NULL;
172*9781SMoriah.Waterland@Sun.COM 	}
173*9781SMoriah.Waterland@Sun.COM 
174*9781SMoriah.Waterland@Sun.COM 	return (0);
175*9781SMoriah.Waterland@Sun.COM }
176*9781SMoriah.Waterland@Sun.COM 
177*9781SMoriah.Waterland@Sun.COM void
depchkRecordError(depckError_t * a_erc,char * a_pkginst,char * a_zoneName,char * a_value)178*9781SMoriah.Waterland@Sun.COM depchkRecordError(depckError_t *a_erc, char *a_pkginst,
179*9781SMoriah.Waterland@Sun.COM 	char *a_zoneName, char *a_value)
180*9781SMoriah.Waterland@Sun.COM {
181*9781SMoriah.Waterland@Sun.COM 	depckErrorRecord_t *erc;
182*9781SMoriah.Waterland@Sun.COM 	int		i;
183*9781SMoriah.Waterland@Sun.COM 
184*9781SMoriah.Waterland@Sun.COM 	/*
185*9781SMoriah.Waterland@Sun.COM 	 * create new error record and entry if first entry
186*9781SMoriah.Waterland@Sun.COM 	 * record will look like this:
187*9781SMoriah.Waterland@Sun.COM 	 * err->er_#entry=1
188*9781SMoriah.Waterland@Sun.COM 	 * err->entry[0]->record->ier_numZones=1
189*9781SMoriah.Waterland@Sun.COM 	 * err->entry[0]->record->ier_packageName=a_pkginst
190*9781SMoriah.Waterland@Sun.COM 	 * err->entry[0]->record->ier_zones[0]=a_zoneName
191*9781SMoriah.Waterland@Sun.COM 	 * err->entry[0]->record->ier_values[0]=a_value
192*9781SMoriah.Waterland@Sun.COM 	 */
193*9781SMoriah.Waterland@Sun.COM 
194*9781SMoriah.Waterland@Sun.COM 	if (a_erc->er_numEntries == 0) {
195*9781SMoriah.Waterland@Sun.COM 		depckErrorRecord_t	*eir;
196*9781SMoriah.Waterland@Sun.COM 
197*9781SMoriah.Waterland@Sun.COM 		eir = (depckErrorRecord_t *)calloc(1,
198*9781SMoriah.Waterland@Sun.COM 					sizeof (depckErrorRecord_t));
199*9781SMoriah.Waterland@Sun.COM 		eir->ier_packageName = strdup(a_pkginst);
200*9781SMoriah.Waterland@Sun.COM 		eir->ier_numZones = 1;
201*9781SMoriah.Waterland@Sun.COM 		eir->ier_zones = (char **)calloc(1, sizeof (char **));
202*9781SMoriah.Waterland@Sun.COM 		(eir->ier_zones)[eir->ier_numZones-1] = strdup(a_zoneName);
203*9781SMoriah.Waterland@Sun.COM 		eir->ier_values = (char **)calloc(1, sizeof (char *));
204*9781SMoriah.Waterland@Sun.COM 		(eir->ier_values)[eir->ier_numZones-1] = strdup(a_value);
205*9781SMoriah.Waterland@Sun.COM 
206*9781SMoriah.Waterland@Sun.COM 		a_erc->er_numEntries = 1;
207*9781SMoriah.Waterland@Sun.COM 		a_erc->er_theEntries = eir;
208*9781SMoriah.Waterland@Sun.COM 
209*9781SMoriah.Waterland@Sun.COM 		echoDebug(DBG_DEPCHK_RECORD_ERROR, (long)a_erc, a_pkginst,
210*9781SMoriah.Waterland@Sun.COM 					a_zoneName, a_value);
211*9781SMoriah.Waterland@Sun.COM 
212*9781SMoriah.Waterland@Sun.COM 		return;
213*9781SMoriah.Waterland@Sun.COM 	}
214*9781SMoriah.Waterland@Sun.COM 
215*9781SMoriah.Waterland@Sun.COM 	/* see if this package already has an entry if so add zone to list */
216*9781SMoriah.Waterland@Sun.COM 
217*9781SMoriah.Waterland@Sun.COM 	for (i = 0; i < a_erc->er_numEntries; i++) {
218*9781SMoriah.Waterland@Sun.COM 		erc = &a_erc->er_theEntries[i];
219*9781SMoriah.Waterland@Sun.COM 
220*9781SMoriah.Waterland@Sun.COM 		if (strcmp(erc->ier_packageName, a_pkginst) != 0) {
221*9781SMoriah.Waterland@Sun.COM 			continue;
222*9781SMoriah.Waterland@Sun.COM 		}
223*9781SMoriah.Waterland@Sun.COM 
224*9781SMoriah.Waterland@Sun.COM 		echoDebug(DBG_DEPCHK_RECORD_ZERROR, (long)a_erc, a_zoneName,
225*9781SMoriah.Waterland@Sun.COM 			a_value, erc->ier_packageName, erc->ier_numZones,
226*9781SMoriah.Waterland@Sun.COM 			erc->ier_zones[0]);
227*9781SMoriah.Waterland@Sun.COM 
228*9781SMoriah.Waterland@Sun.COM 		/*
229*9781SMoriah.Waterland@Sun.COM 		 * this package already has an entry - add zone to
230*9781SMoriah.Waterland@Sun.COM 		 * existing package entry the modified records will
231*9781SMoriah.Waterland@Sun.COM 		 * look like this:
232*9781SMoriah.Waterland@Sun.COM 		 * err->er_#entry++;
233*9781SMoriah.Waterland@Sun.COM 		 * err->entry[0]->...
234*9781SMoriah.Waterland@Sun.COM 		 * err->entry[i]->
235*9781SMoriah.Waterland@Sun.COM 		 * -------------->record->
236*9781SMoriah.Waterland@Sun.COM 		 * ---------------------->ier_numZones++;
237*9781SMoriah.Waterland@Sun.COM 		 * ---------------------->ier_packageName=a_pkginst
238*9781SMoriah.Waterland@Sun.COM 		 * ---------------------->ier_zones[0]=...
239*9781SMoriah.Waterland@Sun.COM 		 * ---------------------->ier_zones[...]=...
240*9781SMoriah.Waterland@Sun.COM 		 * ---------------------->ier_zones[ier_numZones-1]=a_zoneName
241*9781SMoriah.Waterland@Sun.COM 		 * ---------------------->ier_values[0]=...
242*9781SMoriah.Waterland@Sun.COM 		 * ---------------------->ier_values[...]=...
243*9781SMoriah.Waterland@Sun.COM 		 * ---------------------->ier_values[ier_numZones-1]=a_value
244*9781SMoriah.Waterland@Sun.COM 		 * err->entry[i+1]->...
245*9781SMoriah.Waterland@Sun.COM 		 */
246*9781SMoriah.Waterland@Sun.COM 		erc->ier_numZones++;
247*9781SMoriah.Waterland@Sun.COM 		erc->ier_zones = (char **)realloc(erc->ier_zones,
248*9781SMoriah.Waterland@Sun.COM 					sizeof (char **)*erc->ier_numZones);
249*9781SMoriah.Waterland@Sun.COM 		(erc->ier_zones)[erc->ier_numZones-1] = strdup(a_zoneName);
250*9781SMoriah.Waterland@Sun.COM 		erc->ier_values = (char **)realloc(erc->ier_values,
251*9781SMoriah.Waterland@Sun.COM 					sizeof (char **)*erc->ier_numZones);
252*9781SMoriah.Waterland@Sun.COM 		(erc->ier_values)[erc->ier_numZones-1] = strdup(a_value);
253*9781SMoriah.Waterland@Sun.COM 		return;
254*9781SMoriah.Waterland@Sun.COM 	}
255*9781SMoriah.Waterland@Sun.COM 
256*9781SMoriah.Waterland@Sun.COM 	/*
257*9781SMoriah.Waterland@Sun.COM 	 * this packages does not have an entry - add new package
258*9781SMoriah.Waterland@Sun.COM 	 * entry for this zone the modified records will look like this:
259*9781SMoriah.Waterland@Sun.COM 	 * err->er_#entry++;
260*9781SMoriah.Waterland@Sun.COM 	 * err->entry[0]->record->ier_numZones=...
261*9781SMoriah.Waterland@Sun.COM 	 * err->entry[0]->record->ier_packageName=...
262*9781SMoriah.Waterland@Sun.COM 	 * err->entry[0]->record->ier_zones[0]=...
263*9781SMoriah.Waterland@Sun.COM 	 * err->entry[0]->record->ier_values[0]=...
264*9781SMoriah.Waterland@Sun.COM 	 * err->entry[er_#entry-1]->record->ier_numZones=1
265*9781SMoriah.Waterland@Sun.COM 	 * err->entry[er_#entry-1]->record->ier_packageName=a_pkginst
266*9781SMoriah.Waterland@Sun.COM 	 * err->entry[er_#entry-1]->record->ier_zones[0]=a_zoneName
267*9781SMoriah.Waterland@Sun.COM 	 * err->entry[er_#entry-1]->record->ier_values[0]=a_value
268*9781SMoriah.Waterland@Sun.COM 	 */
269*9781SMoriah.Waterland@Sun.COM 
270*9781SMoriah.Waterland@Sun.COM 	echoDebug(DBG_DEPCHK_RECORD_PERROR, (long)a_erc,
271*9781SMoriah.Waterland@Sun.COM 			a_erc->er_numEntries, a_pkginst, a_zoneName, a_value);
272*9781SMoriah.Waterland@Sun.COM 
273*9781SMoriah.Waterland@Sun.COM 	a_erc->er_numEntries++;
274*9781SMoriah.Waterland@Sun.COM 
275*9781SMoriah.Waterland@Sun.COM 	a_erc->er_theEntries = realloc(a_erc->er_theEntries,
276*9781SMoriah.Waterland@Sun.COM 			sizeof (depckErrorRecord_t)*a_erc->er_numEntries);
277*9781SMoriah.Waterland@Sun.COM 
278*9781SMoriah.Waterland@Sun.COM 	erc = &a_erc->er_theEntries[a_erc->er_numEntries-1];
279*9781SMoriah.Waterland@Sun.COM 
280*9781SMoriah.Waterland@Sun.COM 	erc->ier_packageName = strdup(a_pkginst);
281*9781SMoriah.Waterland@Sun.COM 	erc->ier_numZones = 1;
282*9781SMoriah.Waterland@Sun.COM 	erc->ier_zones = (char **)calloc(1, sizeof (char *));
283*9781SMoriah.Waterland@Sun.COM 	(erc->ier_zones)[erc->ier_numZones-1] = strdup(a_zoneName);
284*9781SMoriah.Waterland@Sun.COM 	erc->ier_values = (char **)calloc(1, sizeof (char *));
285*9781SMoriah.Waterland@Sun.COM 	(erc->ier_values)[erc->ier_numZones-1] = strdup(a_value);
286*9781SMoriah.Waterland@Sun.COM }
287*9781SMoriah.Waterland@Sun.COM 
288*9781SMoriah.Waterland@Sun.COM /*
289*9781SMoriah.Waterland@Sun.COM  * *****************************************************************************
290*9781SMoriah.Waterland@Sun.COM  * static internal (private) functions
291*9781SMoriah.Waterland@Sun.COM  * *****************************************************************************
292*9781SMoriah.Waterland@Sun.COM  */
293*9781SMoriah.Waterland@Sun.COM 
294*9781SMoriah.Waterland@Sun.COM static int
collectError(int * r_numZones,char ** r_zoneNames,char * a_packageName,depckl_t * a_dck,int a_depIndex,depckErrorRecord_t * a_eir,int a_errIndex)295*9781SMoriah.Waterland@Sun.COM collectError(int *r_numZones, char **r_zoneNames, char *a_packageName,
296*9781SMoriah.Waterland@Sun.COM 	depckl_t *a_dck, int a_depIndex, depckErrorRecord_t *a_eir,
297*9781SMoriah.Waterland@Sun.COM 	int a_errIndex)
298*9781SMoriah.Waterland@Sun.COM {
299*9781SMoriah.Waterland@Sun.COM 	char	msgbuf[4096];
300*9781SMoriah.Waterland@Sun.COM 	char	*zn = *r_zoneNames;
301*9781SMoriah.Waterland@Sun.COM 
302*9781SMoriah.Waterland@Sun.COM 	if (a_dck[a_depIndex].ignore_values == (char *)NULL) {
303*9781SMoriah.Waterland@Sun.COM 		if (a_dck[a_depIndex].err_msg == (char **)NULL) {
304*9781SMoriah.Waterland@Sun.COM 			(void) snprintf(msgbuf, sizeof (msgbuf),
305*9781SMoriah.Waterland@Sun.COM 			ERR_DEPENDENCY_REPORT, a_eir->ier_values[a_errIndex],
306*9781SMoriah.Waterland@Sun.COM 			"package", a_packageName,
307*9781SMoriah.Waterland@Sun.COM 			"zone", a_eir->ier_zones[a_errIndex]);
308*9781SMoriah.Waterland@Sun.COM 		} else {
309*9781SMoriah.Waterland@Sun.COM 			/* LINTED variable format specifier to snprintf(); */
310*9781SMoriah.Waterland@Sun.COM 			(void) snprintf(msgbuf, sizeof (msgbuf),
311*9781SMoriah.Waterland@Sun.COM 			*a_dck[a_depIndex].err_msg,
312*9781SMoriah.Waterland@Sun.COM 			a_eir->ier_values[a_errIndex],
313*9781SMoriah.Waterland@Sun.COM 			"package", a_packageName,
314*9781SMoriah.Waterland@Sun.COM 			"zone", a_eir->ier_zones[a_errIndex]);
315*9781SMoriah.Waterland@Sun.COM 		}
316*9781SMoriah.Waterland@Sun.COM 		if (a_dck[a_depIndex].depcklFunc != NULL) {
317*9781SMoriah.Waterland@Sun.COM 			int	err;
318*9781SMoriah.Waterland@Sun.COM 
319*9781SMoriah.Waterland@Sun.COM 			err = (a_dck[a_depIndex].depcklFunc)(msgbuf,
320*9781SMoriah.Waterland@Sun.COM 							a_packageName);
321*9781SMoriah.Waterland@Sun.COM 			echoDebug(DBG_DEPCHK_COLLECT_ERROR, err, a_packageName,
322*9781SMoriah.Waterland@Sun.COM 					msgbuf);
323*9781SMoriah.Waterland@Sun.COM 			if (err != 0) {
324*9781SMoriah.Waterland@Sun.COM 				return (err);
325*9781SMoriah.Waterland@Sun.COM 			}
326*9781SMoriah.Waterland@Sun.COM 		} else {
327*9781SMoriah.Waterland@Sun.COM 			echoDebug(DBG_DEPCHK_COLLECT_IGNORE, a_packageName,
328*9781SMoriah.Waterland@Sun.COM 					msgbuf);
329*9781SMoriah.Waterland@Sun.COM 			ptext(stderr, "\\n%s", msgbuf);
330*9781SMoriah.Waterland@Sun.COM 		}
331*9781SMoriah.Waterland@Sun.COM 		return (0);
332*9781SMoriah.Waterland@Sun.COM 	}
333*9781SMoriah.Waterland@Sun.COM 
334*9781SMoriah.Waterland@Sun.COM 	*r_numZones = (*r_numZones)+1;
335*9781SMoriah.Waterland@Sun.COM 	if (zn == (char *)NULL) {
336*9781SMoriah.Waterland@Sun.COM 		zn = strdup(a_eir->ier_zones[a_errIndex]);
337*9781SMoriah.Waterland@Sun.COM 	} else {
338*9781SMoriah.Waterland@Sun.COM 		char *p;
339*9781SMoriah.Waterland@Sun.COM 		int len = strlen(zn)+strlen(a_eir->ier_zones[a_errIndex])+3;
340*9781SMoriah.Waterland@Sun.COM 		p = calloc(1, len);
341*9781SMoriah.Waterland@Sun.COM 		(void) snprintf(p, len, "%s, %s", zn,
342*9781SMoriah.Waterland@Sun.COM 			a_eir->ier_zones[a_errIndex]);
343*9781SMoriah.Waterland@Sun.COM 		free(zn);
344*9781SMoriah.Waterland@Sun.COM 		zn = p;
345*9781SMoriah.Waterland@Sun.COM 
346*9781SMoriah.Waterland@Sun.COM 	}
347*9781SMoriah.Waterland@Sun.COM 	*r_zoneNames = zn;
348*9781SMoriah.Waterland@Sun.COM 	return (0);
349*9781SMoriah.Waterland@Sun.COM }
350