diff options
Diffstat (limited to 'xc/programs/xfindproxy/xfindproxy.c')
-rw-r--r-- | xc/programs/xfindproxy/xfindproxy.c | 456 |
1 files changed, 456 insertions, 0 deletions
diff --git a/xc/programs/xfindproxy/xfindproxy.c b/xc/programs/xfindproxy/xfindproxy.c new file mode 100644 index 000000000..b426be744 --- /dev/null +++ b/xc/programs/xfindproxy/xfindproxy.c @@ -0,0 +1,456 @@ +/* $TOG: xfindproxy.c /main/10 1998/02/09 13:57:41 kaleb $ */ + +/* +Copyright 1996, 1998 The Open Group + +All Rights Reserved. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. +*/ +/* $XFree86: xc/programs/xfindproxy/xfindproxy.c,v 1.3 1999/03/02 11:49:39 dawes Exp $ */ + + +#include <stdio.h> +#include <X11/Xos.h> +#include <X11/Xfuncs.h> +#include <X11/Xmd.h> +#include <X11/StringDefs.h> +#include <X11/Intrinsic.h> +#include <X11/ICE/ICElib.h> +#include <X11/ICE/ICEmsg.h> +#include <X11/ICE/ICEproto.h> +#include <X11/PM/PM.h> +#include <X11/PM/PMproto.h> +#include "xfindproxy.h" + +#ifndef X_NOT_STDC_ENV +#include <stdlib.h> +#else +extern char *getenv(); +#endif +#include <ctype.h> + +static void PMprocessMessages(IceConn iceConn, IcePointer clientData, + int opcode, unsigned long length, Bool swap, + IceReplyWaitInfo *replyWait, + Bool *replyReadyRet); +static void _XtProcessIceMsgProc(XtPointer client_data, int *source, + XtInputId *id); +static void _XtIceWatchProc(IceConn ice_conn, IcePointer client_data, + Bool opening, IcePointer *watch_data); +static Status InitWatchProcs(XtAppContext appContext); + +int PMopcode; + +int PMversionCount = 1; +IcePoVersionRec PMversions[] = + {{PM_MAJOR_VERSION, PM_MINOR_VERSION, PMprocessMessages}}; + +XtAppContext appContext; + +typedef struct { + int status; + char *addr; + char *error; +} GetProxyAddrReply; + + +static int +cvthexkey(char *hexstr, char **ptrp) /* turn hex key string into octets */ +{ + int i; + int len = 0; + char *retval, *s; + unsigned char *us; + char c; + char savec = '\0'; + + /* count */ + for (s = hexstr; *s; s++) { + if (!isascii(*s)) return -1; + if (isspace(*s)) continue; + if (!isxdigit(*s)) return -1; + len++; + } + + /* if odd then there was an error */ + if ((len & 1) == 1) return -1; + + + /* now we know that the input is good */ + len >>= 1; + retval = (char *) malloc (len); + if (!retval) + return -1; + + for (us = (unsigned char *) retval, i = len; i > 0; hexstr++) { + c = *hexstr; + if (isspace(c)) continue; /* already know it is ascii */ + if (isupper(c)) + c = tolower(c); + if (savec) { +#define atoh(c) ((c) - (((c) >= '0' && (c) <= '9') ? '0' : ('a'-10))) + *us = (unsigned char)((atoh(savec) << 4) + atoh(c)); +#undef atoh + savec = 0; /* ready for next character */ + us++; + i--; + } else { + savec = c; + } + } + *ptrp = retval; + return len; +} + +int +main(int argc, char *argv[]) +{ + IceConn iceConn; + IceProtocolSetupStatus setupstat; + char *vendor = NULL; + char *release = NULL; + pmGetProxyAddrMsg *pMsg; + char *pData; + int len, i; + IceReplyWaitInfo replyWait; + GetProxyAddrReply reply; + int majorVersion, minorVersion; + Bool gotReply, ioErrorOccured; + char errorString[255]; + char *serviceName = NULL, *serverAddress = NULL; + char *hostAddress = NULL, *startOptions = NULL; + char *managerAddress = NULL; + Bool haveAuth = 0; + char authName[40]; + char authData[128]; + char *authDataBinary = NULL; + int authLen = 0; + + for (i = 1; i < argc; i++) + { + if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'a': /* -auth */ + haveAuth = 1; + continue; + + case 'm': /* -manager */ + if (++i >= argc) goto usage; + managerAddress = (char *) XtNewString (argv[i]); + continue; + + case 's': /* -server */ + if (++i >= argc) goto usage; + serverAddress = (char *) XtNewString (argv[i]); + continue; + + case 'n': /* -name */ + if (++i >= argc) goto usage; + serviceName = XtNewString (argv[i]); + continue; + + case 'h': /* -host */ + if (++i >= argc) goto usage; + hostAddress = XtNewString (argv[i]); + continue; + + case 'o': /* -options */ + if (++i >= argc) goto usage; + startOptions = XtNewString (argv[i]); + continue; + } + } + + usage: + fprintf (stderr, + "usage: xfindproxy -server serverAddr -name serviceName [-manager managerAddr] [-auth] [-host hostAddr] [-options opts]\n-manager can be omitted only if PROXY_MANAGER is in the environment\n"); + exit (1); + } + + if (serviceName == NULL || serverAddress == NULL) + goto usage; + + if (managerAddress == NULL) { + managerAddress = getenv("PROXY_MANAGER"); + if (managerAddress == NULL) { + fprintf (stderr, "Error: -manager option must be specified when PROXY_MANAGER is not in the environment\n"); + exit (1); + } + } + + /* + * Register support for PROXY_MANAGEMENT. + */ + + if ((PMopcode = IceRegisterForProtocolSetup ( + PM_PROTOCOL_NAME, + "XC", "1.0", + PMversionCount, PMversions, + 0, /* authcount */ + NULL, /* authnames */ + NULL, /* authprocs */ + NULL /* IceIOErrorProc */ )) < 0) + { + fprintf (stderr, + "Could not register PROXY_MANAGEMENT protocol with ICE"); + exit (1); + } + + + appContext = XtCreateApplicationContext (); + + InitWatchProcs (appContext); + + if ((iceConn = IceOpenConnection ( + managerAddress, NULL, 0, 0, 256, errorString)) == NULL) + { + fprintf (stderr, + "Could not open ICE connection to proxy manager: %s", errorString); + exit (1); + } + + setupstat = IceProtocolSetup (iceConn, PMopcode, NULL, + False /* mustAuthenticate */, + &majorVersion, &minorVersion, + &vendor, &release, 256, errorString); + + if (setupstat != IceProtocolSetupSuccess) + { + IceCloseConnection (iceConn); + fprintf (stderr, + "Could not initialize proxy management protocol: %s\n", + errorString); + exit (1); + } + + + /* + * If auth data is supplied, read it from stdin. + */ + + if (haveAuth) + { + fgets (authName, sizeof (authName), stdin); + fgets (authData, sizeof (authData), stdin); + + for (i = 0; i < strlen (authName); i++) + if (authName[i] == '\n') + { + authName[i] = '\0'; + break; + } + for (i = 0; i < strlen (authData); i++) + if (authData[i] == '\n') + { + authData[i] = '\0'; + break; + } + + /* + * Convert the hex auth data to binary. + */ + + authLen = cvthexkey (authData, &authDataBinary); + + if (authLen == -1) + { + fprintf (stderr, "Could not convert hex auth data to binary\n"); + exit (1); + } + } + + + /* + * Now send the GetProxyAddr request. + */ + + len = STRING_BYTES (serviceName) + + STRING_BYTES (serverAddress) + + STRING_BYTES (hostAddress) + + STRING_BYTES (startOptions) + + (authLen > 0 ? (STRING_BYTES (authName) + authLen) : 0); + + IceGetHeaderExtra (iceConn, PMopcode, PM_GetProxyAddr, + SIZEOF (pmGetProxyAddrMsg), WORD64COUNT (len), + pmGetProxyAddrMsg, pMsg, pData); + + pMsg->authLen = authLen; + + STORE_STRING (pData, serviceName); + STORE_STRING (pData, serverAddress); + STORE_STRING (pData, hostAddress); + STORE_STRING (pData, startOptions); + if (authLen > 0) + { + STORE_STRING (pData, authName); + memcpy (pData, authDataBinary, authLen); + } + + IceFlush (iceConn); + + replyWait.sequence_of_request = IceLastSentSequenceNumber (iceConn); + replyWait.major_opcode_of_request = PMopcode; + replyWait.minor_opcode_of_request = PM_GetProxyAddr; + replyWait.reply = (IcePointer) &reply; + + gotReply = False; + ioErrorOccured = False; + + while (!gotReply && !ioErrorOccured) + { + ioErrorOccured = (IceProcessMessages ( + iceConn, &replyWait, &gotReply) == IceProcessMessagesIOError); + + if (ioErrorOccured) + { + fprintf (stderr, "IO error occured\n"); + exit (1); + } + else if (gotReply) + { + if (reply.status == PM_Success) + { + fprintf (stdout, "%s\n", reply.addr); + } + else + { + fprintf (stderr, "Error from proxy manager: %s\n", + reply.error); + } + } + } + exit(0); +} + + + +static void +PMprocessMessages(IceConn iceConn, IcePointer clientData, int opcode, + unsigned long length, Bool swap, + IceReplyWaitInfo *replyWait, Bool *replyReadyRet) +{ + if (replyWait) + *replyReadyRet = False; + + switch (opcode) + { + case PM_GetProxyAddrReply: + + if (!replyWait || + replyWait->minor_opcode_of_request != PM_GetProxyAddr) + { + _IceReadSkip (iceConn, length << 3); + + _IceErrorBadState (iceConn, PMopcode, + PM_GetProxyAddrReply, IceFatalToProtocol); + } + else + { + pmGetProxyAddrReplyMsg *pMsg; + char *pData, *pStart; + GetProxyAddrReply *reply = + (GetProxyAddrReply *) (replyWait->reply); + + CHECK_AT_LEAST_SIZE (iceConn, PMopcode, opcode, + length, SIZEOF (pmGetProxyAddrReplyMsg), IceFatalToProtocol); + + IceReadCompleteMessage (iceConn, SIZEOF (pmGetProxyAddrReplyMsg), + pmGetProxyAddrReplyMsg, pMsg, pStart); + + if (!IceValidIO (iceConn)) + { + IceDisposeCompleteMessage (iceConn, pStart); + return; + } + + pData = pStart; + + SKIP_STRING (pData, swap); /* proxy-address */ + SKIP_STRING (pData, swap); /* failure-reason */ + + CHECK_COMPLETE_SIZE (iceConn, PMopcode, opcode, + length, pData - pStart + SIZEOF (pmGetProxyAddrReplyMsg), + pStart, IceFatalToProtocol); + + pData = pStart; + + EXTRACT_STRING (pData, swap, reply->addr); + EXTRACT_STRING (pData, swap, reply->error); + + reply->status = pMsg->status; + *replyReadyRet = True; + + IceDisposeCompleteMessage (iceConn, pStart); + } + break; + + default: + { + _IceErrorBadMinor (iceConn, PMopcode, opcode, IceCanContinue); + _IceReadSkip (iceConn, length << 3); + break; + } + } +} + + +static void +_XtProcessIceMsgProc(XtPointer client_data, int *source, XtInputId *id) +{ + IceConn ice_conn = (IceConn) client_data; + IceProcessMessagesStatus status; + + status = IceProcessMessages (ice_conn, NULL, NULL); + + if (status == IceProcessMessagesIOError) + { + printf ("IO error occured\n"); + exit (1); + } +} + + +static void +_XtIceWatchProc(IceConn ice_conn, IcePointer client_data, + Bool opening, IcePointer *watch_data) +{ + if (opening) + { + XtAppContext appContext = (XtAppContext) client_data; + + *watch_data = (IcePointer) XtAppAddInput ( + appContext, + IceConnectionNumber (ice_conn), + (XtPointer) XtInputReadMask, + _XtProcessIceMsgProc, + (XtPointer) ice_conn); + } + else + { + XtRemoveInput ((XtInputId) *watch_data); + } +} + + +static Status +InitWatchProcs(XtAppContext appContext) +{ + return (IceAddConnectionWatch (_XtIceWatchProc, (IcePointer) appContext)); +} |