Mercurial > pidgin
diff src/protocols/zephyr/ZLocations.c @ 2086:424a40f12a6c
[gaim-migrate @ 2096]
moving protocols from plugins/ to src/protocols. making it so that you can select which protocols are compiled statically.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Tue, 31 Jul 2001 01:00:39 +0000 |
parents | |
children | 7ba69b8e0de5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/protocols/zephyr/ZLocations.c Tue Jul 31 01:00:39 2001 +0000 @@ -0,0 +1,168 @@ +/* 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 + * + * $Source$ + * $Author: warmenhoven $ + * + * Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology. + * For copying and distribution information, see the file + * "mit-copyright.h". + */ +/* $Header$ */ + +#ifndef lint +static char rcsid_ZLocations_c[] = + "$Zephyr: /afs/athena.mit.edu/astaff/project/zephyr/src/lib/RCS/ZLocations.c,v 1.30 90/12/20 03:04:39 raeburn Exp $"; +#endif + +#include <internal.h> + +#include <pwd.h> + +extern char *getenv(); +extern int errno; + +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], mytty[MAXPATHLEN]; +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 + char *ttyp; + struct hostent *hent; + short wg_port = ZGetWGPort(); + + (void) memset((char *)¬ice, 0, sizeof(notice)); + notice.z_kind = ACKED; + notice.z_port = (u_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'; + } + bptr[0] = host; +#ifndef X_DISPLAY_MISSING + if ((display = getenv("DISPLAY")) && *display) { + (void) strcpy(mytty, display); + bptr[2] = mytty; + } else { +#endif + ttyp = ttyname(0); + if (ttyp) { + bptr[2] = strrchr(ttyp, '/'); + if (bptr[2]) + bptr[2]++; + else + bptr[2] = ttyp; + } + else + bptr[2] = "unknown"; + (void) strcpy(mytty, bptr[2]); +#ifndef X_DISPLAY_MISSING + } +#endif + reenter = 1; + } else { + bptr[0] = host; + bptr[2] = mytty; + } + + ourtime = time((time_t *)0); + bptr[1] = ctime(&ourtime); + bptr[1][strlen(bptr[1])-1] = '\0'; + + + 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); +}