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 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  *  stub module for kwarnd.
29  */
30 
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include "kwarnd.h"
34 #include <rpc/rpc.h>
35 
36 #include <sys/types.h>
37 #include <sys/devops.h>
38 #include <sys/open.h>
39 #include <sys/stat.h>
40 #include <sys/conf.h>
41 #include <sys/ddi.h>
42 #include <sys/sunddi.h>
43 #include <sys/uio.h>
44 #include <syslog.h>
45 
46 extern CLIENT *getkwarnd_handle(void);
47 extern void resetkwarnd_handle(void);
48 
49 OM_UINT32
kwarn_add_warning(WARNING_NAME_T warning_name,int cred_exp_time)50 kwarn_add_warning(WARNING_NAME_T warning_name, int cred_exp_time)
51 {
52 	kwarn_add_warning_arg args;
53 	kwarn_add_warning_res res;
54 	enum clnt_stat ret;
55 	boolean_t first = TRUE;
56 	CLIENT *clnt;
57 
58 	/* check the input/output parameters */
59 	if (warning_name == NULL || cred_exp_time == 0)
60 		return (1);
61 
62 rebind:
63 	/* get the client handle to kwarnd */
64 	if ((clnt = getkwarnd_handle()) == NULL) {
65 		/*
66 		 * Let app output if an error occurs but we'll syslog to
67 		 * DEBUG to get error details if needed.
68 		 */
69 		syslog(LOG_DEBUG, "%s",
70 		    clnt_spcreateerror("getkwarnd_handle"));
71 		return (1);
72 	}
73 
74 	/* set the rpc parameters */
75 	args.cred_exp_time = cred_exp_time;
76 	args.warning_name = warning_name;
77 
78 	/* call the remote procedure */
79 	memset(&res, 0, sizeof (res));
80 	ret = kwarn_add_warning_1(&args, &res, clnt);
81 	if (ret != RPC_SUCCESS) {
82 		/*
83 		 * Could have timed out due to the process restarting for
84 		 * various reasons. Should attempt to rebind in the case
85 		 * process is actually running.
86 		 */
87 		if (ret == RPC_TIMEDOUT && first) {
88 			resetkwarnd_handle();
89 			first = FALSE;
90 			goto rebind;
91 		}
92 		return (1);
93 	}
94 
95 	/* nothing to free */
96 
97 	return (res.status);
98 }
99 
100 OM_UINT32
kwarn_del_warning(WARNING_NAME_T warning_name)101 kwarn_del_warning(WARNING_NAME_T warning_name)
102 {
103 	kwarn_del_warning_arg args;
104 	kwarn_del_warning_res res;
105 	enum clnt_stat ret;
106 	boolean_t first = TRUE;
107 	CLIENT *clnt;
108 
109 	/* check the output parameters */
110 	if (warning_name == NULL)
111 		return (1);
112 
113 rebind:
114 	/* get the client GSSD handle */
115 	if ((clnt = getkwarnd_handle()) == NULL) {
116 		/*
117 		 * Let app output if an error occurs but we'll syslog to
118 		 * DEBUG to get error details if needed.
119 		 */
120 		syslog(LOG_DEBUG, "%s",
121 		    clnt_spcreateerror("getkwarnd_handle"));
122 		return (1);
123 	}
124 
125 	/* set the input parameters */
126 	args.warning_name = warning_name;
127 
128 	/* call the remote procedure */
129 	memset(&res, 0, sizeof (res));
130 	ret = kwarn_del_warning_1(&args, &res, clnt);
131 	if (ret != RPC_SUCCESS) {
132 		/*
133 		 * Could have timed out due to the process restarting for
134 		 * various reasons. Should attempt to rebind in the case
135 		 * process is actually running.
136 		 */
137 		if (ret == RPC_TIMEDOUT && first) {
138 			resetkwarnd_handle();
139 			first = FALSE;
140 			goto rebind;
141 		}
142 		return (1);
143 	}
144 
145 	/* nothing to free */
146 
147 	return (res.status);
148 }
149