r/w socket magic && version number
authorAlan T. DeKok <aland@freeradius.org>
Thu, 4 Sep 2008 08:47:43 +0000 (10:47 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 4 Sep 2008 08:47:43 +0000 (10:47 +0200)
src/main/command.c
src/main/radmin.c

index 62a28da..c01d4a8 100644 (file)
@@ -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);
index 8cadc2d..fe5217c 100644 (file)
@@ -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?
         */