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