/*
 * ftelnetd - fake telnet daemon
 *
 * build_server.c
 * This builds just the server and calls drop_privs() 
 * and after that fake_get_login().
 *
 * Wed Feb  7 15:42:20 CET 2007
 *
 * by Levent Kayan
 * levent[at]corehack[org]
 * www.corehack.org
 *
 */
 
#include "ftelnetd.h"
#include "sighandle.h"
#include "ferror.h"
#include "wrapper.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>


/* max connect queues to listen socket */
#define LISTENQ   1024

int connfd = 0;

/* drops server process to chosen group and user id */
void drop_privs(gid_t grp_id, uid_t usr_id)
{
   if (setgid(grp_id) < 0) {
      ERR_GEN;
   }
   if (setuid(usr_id) < 0) {
      ERR_GEN;
   }
}

int build_server(uint16_t port, gid_t grp_id, uid_t usr_id)
{
   int listenfd = 0;
   pid_t child;
   socklen_t clilen;
   struct sockaddr_in caddr;
   struct sockaddr_in saddr;

   listenfd = xsocket(AF_INET, SOCK_STREAM, 0);
   
   memset(&saddr, 0, sizeof(saddr));
   saddr.sin_family = AF_INET;
   saddr.sin_addr.s_addr = htonl(INADDR_ANY);
   saddr.sin_port = htons(port);
   
   xbind(listenfd, (SA *) &saddr, sizeof(saddr));
   xlisten(listenfd, LISTENQ);
   
   signal(SIGCHLD, sig_chld);
   /* daemonise ftelnetd */
   drop_privs(grp_id, usr_id);
   while (1) {
      clilen = sizeof(caddr);
whitehat:
      if ( (connfd = accept(listenfd, (SA *) &caddr, &clilen)) < 0 ) {
         if (errno == EINTR) {
            goto whitehat;
            ERR_GEN;
         }
      }
      if ( (child = fork()) == 0) {
         close(listenfd);
         /* now, go and fake! */
         fake_login(caddr, connfd);
         close(connfd);
         exit(EXIT_SUCCESS);
      }
      close(connfd);
   }
   return 1;
}

/* EOF */


syntax highlighted by Code2HTML, v. 0.9.1