00001 #include "niml_private.h"
00002
00003
00004
00005
00006
00007 static int www_debug = 0 ;
00008 #define FAILED if(www_debug)fprintf(stderr," **FAILED\n")
00009 #define DMESS(s,t) if(www_debug)fprintf(stderr,s,t)
00010
00011
00012 static char tmpdir[512] = "\0" ;
00013
00014
00015
00016 static void setup_tmpdir(void)
00017 {
00018 char *td ;
00019
00020 if( tmpdir[0] != '\0' ) return ;
00021
00022 td = getenv("TMPDIR") ;
00023 if( td == NULL ) td = getenv("TEMPDIR") ;
00024
00025 if( td == NULL || td[0] == '\0' || strlen(td) > 222 ){
00026 strcpy(tmpdir,"/tmp/") ;
00027 } else {
00028 int ltd ;
00029 NI_strncpy(tmpdir,td,511) ;
00030 ltd = strlen(tmpdir) ;
00031 if( tmpdir[ltd-1] != '/' ) strcat(tmpdir,"/") ;
00032 }
00033 }
00034
00035
00036
00037
00038
00039
00040
00041
00042 static NI_stream_type * open_URL_hpf( char *host, int port,
00043 char *file, int msec )
00044 {
00045 NI_stream_type *ns ;
00046 char str[1024] ;
00047 int ii ;
00048
00049 if( host == NULL || port <= 0 || file == NULL ) return NULL ;
00050
00051 sprintf(str,"tcp:%s:%d",host,port) ;
00052 DMESS(" ++Opening %s",str);
00053 ns = NI_stream_open( str , "w" ) ;
00054 if( ns == NULL ){ FAILED; return NULL; }
00055 ii = NI_stream_writecheck( ns , msec ) ;
00056 if( ii <= 0 ){ FAILED; NI_stream_close(ns); return NULL; }
00057
00058 DMESS(" ++GET %s",file);
00059 sprintf(str,"GET %s\n",file) ;
00060 ii = NI_stream_write( ns , str , strlen(str) ) ;
00061 if( ii <= 0 ){ FAILED; NI_stream_close(ns); return NULL; }
00062
00063 ii = NI_stream_readcheck( ns , msec ) ;
00064 if( ii <= 0 ){ FAILED; NI_stream_close(ns); return NULL; }
00065 DMESS("%s"," **OPENED");
00066 return ns ;
00067 }
00068
00069
00070
00071 #define HTTP "http://"
00072 #define HTTPLEN 7
00073
00074 #define FTP "ftp://"
00075 #define FTPLEN 6
00076
00077
00078
00079
00080
00081
00082 static NI_stream_type * open_URL_http( char *url , int msec )
00083 {
00084 char *s, *h , *file ;
00085 char hostname[1024] ;
00086 int port;
00087 NI_stream_type *ns ;
00088
00089
00090
00091 if( url == NULL || strstr(url,HTTP) != url ) return NULL ;
00092
00093
00094
00095 for( s=url+HTTPLEN , h=hostname ;
00096 (*s != '\0') && (*s != ':') && (*s != '/') ; s++ , h++ ) *h = *s ;
00097
00098 *h = '\0' ; if( hostname[0] == '\0' ) return NULL ;
00099
00100
00101
00102 port = 0 ;
00103 if( *s == ':' ){ port = strtol( ++s , &h , 10 ) ; s = h ; }
00104 if( port <= 0 ) port = 80 ;
00105
00106
00107
00108 file = (*s == '/') ? s : (char *)"/" ;
00109
00110
00111
00112 ns = open_URL_hpf( hostname , port , file , msec ) ;
00113 return ns ;
00114 }
00115
00116
00117
00118
00119 #define QBUF 4096
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 static int read_URL_http( char *url , int msec , char **data )
00135 {
00136 NI_stream_type *ns ;
00137 char *buf=NULL , *cpt , qbuf[QBUF] , qname[1024] ;
00138 int ii,jj , nall=0 , nuse ;
00139 int cflag , first ;
00140 FILE *cfile=NULL ;
00141
00142
00143
00144 if( url == NULL || data == NULL || msec < 0 ) return( -1 );
00145
00146
00147
00148 ns = open_URL_http( url , msec ) ;
00149 if( ns == NULL ){ DMESS("%s","\n"); return( -1 ); }
00150
00151
00152
00153 ii = strlen(url) ;
00154 if( ii > 3 ){
00155 cpt = url + (ii-3) ; cflag = (strcmp(cpt,".gz") == 0) ;
00156 } else {
00157 cflag = 0 ;
00158 }
00159
00160 if( cflag ){
00161 setup_tmpdir() ;
00162 strcpy(qname,tmpdir) ; strcat(qname,"ElvisXXXXXX") ;
00163 NI_mktemp(qname) ;
00164 if( qname[0] != '\0' ){
00165 strcat(qname,".gz") ; cfile = fopen( qname , "wb" ) ;
00166 if( cfile == NULL ) cflag == 0 ;
00167 } else {
00168 cflag = 0 ;
00169 }
00170
00171 if( cflag == 0 ){
00172 DMESS(" **Temp file %s FAILS\n",qname); NI_stream_close(ns); return(-1);
00173 }
00174 DMESS(" ++Temp file=%s",qname);
00175 }
00176
00177
00178
00179 if( !cflag ){ buf = (char *)malloc( QBUF ) ; nall = QBUF ; }
00180 nuse = 0 ; first = 1 ;
00181
00182 do{
00183 if(www_debug)fprintf(stderr,".");
00184 ii = NI_stream_readcheck( ns , msec ) ;
00185 if( ii <= 0 ) break ;
00186 ii = NI_stream_read( ns , qbuf , QBUF ) ;
00187 if( ii <= 0 ) break ;
00188
00189 if( first ){
00190 if( buf == NULL ){ buf = (char *)malloc(ii) ; }
00191 memcpy( buf , qbuf , ii ) ;
00192 for( jj=0 ; jj < ii ; jj++ ) buf[jj] = toupper(buf[jj]) ;
00193 buf[ii-1] = '\0' ;
00194 cpt = strstr(buf,"NOT FOUND") ;
00195 if( cpt != NULL ){
00196 if( cflag ){ fclose(cfile) ; unlink(qname) ; }
00197 DMESS("%s"," **NOT FOUND\n");
00198 free(buf) ; NI_stream_close(ns) ; return( -1 );
00199 }
00200 first = 0 ;
00201 if( cflag ){ free(buf) ; buf = NULL ; }
00202 }
00203
00204 if( cflag ){
00205 nall = fwrite( qbuf , 1 , ii , cfile ) ;
00206 if( nall != ii ){
00207 DMESS("\n** Write to temp file %s FAILED!\n",qname);
00208 fclose(cfile) ; unlink(qname) ;
00209 NI_stream_close(ns) ; return( -1 );
00210 }
00211 } else {
00212 if( nuse+ii > nall ){
00213 nall += QBUF ;
00214 buf = (char *)realloc( (void *)buf , nall ) ;
00215 }
00216 memcpy( buf+nuse , qbuf , ii ) ;
00217 }
00218 nuse += ii ;
00219 } while(1) ;
00220 NI_stream_close(ns) ;
00221
00222
00223
00224 if( nuse <= 0 ){
00225 if( cflag ){ fclose(cfile) ; unlink(qname) ; }
00226 else { free(buf) ; }
00227 FAILED; return(-1);
00228 }
00229 if(www_debug)fprintf(stderr,"!\n");
00230
00231
00232
00233 if( cflag ){
00234 fclose(cfile) ;
00235 sprintf( qbuf , "gzip -dq %s" , qname ) ;
00236 ii = system(qbuf) ;
00237 if( ii != 0 ){ DMESS("%s"," **gzip failed!\n");
00238 unlink(qname) ; return( -1 ); }
00239 ii = strlen(qname) ; qname[ii-3] = '\0' ;
00240 nuse = NI_filesize( qname ) ;
00241 if( nuse <= 0 ){ DMESS("%s"," **gzip failed!\n");
00242 unlink(qname) ; return( -1 ); }
00243
00244 cfile = fopen( qname , "rb" ) ;
00245 if( cfile == NULL ){ DMESS("%s"," **gzip failed!\n");
00246 unlink(qname) ; return( -1 ); }
00247 buf = (char *)malloc(nuse) ;
00248 fread( buf , 1 , nuse , cfile ) ;
00249 fclose(cfile) ; unlink(qname) ;
00250 }
00251
00252
00253
00254 DMESS("%s","\n"); *data = buf ; return( nuse );
00255 }
00256
00257
00258
00259 static char ftp_name[512] = "anonymous" ;
00260 static char ftp_pwd[512] = "NIML@nowhere.org" ;
00261
00262 #if 0
00263 void NI_set_URL_ftp_ident( char *name , char *pwd )
00264 {
00265 int ll ;
00266
00267 if( name == NULL || pwd == NULL ) return ;
00268
00269 ll = strlen(name) ; if( ll < 1 || ll > 511 ) return ;
00270 ll = strlen(pwd) ; if( ll < 1 || ll > 511 ) return ;
00271
00272 strcpy(ftp_name,name) ; strcpy(ftp_pwd,pwd) ; return ;
00273 }
00274 #endif
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 static int read_URL_ftp( char *url , char **data )
00285 {
00286 char *s, *h , *file , qname[1024] , sname[1024] , *cpt , *buf ;
00287 char hostname[1024] ;
00288 int port , ii , cflag , nuse ;
00289 FILE *sp ;
00290
00291
00292
00293 if( url == NULL || data == NULL || strstr(url,FTP) != url ) return( -1 );
00294
00295
00296
00297 for( s=url+FTPLEN , h=hostname ;
00298 (*s != '\0') && (*s != ':') && (*s != '/') ; s++ , h++ ) *h = *s ;
00299
00300 *h = '\0' ; if( hostname[0] == '\0' ) return( -1 );
00301
00302
00303
00304 port = 0 ;
00305 if( *s == ':' ){ port = strtol( ++s , &h , 10 ) ; s = h ; }
00306
00307
00308
00309 if( *s == '/' ){
00310 file = s+1 ; if( file[0] == '\0' ) return( -1 );
00311 } else {
00312 return( -1 );
00313 }
00314
00315
00316
00317 ii = strlen(file) ;
00318 if( ii > 3 ){
00319 cpt = file + (ii-3) ; cflag = (strcmp(cpt,".gz") == 0) ;
00320 } else {
00321 cflag = 0 ;
00322 }
00323
00324
00325
00326 setup_tmpdir() ;
00327 strcpy(qname,tmpdir) ; strcat(qname,"EthelXXXXXX") ;
00328 NI_mktemp(qname) ;
00329 if( qname[0] == '\0' ) return( -1 );
00330 if( cflag ) strcat(qname,".gz") ;
00331
00332
00333
00334 strcpy(sname,tmpdir) ; strcat(sname,"DahmerXXXXXX") ;
00335 NI_mktemp(sname) ; if( sname[0] == '\0' ) return( -1 );
00336 sp = fopen( sname , "w" ) ; if( sp == NULL ) return( -1 );
00337
00338 fprintf( sp , "#!/bin/sh\n" ) ;
00339 fprintf( sp , "ftp -n << EEEEE &> /dev/null\n") ;
00340 if( port > 0 )
00341 fprintf( sp , "open %s %d\n" , hostname , port ) ;
00342 else
00343 fprintf( sp , "open %s\n" , hostname ) ;
00344 fprintf( sp , "user %s %s\n" , ftp_name, ftp_pwd ) ;
00345 fprintf( sp , "binary\n" ) ;
00346 fprintf( sp , "get %s %s\n" , file , qname ) ;
00347 fprintf( sp , "bye\n" ) ;
00348 fprintf( sp , "EEEEE\n" ) ;
00349 fprintf( sp , "exit\n" ) ;
00350 fclose( sp ) ;
00351 chmod( sname , S_IRUSR | S_IWUSR | S_IXUSR ) ;
00352
00353
00354
00355 system( sname ) ; unlink( sname ) ;
00356
00357
00358
00359 nuse = NI_filesize( qname ) ;
00360 if( nuse <= 0 ){ unlink(qname) ; return( -1 ); }
00361
00362
00363
00364 if( cflag ){
00365 sprintf( sname , "gzip -dq %s" , qname ) ;
00366 ii = system(sname) ;
00367 if( ii != 0 ){ unlink(qname) ; return( -1 ); }
00368 ii = strlen(qname) ; qname[ii-3] = '\0' ;
00369 nuse = NI_filesize( qname ) ;
00370 if( nuse <= 0 ){ unlink(qname) ; return( -1 ); }
00371 }
00372
00373
00374
00375 sp = fopen( qname , "rb" ) ;
00376 if( sp == NULL ){ unlink(qname) ; return( -1 ); }
00377 buf = (char *)malloc(nuse); if( buf == NULL ){ unlink(qname); return( -1 ); }
00378
00379 fread( buf , 1 , nuse , sp ) ;
00380 fclose(sp) ; unlink(qname) ;
00381
00382
00383
00384 *data = buf ; return( nuse );
00385 }
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 int NI_read_URL( char *url , char **data )
00401 {
00402 int nn ;
00403 if( url == NULL || data == NULL ) return( -1 );
00404
00405 if( getenv("NIML_WWW_DEBUG") != NULL ) www_debug = 1 ;
00406
00407 if( strstr(url,HTTP) == url ){
00408 nn = read_URL_http( url , 4444 , data ) ; return(nn) ;
00409 }
00410
00411 else if( strstr(url,FTP) == url ){
00412 nn = read_URL_ftp( url , data ) ; return(nn) ;
00413 }
00414
00415 return( -1 );
00416 }
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432 int NI_read_URL_tmpdir( char *url , char **tname )
00433 {
00434 int nn , ll ;
00435 char *data , *fname , *tt ;
00436 FILE *fp ;
00437
00438 if( url == NULL || tname == NULL ) return( -1 );
00439
00440 nn = NI_read_URL( url , &data ) ;
00441 if( nn <= 0 ) return( -1 );
00442
00443
00444
00445 setup_tmpdir() ;
00446 fname = (char *)malloc(strlen(url)+strlen(tmpdir)+1) ;
00447 tt = trailname(url,0) ;
00448 strcpy(fname,tmpdir) ; strcat(fname,tt) ; ll = strlen(fname) ;
00449 if( ll > 3 && strcmp(fname+(ll-3),".gz") == 0 ) fname[ll-3] = '\0' ;
00450
00451
00452
00453 fp = fopen( fname , "wb" ) ;
00454 if( fp == NULL ){
00455 fprintf(stderr,"** Can't open temporary file %s\n",fname);
00456 free(data) ; return( -1 );
00457 }
00458 ll = fwrite(data,1,nn,fp) ; fclose(fp) ; free(data) ;
00459 if( ll != nn ){ unlink(fname); return( -1 ); }
00460
00461 *tname = fname ; return( nn );
00462 }