#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>

#include "sessions_sdp.h"
#include "parser_sdp.h"

/* MANGEL */
#ifdef sun
/* extern int gettimeofday(struct timeval *tp, struct timezone *tzp); */
#endif

/*
 * Got it from sdr distribution sdr_server.c file
 */
int read_sessions()
{
   char *sdpdir;

   char buf[MAXADSIZE];

   DIR *dirp;
   struct dirent *direntp;

   char sdpname[256];
   FILE *sdpfile;

   struct timeval tv;

   struct session *sess = NULL;

   gettimeofday(&tv, NULL);

/*
#ifndef SYSV
   gettimeofday(&tv, NULL);
#else
   gettimeofday(&tv);
#endif
*/

   sdpdir=(char *)getenv("WRTP_SDP");
   if (sdpdir == NULL)
   {
       fprintf(stderr, "WRTP_SDP environment variable is no set\n");
       return -1;
   }

   dirp = opendir(sdpdir);
   if (dirp == NULL)
   {
       fprintf(stderr, "There is not session descriptions in %s directory\n", sdpdir);
       return -1;
   }
   else /* Parse the differents SDP files */
   {
      while ((direntp = readdir(dirp)) != NULL) 
      {
         char sd_addr[20];
         int sd_port;
         unsigned long  origsrc, src;
         time_t t;
         int ttl;
         unsigned int origin;
/*         struct scope *scope; */
         struct stat sbuf;

         sprintf(sdpname, "%s/%s", sdpdir, direntp->d_name);
         stat(sdpname, &sbuf);
         if ((sbuf.st_mode & S_IFREG)==0) continue;

         sdpfile = fopen(sdpname, "r");
         if (sdpfile!=NULL)
         {
            fgets(buf, MAXADSIZE, sdpfile);
            if(strncmp(buf, "n=", 2)==0)
            {
               sscanf(&buf[2], "%lu %lu %lu %s %u %u %u", &origsrc,
               &src, (long unsigned int*)&t, sd_addr, &sd_port, &ttl, &origin);

/* Used in sdr_server.c but no here !
 *
 *             scope=find_scope(sd_addr, ttl);
 *             bzero(buf, MAXADSIZE);
 */
               memset((void *)buf, 0, MAXADSIZE);
               fread(buf, MAXADSIZE, 1, sdpfile);
#ifdef DEBUG
               printf("Got a sdpfile entry\n");
#endif
               if((sess=parse_SDP_buffer(buf))==NULL)
               {
                 fprintf(stderr, "sdr: bad format sdpfile file: %s\n", sdpname);
                 fclose(sdpfile);
                 /* Free the session returned by parse_SDP_buffer */
                 if(sess)
                 {
                    free_session(sess);
                    sess = NULL;
                 }
                 continue;
               }
/*    printf("Session endtime: %lu, now: %lu\n", sess->endtime, tv.tv_sec); */

/* Used in sdr_server.c but no here !
 *
 *             if((sess->endtime>tv.tv_sec)||(sess->endtime==0))
 *             {
 *                printf("Storing %s\n", buf);
 *                store_entry(sess, buf, strlen(buf), &entries, origin, scope);
 *             }
 */

            }
            else
            {
               fprintf(stderr, "sdr:corrupted sdpfile file: %s\n", sdpdir);
            }
            fclose(sdpfile);
         }
         /* Free the session returned by parse_SDP_buffer */
         if(sess)
         {
            free_session(sess);
            sess = NULL;
         }
      }
      (void)closedir( dirp );
   }
   return 1;
}

struct session * 
parse_SDP_file(FILE *sdpfile)
{
   char buf[MAXADSIZE];

   struct session *sess = NULL;
 
   memset((void *)buf, 0, MAXADSIZE);
   fread(buf, MAXADSIZE, 1, sdpfile);

   if((sess=parse_SDP_buffer(buf))==NULL)
   {
#ifdef DEBUG
      fprintf(stderr, "sdr: bad format sdpfile file\n");
#endif
   }
/*    printf("Session endtime: %lu, now: %lu\n", sess->endtime, tv.tv_sec); */

/* Used in sdr_server.c but no here !
 *
 *        if((sess->endtime>tv.tv_sec)||(sess->endtime==0))
 *        {
 *           printf("Storing %s\n", buf);
 *           store_entry(sess, buf, strlen(buf), &entries, origin, scope);
 *        }
 */
   return sess;
}
