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 2006 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 <string.h>
34 #include <limits.h>
35 #include <sys/types.h>
36 #include <pkgstrct.h>
37 #include <locale.h>
38 #include <libintl.h>
39 
40 /*
41  * consolidation pkg command library includes
42  */
43 
44 #include <pkglib.h>
45 
46 /*
47  * local pkg command library includes
48  */
49 
50 #include "install.h"
51 #include "libinst.h"
52 #include "libadm.h"
53 #include "messages.h"
54 
55 extern int	warnflag;
56 
57 /*
58  * forward declarations
59  */
60 
61 static int	finalck_warning(struct cfent *ept, int attrchg, int contchg);
62 static int	finalck_error(struct cfent *ept, int attrchg, int contchg);
63 
64 int
finalck(struct cfent * ept,int attrchg,int contchg,boolean_t a_warning)65 finalck(struct cfent *ept, int attrchg, int contchg, boolean_t a_warning)
66 {
67 	int	errflg;
68 
69 	/*
70 	 * invoke the correct finalck based on whether warnings or errors
71 	 * should be generated
72 	 */
73 
74 	if (a_warning) {
75 		errflg = finalck_warning(ept, attrchg, contchg);
76 	} else {
77 		errflg = finalck_error(ept, attrchg, contchg);
78 	}
79 
80 	/* exit debug output */
81 
82 	echoDebug(DBG_FINALCK_EXIT, errflg, ept->ftype,
83 		ept->path ? ept->path : "");
84 
85 	/* return results of the finalck_xxx call */
86 
87 	return (errflg);
88 }
89 
90 /*
91  * this finalck generates errors on failure
92  */
93 
94 static int
finalck_error(struct cfent * ept,int attrchg,int contchg)95 finalck_error(struct cfent *ept, int attrchg, int contchg)
96 {
97 	int	errflg = 0;
98 
99 	/* entry debug info */
100 
101 	echoDebug(DBG_FINALCK_ERROR, attrchg, contchg, ept->ftype,
102 		ept->path ? ept->path : "");
103 
104 	/* on attribute or content change, verify attributes */
105 
106 	if (attrchg || contchg) {
107 		int	n;
108 
109 		/* verify change, or fix if possible */
110 		n = averify(1, &ept->ftype, ept->path, &ept->ainfo);
111 		echoDebug(DBG_FINALCK_ERROR_AVERIFY, n);
112 		if (n != 0) {
113 			logerr(ERR_FINALCK_ATTR, ept->path);
114 			logerr(getErrbufAddr());
115 			errflg++;
116 			warnflag++;
117 			if (n == VE_EXIST)
118 				return (1); /* no need to check contents */
119 		}
120 	}
121 
122 	/* on content change of "f/e/v" type, verify contents */
123 
124 	if (contchg && strchr("fev", ept->ftype)) {
125 		int	n;
126 
127 		/* verify change was executed properly */
128 
129 		if (contchg < 0) {
130 			ept->cinfo.modtime = BADCONT;
131 			ept->cinfo.size = BADCONT;
132 			ept->cinfo.cksum = BADCONT;
133 		}
134 
135 		n = cverify(1, &ept->ftype, ept->path, &ept->cinfo, 1);
136 		echoDebug(DBG_FINALCK_ERROR_CVERIFY, n);
137 		if (n != 0) {
138 			logerr(ERR_FINALCK_CONT, ept->path);
139 			logerr(getErrbufAddr());
140 			errflg++;
141 			warnflag++;
142 		}
143 	}
144 
145 	return (errflg);
146 }
147 
148 /*
149  * this finalck generates warnings on failure
150  */
151 
152 static int
finalck_warning(struct cfent * ept,int attrchg,int contchg)153 finalck_warning(struct cfent *ept, int attrchg, int contchg)
154 {
155 	int	errflg = 0;
156 
157 	/* entry debug info */
158 
159 	echoDebug(DBG_FINALCK_WARNING, attrchg, contchg, ept->ftype,
160 		ept->path ? ept->path : "");
161 
162 
163 	/* on attribute or content change, verify attributes */
164 
165 	if (attrchg || contchg) {
166 		int	n;
167 
168 		/* verify change, or fix if possible */
169 
170 		n = averify(1, &ept->ftype, ept->path, &ept->ainfo);
171 		echoDebug(DBG_FINALCK_WARNING_AVERIFY, n);
172 		if (n != 0) {
173 			logerr(WRN_FINALCK_ATTR, ept->path);
174 			logerr(getErrbufAddr());
175 			errflg++;
176 			if (n == VE_EXIST) {
177 				return (1); /* no need to check contents */
178 			}
179 		}
180 	}
181 
182 	/* on content change of "f/e/v" type, verify contents */
183 
184 	if (contchg && strchr("fev", ept->ftype)) {
185 		int	n;
186 
187 		/* verify change was executed properly */
188 
189 		if (contchg < 0) {
190 			ept->cinfo.modtime = BADCONT;
191 			ept->cinfo.size = BADCONT;
192 			ept->cinfo.cksum = BADCONT;
193 		}
194 
195 		n = cverify(1, &ept->ftype, ept->path, &ept->cinfo, 1);
196 		echoDebug(DBG_FINALCK_WARNING_CVERIFY, n);
197 		if (n != 0) {
198 			logerr(WRN_FINALCK_CONT, ept->path);
199 			logerr(getErrbufAddr());
200 		}
201 		errflg++;
202 	}
203 
204 	return (errflg);
205 }
206