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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22#pragma ident	"%Z%%M%	%I%	%E% SMI"
23/*
24 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
25 * Use is subject to license terms.
26 */
27
28/* LINTLIBRARY */
29
30#include <stdio.h>
31#include <strings.h>
32#include <libintl.h>
33#include "com_sun_admin_pm_server_DoPrinterNS.h"
34
35jstring	glob_jstdout = NULL;
36jstring glob_jstderr = NULL;
37
38extern char glob_stdout[];
39extern char glob_stderr[];
40
41void set_stderr(JNIEnv *env);
42void set_stdout(JNIEnv *env);
43extern int _dorexec(
44	const char *host,
45	const char *user,
46	const char *passwd,
47	const char *cmd,
48	const char *locale);
49
50extern int _updateoldyp(
51	const char *action,
52	const char *printername,
53	const char *printserver,
54	const char *extensions,
55	const char *comment,
56	const char *isdefault);
57
58extern int _updateldap(
59	const char *action,
60	const char *host,
61	const char *user,
62	const char *passwd,
63	const char *printername,
64	const char *printserver,
65	const char *extensions,
66	const char *comment,
67	const char *isdefault);
68
69JNIEXPORT jint JNICALL
70Java_com_sun_admin_pm_server_DoPrinterNS_dorexec(
71	JNIEnv *env,
72	jclass class,
73	jstring jhost,
74	jstring juser,
75	jstring jpasswd,
76	jstring jcmd,
77	jstring jlocale)
78{
79	const char *host;
80	const char *user;
81	const char *passwd;
82	const char *cmd;
83	const char *locale;
84
85	int ret = 0;
86	jstring empty = (*env)->NewStringUTF(env, "");
87	glob_jstdout = (*env)->NewGlobalRef(env, empty);
88	glob_jstderr = (*env)->NewGlobalRef(env, empty);
89
90	host = (*env)->GetStringUTFChars(env, jhost, 0);
91	user = (*env)->GetStringUTFChars(env, juser, 0);
92	passwd = (*env)->GetStringUTFChars(env, jpasswd, 0);
93	cmd = (*env)->GetStringUTFChars(env, jcmd, 0);
94	locale = (*env)->GetStringUTFChars(env, jlocale, 0);
95
96	ret = _dorexec(host, user, passwd, cmd, locale);
97
98	if (ret != 0) {
99		(void) set_stderr(env);
100		return (ret);
101	}
102	(void) set_stderr(env);
103	(void) set_stdout(env);
104	return (ret);
105}
106
107JNIEXPORT jstring JNICALL
108Java_com_sun_admin_pm_server_DoPrinterNS_getstderr(JNIEnv *env, jclass class)
109{
110	return (glob_jstderr);
111}
112
113JNIEXPORT jstring JNICALL
114Java_com_sun_admin_pm_server_DoPrinterNS_getstdout(JNIEnv *env, jclass class)
115{
116	return (glob_jstdout);
117}
118
119void
120set_stderr(JNIEnv *env)
121{
122	static jstring jerrstr;
123	static char errbuf[BUFSIZ];
124
125	if (*glob_stderr == '\0') {
126		(void) strcpy(errbuf, "");
127	} else {
128		(void) strcpy(errbuf, glob_stderr);
129	}
130
131	jerrstr = (*env)->NewStringUTF(env, "");
132	if (glob_jstderr != NULL) {
133		(*env)->DeleteGlobalRef(env, glob_jstderr);
134	}
135
136	jerrstr = (*env)->NewStringUTF(env, errbuf);
137	glob_jstderr = (*env)->NewGlobalRef(env, jerrstr);
138}
139
140void
141set_stdout(JNIEnv *env)
142{
143	static jstring joutstr;
144	static char outbuf[BUFSIZ];
145
146	if (*glob_stdout == '\0') {
147		(void) strcpy(outbuf, "");
148	} else {
149		(void) strcpy(outbuf, glob_stdout);
150	}
151
152	joutstr = (*env)->NewStringUTF(env, "");
153	if (glob_jstdout != NULL) {
154		(*env)->DeleteGlobalRef(env, glob_jstdout);
155	}
156
157	joutstr = (*env)->NewStringUTF(env, outbuf);
158	glob_jstdout = (*env)->NewGlobalRef(env, joutstr);
159}
160
161JNIEXPORT jint JNICALL
162Java_com_sun_admin_pm_server_DoPrinterNS_updateoldyp(
163	JNIEnv *env,
164	jclass class,
165	jstring jaction,
166	jstring jprintername,
167	jstring jprintserver,
168	jstring jextensions,
169	jstring jcomment,
170	jstring jisdefault)
171{
172	const char *action = NULL;
173	const char *printername = NULL;
174	const char *printserver = NULL;
175	const char *extensions = NULL;
176	const char *comment = NULL;
177	const char *isdefault = NULL;
178
179	int ret = 0;
180	jstring empty = (*env)->NewStringUTF(env, "");
181	glob_jstdout = (*env)->NewGlobalRef(env, empty);
182	glob_jstderr = (*env)->NewGlobalRef(env, empty);
183
184	action = (*env)->GetStringUTFChars(env, jaction, 0);
185	printername = (*env)->GetStringUTFChars(env, jprintername, 0);
186	if (jprintserver != NULL) {
187		printserver =
188			(*env)->GetStringUTFChars(env, jprintserver, 0);
189	}
190	if (jextensions != NULL) {
191		extensions =
192			(*env)->GetStringUTFChars(env, jextensions, 0);
193	}
194	if (jcomment != NULL) {
195		comment =
196			(*env)->GetStringUTFChars(env, jcomment, 0);
197	}
198	isdefault = (*env)->GetStringUTFChars(env, jisdefault, 0);
199
200	ret = _updateoldyp(action, printername, printserver,
201		extensions, comment, isdefault);
202
203	if (ret != 0) {
204		(void) set_stderr(env);
205		return (ret);
206	}
207	(void) set_stderr(env);
208	(void) set_stdout(env);
209	return (ret);
210}
211
212JNIEXPORT jint JNICALL
213Java_com_sun_admin_pm_server_DoPrinterNS_updateldap(
214	JNIEnv *env,
215	jclass class,
216	jstring jaction,
217	jstring jhost,
218	jstring jbinddn,
219	jstring jpasswd,
220	jstring jprintername,
221	jstring jprintserver,
222	jstring jextensions,
223	jstring jcomment,
224	jstring jisdefault)
225{
226	const char *action = NULL;
227	const char *host = NULL;
228	const char *binddn = NULL;
229	const char *passwd = NULL;
230	const char *printername = NULL;
231	const char *printserver = NULL;
232	const char *extensions = NULL;
233	const char *comment = NULL;
234	const char *isdefault = NULL;
235
236	int ret = 0;
237	jstring empty = (*env)->NewStringUTF(env, "");
238	glob_jstdout = (*env)->NewGlobalRef(env, empty);
239	glob_jstderr = (*env)->NewGlobalRef(env, empty);
240
241	action = (*env)->GetStringUTFChars(env, jaction, 0);
242	printername = (*env)->GetStringUTFChars(env, jprintername, 0);
243	if (jhost != NULL) {
244		host = (*env)->GetStringUTFChars(env, jhost, 0);
245	}
246	if (jbinddn != NULL) {
247		binddn = (*env)->GetStringUTFChars(env, jbinddn, 0);
248	}
249	if (jpasswd != NULL) {
250		passwd = (*env)->GetStringUTFChars(env, jpasswd, 0);
251	}
252	if (jprintserver != NULL) {
253		printserver =
254			(*env)->GetStringUTFChars(env, jprintserver, 0);
255	}
256	if (jextensions != NULL) {
257		extensions =
258			(*env)->GetStringUTFChars(env, jextensions, 0);
259	}
260	if (jcomment != NULL) {
261		comment =
262			(*env)->GetStringUTFChars(env, jcomment, 0);
263	}
264	isdefault = (*env)->GetStringUTFChars(env, jisdefault, 0);
265
266	ret = _updateldap(action, host, binddn, passwd, printername,
267	    printserver, extensions, comment, isdefault);
268
269	if (ret != 0) {
270		(void) set_stderr(env);
271		return (ret);
272	}
273	(void) set_stderr(env);
274	(void) set_stdout(env);
275	return (ret);
276}
277