home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / ccs / ccs-11.lha / ccs-lib / lib / sock_xex.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-10  |  4.8 KB  |  187 lines

  1. /*    sock_xex . c
  2. #
  3. %    Copyright (c)    Jin Guojun
  4. %
  5. %    Socket X-extended Server
  6. %    If RTP is initialized, and it is not impelmented in kernel method;
  7. %    then, we need a special rtp_read routine to read incoming data.
  8. %
  9. % AUTHOR:    Jin Guojun - LBL    01/01/93
  10. */
  11.  
  12. #include <fcntl.h>
  13. #define    KERNEL
  14. #include "net_need.h"
  15.  
  16. #ifndef    SERVER
  17. #define    SERVER    "s_master"
  18. #endif
  19.  
  20. #define    TOTAL_HEADER_BYTES    TOTAL_RTP_MOVIE_HEADER_BYTES
  21.  
  22.  
  23. static    rtpmsg_hd    msg_hdr;
  24. static    char    buf[1024], **plist;
  25. static    int    pnum, as, so;
  26. static    magic_server    ss[2];    /* 0 for TCP, and 1 for RTP or others    */
  27. static    struct sockaddr_in    sain;
  28.  
  29. build_arg_list(char *buf, char **tpp[])
  30. {
  31. register int    i, n, p = n = 0;
  32. char*    *lp;
  33.     Loop    {
  34.         n++;
  35.         if (!(i = strchr(buf+p, Space)))    break;
  36.         i -= (int)buf;
  37.         buf[i++] = 0;    /* add terminator    */
  38.         p = i;
  39.     }    n++;
  40.     verify_buffer_size(tpp, n--, sizeof(tpp), "tpp");
  41.     lp = *tpp;
  42.     lp[p=0] = "socket";
  43.     for (i=p; i++ < n;)    {    /* start from second ap    */
  44.         lp[i] = buf + p;
  45.         while (buf[p++]);
  46.     }
  47. return    n;
  48. }
  49.  
  50. get_arg_list(int *rpp)
  51. {
  52. if (rpp)
  53.     *rpp = (int)plist;
  54. return    pnum;
  55. }
  56.  
  57. x_extender_init(char *server_name, bool rtp, int buf_size, int carrier)
  58. {
  59.     if (!server_name)
  60.         sprintf(server_name=buf, "%s", SERVER);
  61.     sain.sin_addr.s_addr = INADDR_ANY;
  62. retryexi:
  63.     if (rtp)    {
  64.         carrier = carrier ? SOCK_DGRAM : SOCK_RAW;
  65.         so = rtp_open(NULL, server_name, carrier, 0, buf_size);
  66.         ss[rtp].so = so;
  67.         ss[rtp].m_port = get_soaddr(0, NULL)->sin_port;
  68.     } else    {
  69.         if (buf_size < 4096 || buf_size > Max_WINDOW_SIZE)
  70.         buf_size=Max_WINDOW_SIZE;
  71.         so = build_socket(NULL, server_name, SOCK_STREAM,
  72.             False, &buf_size, &sain, ss);
  73.     }
  74.     if (so < 0)    {
  75.         if (errno != EADDRINUSE || sain.sin_port == SV_PORT)
  76.             return    prgmerr(0, "%d:bind[%d] -> port = %d",
  77.                 carrier, so, sain.sin_port);
  78.         sprintf(server_name=buf, "%d", SV_PORT);
  79.         goto    retryexi;
  80.     }
  81.     if (!rtp)    listen(so, 4);    /* TCP    */
  82. return    sain.sin_port;
  83. }
  84.  
  85. FILE*
  86. x_extender(bool rtp)
  87. {
  88. fd_set    ready;
  89. int    l;
  90. short    psize;
  91. register int    i;
  92.  
  93. struct timeval    to;
  94.     FD_ZERO(&ready);
  95.     FD_SET(so = ss[rtp].so, &ready);
  96.     to.tv_sec = 0;    to.tv_usec = 100000;
  97.     if ((i=select(so+1, &ready, 0, 0, &to)) < 0 && DEBUGANY)
  98.         msg("    select %d(%d)    ", i, so);
  99.     if (FD_ISSET(so, &ready))    {
  100.         if (!ss[rtp].connected)    {
  101.         l = sizeof(sain);
  102.         ss[rtp].as = as = rtp ? so : accept(so, &sain, &l);
  103. #ifdef    _DEBUG_
  104.         msg("select returns %d[%d]{%X}\t", so, as, i);
  105. #endif
  106.         if (as > 0)    {
  107.             if (fcntl(as, F_SETOWN,  getpid())<0)
  108.             syserr("F_SETOWN %d", getpid());
  109.             if (fcntl(as, F_SETFL, FASYNC)<0)
  110.             syserr("F_SETEL FASYNC");
  111.             ss[rtp].connected++;
  112.             ss[rtp].stat = ss[rtp].dp = pnum = 0;
  113.  
  114.             if (rtp)    {
  115.             if (rtp_read(as, NULL, 78) > 0)    {
  116.             rtp_flow_ctrl*    rrp = get_rtp_control(as, 0);
  117.             register BUFFER    *bp;
  118.             if (!rrp || rrp->miss && !rrp->list[0]) /* miss hdr */
  119.                 goto    disc;
  120.             if (!(bp=buffer_create(0, TOTAL_HEADER_BYTES)))
  121.                 return    0;
  122.             ss[1].fp = (FILE*)bp;
  123.             bp->ptr = (bp->base = rrp->buf) + bp->offset;
  124.             bp->bsize = pointer_buffer_size(rrp->buf);
  125.             if (buffer_seek(bp, 0, SEEK_PEEK) == '#' &&
  126.                 !buffer_seek(bp, 0, SEEK_PEEK))    {
  127.                 buffer_seek(bp, 2, SEEK_CUR);
  128.                 buffer_read(&psize, 1, sizeof(psize), bp);
  129.                 i = htons(psize) + 1;
  130.                 buffer_read(&msg_hdr, 1, sizeof(msg_hdr), bp);
  131.                 buffer_read(buf, 1, i, bp);
  132.                 goto    common_sub;
  133.             }
  134.             goto    common_out;
  135.             } else    goto    disc;
  136.             } else {
  137.             if ((ss[rtp].fp=fdopen(as, "rb")))    {
  138.             if ((i=fgetc(ss[rtp].fp)) == '#')
  139.                 if (!(l=fgetc(ss[rtp].fp)))    {
  140.                 fread(&psize, 1, sizeof(short), ss[rtp].fp);
  141.                 i = htons(psize) + 1;    /* NULL terminator */
  142.                 fread(&msg_hdr, 1, sizeof(msg_hdr), ss[rtp].fp);
  143.                 fread(buf, 1, i, ss[rtp].fp);
  144.  
  145. common_sub:            gettimeofday(&ss[rtp].ts, 0);
  146.                 msg_hdr.tsr_s = ss[rtp].ts.tv_sec;
  147.                 msg_hdr.tsr_us = ss[rtp].ts.tv_usec;
  148.                 pnum = build_arg_list(buf, &plist);
  149. #ifdef    _DEBUG_
  150.                 msg("params size %d {# %d}\n", i, pnum);
  151. #endif
  152.                 }    else    ungetc(l, ss[rtp].fp),
  153.                     ungetc('#', ss[rtp].fp);
  154.             else    ungetc(i, ss[rtp].fp);
  155. common_out:
  156. #ifdef    _DEBUG_
  157.             msg("#1 = %c [%d], #2 = %d\n", i, i, l);
  158. #endif    /* params start with "#" ('#'\0)    */
  159.             return    i<0 ? NULL : ss[rtp].fp;
  160.             } else    return    (FILE*)prgmerr(-1, "fdopen");
  161.             }
  162.         }    /* never out from here    */
  163.         }    /* already connected    */
  164.         if (rtp)    goto    disc;
  165.         message("%d: something happened %d\n", ss[rtp].connected, as);
  166.     } else if (ss[rtp].connected)    {    /* fd not set    */
  167.         FD_ZERO(&ready);
  168.         FD_SET(as, &ready);
  169.         i = select(as+1, &ready, 0, 0, &to);
  170. #ifdef    _DEBUG_
  171.         msg("%d {%X} %d\n", i, FD_ISSET(as, &ready), to.tv_usec);
  172. #endif
  173.         if (i && FD_ISSET(as, &ready))    {
  174.             /* close(as);    /* prepare to reconnect */
  175. disc:            if (!rtp)    fclose(ss[rtp].fp);
  176.             ss[rtp].connected = 0;
  177. /*            if (rtp)    x_extender_init(0, rtp, 0);    */
  178. #ifdef    _DEBUG_
  179.             fprintf(stderr, "\t%d(%d): disconnect at {%X}\n",
  180.                 i, as, FD_ISSET(as, &ready));
  181. #endif
  182.         }
  183.     }
  184.     fflush(stderr);
  185. return    NULL;
  186. }
  187.