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
|
/* This file is part of the Project Athena Zephyr Notification System.
* It contains source for the ZOpenPort function.
*
* Created by: Robert French
*
* Copyright (c) 1987 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include "internal.h"
#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#endif
Code_t ZOpenPort(port)
unsigned short *port;
{
struct sockaddr_in bindin;
socklen_t len;
(void) ZClosePort();
if ((__Zephyr_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
__Zephyr_fd = -1;
return (errno);
}
#ifdef SO_BSDCOMPAT
{
int on = 1;
setsockopt(__Zephyr_fd, SOL_SOCKET, SO_BSDCOMPAT, (char *)&on,
sizeof(on));
}
#endif
bindin.sin_family = AF_INET;
if (port && *port)
bindin.sin_port = *port;
else
bindin.sin_port = 0;
bindin.sin_addr.s_addr = INADDR_ANY;
if (bind(__Zephyr_fd, (struct sockaddr *)&bindin, sizeof(bindin)) < 0) {
if (errno == EADDRINUSE && port && *port)
return (ZERR_PORTINUSE);
else
return (errno);
}
if (!bindin.sin_port) {
len = sizeof(bindin);
if (getsockname(__Zephyr_fd, (struct sockaddr *)&bindin, &len))
return (errno);
}
__Zephyr_port = bindin.sin_port;
__Zephyr_open = 1;
if (port)
*port = bindin.sin_port;
return (ZERR_NONE);
}
|