UNUSED REQUEST **prequest)
{
int newfd;
+ uint32_t magic;
rad_listen_t *this;
socklen_t salen;
struct sockaddr_storage src;
}
/*
+ * 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);
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);
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";
}
/*
+ * 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?
*/