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