⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zinit.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
字号:
/* This file is part of the Project Athena Zephyr Notification System. * It contains source for the ZInitialize function. * *	Created by:	Robert French * *	Copyright (c) 1987, 1991 by the Massachusetts Institute of Technology. *	For copying and distribution information, see the file *	"mit-copyright.h".  */#ifdef ZEPHYR_USES_KERBEROS#ifdef WIN32#else#include <krb_err.h>#endif#endif#include "internal.h"#ifdef WIN32#include <winsock2.h>#else#include <sys/socket.h>#endif#ifndef INADDR_NONE#define INADDR_NONE 0xffffffff#endifCode_t ZInitialize(){    struct servent *hmserv;    struct hostent *hostent;    char addr[4], hostname[MAXHOSTNAMELEN];    struct in_addr servaddr;    struct sockaddr_in sin;    int s;    socklen_t sinsize = sizeof(sin);    Code_t code;    ZNotice_t notice;#ifdef ZEPHYR_USES_KERBEROS    char *krealm = NULL;    int krbval;    char d1[ANAME_SZ], d2[INST_SZ];    /*    initialize_krb_error_table(); */#endif    initialize_zeph_error_table();        (void) memset((char *)&__HM_addr, 0, sizeof(__HM_addr));    __HM_addr.sin_family = AF_INET;    /* Set up local loopback address for HostManager */    addr[0] = 127;    addr[1] = 0;    addr[2] = 0;    addr[3] = 1;    hmserv = (struct servent *)getservbyname(HM_SVCNAME, "udp");    __HM_addr.sin_port = (hmserv) ? hmserv->s_port : HM_SVC_FALLBACK;    (void) memcpy((char *)&__HM_addr.sin_addr, addr, 4);    __HM_set = 0;    /* Initialize the input queue */    __Q_Tail = NULL;    __Q_Head = NULL;        /* if the application is a server, there might not be a zhm.  The       code will fall back to something which might not be "right",       but this is is ok, since none of the servers call krb_rd_req. */    servaddr.s_addr = INADDR_NONE;    if (! __Zephyr_server) {       if ((code = ZOpenPort(NULL)) != ZERR_NONE)	  return(code);       if ((code = ZhmStat(NULL, &notice)) != ZERR_NONE)	  return(code);       ZClosePort();       /* the first field, which is NUL-terminated, is the server name.	  If this code ever support a multiplexing zhm, this will have to	  be made smarter, and probably per-message */#ifdef ZEPHYR_USES_KERBEROS       krealm = krb_realmofhost(notice.z_message);#endif       hostent = gethostbyname(notice.z_message);       if (hostent && hostent->h_addrtype == AF_INET)	   memcpy(&servaddr, hostent->h_addr, sizeof(servaddr));       ZFreeNotice(&notice);    }#ifdef ZEPHYR_USES_KERBEROS    if (krealm) {	strcpy(__Zephyr_realm, krealm);    } else if ((krb_get_tf_fullname(TKT_FILE, d1, d2, __Zephyr_realm)		!= KSUCCESS) &&	       ((krbval = krb_get_lrealm(__Zephyr_realm, 1)) != KSUCCESS)) {	return (krbval);    }#else    strcpy(__Zephyr_realm, "local-realm");#endif    __My_addr.s_addr = INADDR_NONE;    if (servaddr.s_addr != INADDR_NONE) {	/* Try to get the local interface address by connecting a UDP	 * socket to the server address and getting the local address.	 * Some broken operating systems (e.g. Solaris 2.0-2.5) yield	 * INADDR_ANY (zero), so we have to check for that. */	s = socket(AF_INET, SOCK_DGRAM, 0);	if (s != -1) {	    memset(&sin, 0, sizeof(sin));	    sin.sin_family = AF_INET;	    memcpy(&sin.sin_addr, &servaddr, sizeof(servaddr));	    sin.sin_port = HM_SRV_SVC_FALLBACK;	    if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) == 0		&& getsockname(s, (struct sockaddr *) &sin, &sinsize) == 0		&& sin.sin_addr.s_addr != 0)		memcpy(&__My_addr, &sin.sin_addr, sizeof(__My_addr));	    close(s);	}    }    if (__My_addr.s_addr == INADDR_NONE) {	/* We couldn't figure out the local interface address by the	 * above method.  Try by resolving the local hostname.  (This	 * is a pretty broken thing to do, and unfortunately what we	 * always do on server machines.) */	if (gethostname(hostname, sizeof(hostname)) == 0) {	    hostent = gethostbyname(hostname);	    if (hostent && hostent->h_addrtype == AF_INET)		memcpy(&__My_addr, hostent->h_addr, sizeof(__My_addr));	}    }    /* If the above methods failed, zero out __My_addr so things will     * sort of kind of work. */    if (__My_addr.s_addr == INADDR_NONE)	__My_addr.s_addr = 0;    /* Get the sender so we can cache it */    (void) ZGetSender();    return (ZERR_NONE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -