CGI.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:2k
源码类别:

操作系统开发

开发平台:

DOS

  1. #include <ctype.h>
  2. #include <mem.h>
  3. #include <string.h>
  4. #include <rtos.h>
  5. #include <net.h>
  6. #include <httpd.h>
  7. #ifdef __DJGPP__
  8. #define movmem(s,d,n)   memmove (d,s,n)
  9. #endif
  10. static BYTE read_hex( char *p )
  11. {
  12.     BYTE x;
  13.     char ch;
  14.     ch = toupper( p[0] );
  15.     x = ( ch - (( ch < 'A' ) ? '0' : 'A' - 10 )) * 0x10;
  16.     ch = toupper( p[1] );
  17.     x |= ( ch - (( ch < 'A' ) ? '0' : 'A' - 10 ));
  18.     return( x );
  19. }
  20. stringlist *cgi_getstrings( tcp_Socket *s )
  21. {
  22.     char *buf, *p, *q, *t, *data;
  23.     stringlist *sl;
  24.     int len;
  25. #define READBUF 8192
  26.     buf = kcalloc( READBUF, 1 );
  27.     if ( buf == NULL )
  28.         return( NULL );
  29.     sock_mode( s, TCP_MODE_ASCII );
  30.     memset( buf, 0, READBUF );
  31. //    sock_fastread( s, buf, READBUF );   /* real data */
  32.     // read until we have a complete string, or the connection is dead
  33.     while ( len = sock_rbused( s ) ) {
  34.         if ( sock_rbleft( s ) == 0 )
  35.             break;
  36.         if ( len >= READBUF )
  37.             break;
  38.         if ( sock_gets( s, buf, READBUF ) > 0 ) break;
  39.         tcp_tick( s );
  40.         rt_yield();
  41.     }
  42.     /* fix up string in various ways */
  43.     /* convert + to spaces */
  44.     while (( q = strchr( buf, '+' )) != NULL )
  45.         *q = ' ';
  46.     /* convert %xx to characters */
  47.     while ( (q = strchr( buf, '%')) != NULL ) {
  48.         *q++ = read_hex( q+1 );
  49.         movmem( q + 2, q, strlen( q + 2 )+1);
  50.     }
  51.     sl = strlst_new();
  52.     if ( sl == NULL ) goto fail;
  53.     /* now parse it */
  54.     p = buf;
  55.     /* skip leading n and r */
  56.     do {
  57.         if ( *p == 'n' ) p++;
  58.         else if ( *p == 'r' ) p++;
  59.         else break;
  60.     } while ( 1 );
  61.     /* kill trailing r or n */
  62.     rip( p );
  63.     while ( *p != 0 ) {
  64.         data = NULL;
  65.         q = strchr( p, '&');
  66.         if ( q != NULL ) *q = 0;
  67.         t = strchr( p, '=');
  68.         if ( t ) {
  69.             *t++ = 0;
  70.             data = kstrdup( t );
  71.         }
  72.         strlst_adddata( sl, p, data );
  73.         if ( q == NULL ) break;
  74.         p = q + 1;
  75.     }
  76.     kfree( buf );
  77.     return( sl );
  78. fail:
  79.     kfree( buf );
  80.     return( NULL );
  81. }
  82. void cgi_freestrings( stringlist *sl )
  83. {
  84.     char *data, *p;
  85.     void *x;
  86.     p = strlst_getfirst( sl, &x, &data );
  87.     while ( p != NULL ) {
  88.         if ( data != NULL ) kfree( data );
  89.         p = strlst_getnext( sl, &x, &data );
  90.     }
  91.     strlst_freeall( sl );
  92. }