1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
/* This file is part of the Project Athena Zephyr Notification System.
* It contains source for the ZSetLocation, ZUnsetLocation, and
* ZFlushMyLocations functions.
*
* Created by: Robert French
*
* Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include "internal.h"
#ifndef WIN32
#include <pwd.h>
#endif
#include <stdlib.h>
#include <errno.h>
Code_t ZSetLocation(exposure)
char *exposure;
{
return (Z_SendLocation(LOGIN_CLASS, exposure, ZAUTH,
"$sender logged in to $1 on $3 at $2"));
}
Code_t ZUnsetLocation()
{
return (Z_SendLocation(LOGIN_CLASS, LOGIN_USER_LOGOUT, ZNOAUTH,
"$sender logged out of $1 on $3 at $2"));
}
Code_t ZFlushMyLocations()
{
return (Z_SendLocation(LOGIN_CLASS, LOGIN_USER_FLUSH, ZAUTH, ""));
}
static char host[MAXHOSTNAMELEN];
static char *mytty = NULL;
static int reenter = 0;
Code_t Z_SendLocation(class, opcode, auth, format)
char *class;
char *opcode;
Z_AuthProc auth;
char *format;
{
int retval;
time_t ourtime;
ZNotice_t notice, retnotice;
char *bptr[3];
#ifndef X_DISPLAY_MISSING
char *display;
#endif
#ifndef WIN32
char *ttyp;
char *p;
#endif
struct hostent *hent;
short wg_port = ZGetWGPort();
(void) memset((char *)¬ice, 0, sizeof(notice));
notice.z_kind = ACKED;
notice.z_port = (unsigned short) ((wg_port == -1) ? 0 : wg_port);
notice.z_class = class;
notice.z_class_inst = ZGetSender();
notice.z_opcode = opcode;
notice.z_sender = 0;
notice.z_recipient = "";
notice.z_num_other_fields = 0;
notice.z_default_format = format;
/*
keep track of what we said before so that we can be consistent
when changing location information.
This is done mainly for the sake of the WindowGram client.
*/
if (!reenter) {
if (gethostname(host, MAXHOSTNAMELEN) < 0)
return (errno);
hent = gethostbyname(host);
if (hent) {
(void) strncpy(host, hent->h_name, sizeof(host));
host[sizeof(host) - 1] = '\0';
}
#ifndef X_DISPLAY_MISSING
if ((display = getenv("DISPLAY")) && *display) {
mytty = g_strdup(display);
} else {
#endif
#ifdef WIN32
mytty = g_strdup("WinPurple");
#else
ttyp = ttyname(0);
if (ttyp && *ttyp) {
p = strchr(ttyp + 1, '/');
mytty = g_strdup((p) ? p + 1 : ttyp);
} else {
mytty = g_strdup("unknown");
}
#endif
#ifndef X_DISPLAY_MISSING
}
#endif
reenter = 1;
}
ourtime = time((time_t *)0);
bptr[0] = host;
bptr[1] = ctime(&ourtime);
bptr[1][strlen(bptr[1])-1] = '\0';
bptr[2] = mytty;
if ((retval = ZSendList(¬ice, bptr, 3, auth)) != ZERR_NONE)
return (retval);
retval = Z_WaitForNotice (&retnotice, ZCompareUIDPred, ¬ice.z_uid,
SRV_TIMEOUT);
if (retval != ZERR_NONE)
return retval;
if (retnotice.z_kind == SERVNAK) {
if (!retnotice.z_message_len) {
ZFreeNotice(&retnotice);
return (ZERR_SERVNAK);
}
if (!strcmp(retnotice.z_message, ZSRVACK_NOTSENT)) {
ZFreeNotice(&retnotice);
return (ZERR_AUTHFAIL);
}
if (!strcmp(retnotice.z_message, ZSRVACK_FAIL)) {
ZFreeNotice(&retnotice);
return (ZERR_LOGINFAIL);
}
ZFreeNotice(&retnotice);
return (ZERR_SERVNAK);
}
if (retnotice.z_kind != SERVACK) {
ZFreeNotice(&retnotice);
return (ZERR_INTERNAL);
}
if (!retnotice.z_message_len) {
ZFreeNotice(&retnotice);
return (ZERR_INTERNAL);
}
if (strcmp(retnotice.z_message, ZSRVACK_SENT) &&
strcmp(retnotice.z_message, ZSRVACK_NOTSENT)) {
ZFreeNotice(&retnotice);
return (ZERR_INTERNAL);
}
ZFreeNotice(&retnotice);
return (ZERR_NONE);
}
|