From: Alan T. DeKok Date: Thu, 4 Sep 2008 08:47:43 +0000 (+0200) Subject: r/w socket magic && version number X-Git-Tag: release_2_1_0~14 X-Git-Url: http://www.project-moonshot.org/gitweb/?a=commitdiff_plain;h=7c857208eea04e8e358e9e48b66b052f99c4e9ab;p=freeradius.git r/w socket magic && version number --- diff --git a/src/main/command.c b/src/main/command.c index 62a28da..c01d4a8 100644 --- a/src/main/command.c +++ b/src/main/command.c @@ -945,6 +945,7 @@ static int command_domain_accept(rad_listen_t *listener, UNUSED REQUEST **prequest) { int newfd; + uint32_t magic; rad_listen_t *this; socklen_t salen; struct sockaddr_storage src; @@ -997,6 +998,25 @@ static int command_domain_accept(rad_listen_t *listener, } /* + * Write 32-bit magic number && version information. + */ + magic = htonl(0xf7eead15); + if (write(newfd, &magic, 4) < 0) { + radlog(L_ERR, "Failed writing initial data to socket: %s", + strerror(errno)); + close(newfd); + return -1; + } + magic = htonl(1); /* protocol version */ + if (write(newfd, &magic, 4) < 0) { + radlog(L_ERR, "Failed writing initial data to socket: %s", + strerror(errno)); + close(newfd); + return -1; + } + + + /* * Add the new listener. */ this = listen_alloc(listener->type); @@ -1019,11 +1039,6 @@ static int command_domain_accept(rad_listen_t *listener, this->recv = command_domain_recv; /* - * FIXME: set O_NONBLOCK on the accept'd fd. - * See djb's portability rants for details. - */ - - /* * Tell the event loop that we have a new FD */ event_new_fd(this); diff --git a/src/main/radmin.c b/src/main/radmin.c index 8cadc2d..fe5217c 100644 --- a/src/main/radmin.c +++ b/src/main/radmin.c @@ -99,6 +99,7 @@ static int fr_domain_socket(const char *path) int main(int argc, char **argv) { int sockfd, port; + uint32_t magic; char *line; ssize_t len, size; const char *file = RUNDIR "/radiusd/radiusd.sock"; @@ -126,6 +127,33 @@ int main(int argc, char **argv) } /* + * Read initial magic && version information. + */ + for (size = 0; size < 8; size += len) { + len = read(sockfd, buffer + size, 8 - size); + if (len < 0) { + fprintf(stderr, "Failed reading initial data from socket: %s\n", + strerror(errno)); + exit(1); + } + } + + memcpy(&magic, buffer, 4); + magic = ntohl(magic); + if (magic != 0xf7eead15) { + fprintf(stderr, "Socket is not FreeRADIUS administration socket\n"); + exit(1); + } + + memcpy(&magic, buffer + 4, 4); + magic = ntohl(magic); + if (magic != 1) { + fprintf(stderr, "Socket version mismatch: Need 1, got %d\n", + magic); + exit(1); + } + + /* * FIXME: Do login? */