1/***************************************************************************
2 * LPRng - An Extended Print Spooler System
3 *
4 * Copyright 1988-2003, Patrick Powell, San Diego, CA
5 *     papowell@lprng.com
6 * See LICENSE for conditions of use.
7 *
8 ***************************************************************************/
9
10 static char *const _id =
11"$Id: sclient.c,v 1.1.1.1 2008/10/15 03:28:26 james26_jang Exp $";
12
13
14/*
15 * Simple Kerberos client tester.
16 * Derived from the Kerberos 5 SCLIENT code -
17 *   Note carefully that there are NO MIT copyrights here.
18 */
19
20#include "lp.h"
21#include "child.h"
22#include "krb5_auth.h"
23
24char *msg[] = {
25	"[-D options] [-p port] [-s service] [-k keytab] [-P principal] host file",
26	"  -D turns debugging on",
27	0
28};
29
30char *progname;
31
32void send_to_logger( int sfd, int mfd, struct job *job, const char *header, char *msg ){;}
33
34void
35usage()
36{
37	int i;
38	FPRINTF(STDERR, "usage: %s %s\n", progname, msg[0]);
39	for( i = 1; msg[i]; ++i ){
40		FPRINTF(STDERR, "%s\n", msg[i]);
41	}
42}
43
44
45int
46main(argc, argv)
47int argc;
48char *argv[];
49{
50    struct hostent *host_ent;
51    struct sockaddr_in sin;
52    int sock;
53	int port = 1234;
54	char *host;
55	int c;
56	extern int opterr, optind, getopt();
57	extern char * optarg;
58	char buffer[SMALLBUFFER];
59	char msg[SMALLBUFFER];
60	char *file;
61	char *keytab = 0;
62	char *principal = 0;
63
64	progname = argv[0];
65	while( (c = getopt(argc, argv, "D:p:s:k:P:")) != EOF){
66		switch(c){
67		default:
68			FPRINTF(STDERR,"bad option '%c'\n", c );
69			usage(progname); exit(1); break;
70		case 'k': keytab = optarg; break;
71		case 'D': Parse_debug(optarg,1); break;
72		case 'p': port= atoi(optarg); break;
73		case 's': Set_DYN(&Kerberos_service_DYN,optarg); break;
74		case 'P': principal = optarg; break;
75		}
76	}
77	if( argc - optind != 2 ){
78		FPRINTF(STDERR,"missing host or file name\n" );
79		usage(progname);
80		exit(1);
81	}
82	host = argv[optind++];
83	file = argv[optind++];
84
85    /* clear out the structure first */
86    (void) memset((char *)&sin, 0, sizeof(sin));
87	if(Kerberos_service_DYN == 0 ) Set_DYN(&Kerberos_service_DYN,"lpr");
88	if( principal ){
89		FPRINTF(STDERR, "using '%s'\n", principal );
90	} else {
91		remote_principal_krb5( Kerberos_service_DYN, host, buffer, sizeof(buffer) );
92		FPRINTF(STDERR, "default remote principal '%s'\n", buffer );
93		principal = buffer;
94	}
95
96    /* look up the server host */
97    host_ent = gethostbyname(host);
98    if(host_ent == 0){
99		FPRINTF(STDERR, "unknown host %s\n",host);
100		exit(1);
101    }
102
103    /* set up the address of the foreign socket for connect() */
104    sin.sin_family = host_ent->h_addrtype;
105    (void) memcpy((char *)&sin.sin_addr, (char *)host_ent->h_addr,
106		 sizeof(host_ent->h_addr));
107	sin.sin_port = htons(port);
108
109    /* open a TCP socket */
110    sock = socket(PF_INET, SOCK_STREAM, 0);
111#ifdef WINDOW_1
112int windowsize=1024;
113setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&windowsize, sizeof(windowsize));
114aaaaaa=fopen("/tmp/qqqqq", "a");
115fprintf(aaaaaa, "sclient: main\n");
116fclose(aaaaaa);
117#endif
118	Max_open(sock);
119    if( sock < 0 ){
120		perror("socket");
121		exit(1);
122    }
123
124    /* connect to the server */
125    if( connect(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0 ){
126		perror("connect");
127		close(sock);
128		exit(1);
129    }
130
131	buffer[0] = 0;
132	if( client_krb5_auth( keytab, Kerberos_service_DYN, host,
133		0, 0, 0, 0,
134		sock, buffer, sizeof(buffer), file ) ){
135		FPRINTF( STDERR, "client_krb5_auth failed: %s\n", buffer );
136		exit(1);
137	}
138	fflush(STDOUT);
139	fflush(STDERR);
140	SNPRINTF(msg, sizeof(msg))"starting read from %d\n", sock );
141	write(1,msg, safestrlen(msg) );
142	while( (c = read( sock, buffer, sizeof(buffer) ) ) > 0 ){
143		buffer[c] = 0;
144		SNPRINTF(msg, sizeof(msg))
145			"read %d from fd %d '%s'\n", c, sock, buffer );
146		write( 1, msg, safestrlen(msg) );
147	}
148	SNPRINTF(msg, sizeof(msg))
149		"last read status %d from fd %d\n", c, sock );
150	write( 1, msg, safestrlen(msg) );
151    return(0);
152}
153
154/* VARARGS2 */
155#ifdef HAVE_STDARGS
156void setstatus (struct job *job,char *fmt,...)
157#else
158void setstatus (va_alist) va_dcl
159#endif
160{
161#ifndef HAVE_STDARGS
162    struct job *job;
163    char *fmt;
164#endif
165	char msg[LARGEBUFFER];
166    VA_LOCAL_DECL
167
168    VA_START (fmt);
169    VA_SHIFT (job, struct job * );
170    VA_SHIFT (fmt, char *);
171
172	msg[0] = 0;
173	if( Verbose ){
174		(void) VSNPRINTF( msg, sizeof(msg)-2) fmt, ap);
175		strcat( msg,"\n" );
176		if( Write_fd_str( 2, msg ) < 0 ) cleanup(0);
177	}
178	VA_END;
179	return;
180}
181
182
183/* VARARGS2 */
184#ifdef HAVE_STDARGS
185void setmessage (struct job *job,const char *header, char *fmt,...)
186#else
187void setmessage (va_alist) va_dcl
188#endif
189{
190#ifndef HAVE_STDARGS
191    struct job *job;
192    char *fmt, *header;
193#endif
194	char msg[LARGEBUFFER];
195    VA_LOCAL_DECL
196
197    VA_START (fmt);
198    VA_SHIFT (job, struct job * );
199    VA_SHIFT (header, char * );
200    VA_SHIFT (fmt, char *);
201
202	msg[0] = 0;
203	if( Verbose ){
204		(void) VSNPRINTF( msg, sizeof(msg)-2) fmt, ap);
205		strcat( msg,"\n" );
206		if( Write_fd_str( 2, msg ) < 0 ) cleanup(0);
207	}
208	VA_END;
209	return;
210}
211
212