Doxygen Source Code Documentation
thd_iochan.h File Reference
#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <string.h>#include <strings.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <netinet/tcp.h>#include <netdb.h>#include <arpa/inet.h>#include <sys/time.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <sys/times.h>#include <limits.h>#include <ctype.h>#include <sys/ipc.h>#include <sys/shm.h>Go to the source code of this file.
Data Structures | |
| struct | IOCHAN |
Defines | |
| #define | MIN(a, b) (((a)<(b)) ? (a) : (b)) |
| #define | MAX(a, b) (((a)>(b)) ? (a) : (b)) |
| #define | NEXTDMS(dm) MIN(1.1*(dm)+1.01 , 1000.0) |
| #define | BCOPY memcpy |
| #define | TCP_IOCHAN 1 |
| #define | SHM_IOCHAN 2 |
| #define | SHM_BUFSIZ (2*1024*1024) |
| #define | TCP_WAIT_ACCEPT 7 |
| #define | TCP_WAIT_CONNECT 8 |
| #define | SHM_WAIT_CREATE 9 |
| #define | SHM_WAIT_ACCEPT 10 |
| #define | CREATOR 33 |
| #define | ACCEPTOR 44 |
| #define | SHMIOC_READ(ic) ( ((ic)->whoami == CREATOR && (ic)->ioc2 != NULL) ? (ic)->ioc2 : (ic) ) |
| #define | SHMIOC_WRITE(ic) ( ((ic)->whoami == ACCEPTOR && (ic)->ioc2 != NULL) ? (ic)->ioc2 : (ic) ) |
| #define | IOC_BAD(ic) ( ((ic)->ioc2 != NULL) ? MAX( (ic)->bad , (ic)->ioc2->bad ) : (ic)->bad ) |
| #define | IOC_BIDIR(ic) |
| #define | tcp_recv recv |
| #define | IOC_TCP_SENDSIZE 501 |
| #define | IOCHAN_CLOSE(ioc) ( iochan_close(ioc) , (ioc)=NULL ) |
| #define | IOCHAN_CLOSENOW(ioc) ( iochan_set_cutoff(ioc), iochan_sleep(1), iochan_close(ioc), (ioc)=NULL ) |
| #define | CLEAR_SHM(ic, ms) |
Typedefs | |
| typedef IOCHAN | IOCHAN |
Functions | |
| int | tcp_readcheck (int, int) |
| int | tcp_writecheck (int, int) |
| int | tcp_connect (char *, int) |
| int | tcp_accept (int, char **, char **) |
| int | tcp_listen (int) |
| int | tcp_alivecheck (int) |
| void | tcp_set_cutoff (int) |
| char * | iochan_error_string (void) |
| void | iochan_enable_perror (int) |
| key_t | string_to_key (char *) |
| int | shm_accept (char *) |
| int | shm_create (char *, int) |
| int | shm_size (int) |
| int | shm_nattach (int) |
| char * | shm_attach (int) |
| int | shm_alivecheck (int) |
| void | iochan_sleep (int) |
| IOCHAN * | iochan_init (char *, char *) |
| int | iochan_goodcheck (IOCHAN *, int) |
| void | iochan_close (IOCHAN *) |
| void | iochan_set_cutoff (IOCHAN *) |
| int | iochan_writecheck (IOCHAN *, int) |
| int | iochan_readcheck (IOCHAN *, int) |
| int | iochan_clearcheck (IOCHAN *, int) |
| int | iochan_send (IOCHAN *, char *, int) |
| int | iochan_recv (IOCHAN *, char *, int) |
| int | iochan_sendall (IOCHAN *, char *, int) |
| int | iochan_recvall (IOCHAN *, char *, int) |
| int | iochan_ctl (IOCHAN *, int, int) |
| int | iochan_force_clear (IOCHAN *) |
| int | iochan_recvloop (IOCHAN *, char *, int) |
| pid_t | iochan_fork_relay (char *, char *) |
| double | COX_clock_time (void) |
| double | COX_cpu_time (void) |
| IOCHAN * | open_URL_hpf (char *host, int port, char *file, int msec) |
| IOCHAN * | open_URL_http (char *url, int msec) |
| int | read_URL_http (char *url, int msec, char **data) |
| int | read_URL_ftp (char *url, char **data) |
| int | read_URL (char *url, char **data) |
| void | set_URL_ftp_ident (char *name, char *pwd) |
| void | set_URL_progress (int) |
| void | set_HTTP_10 (int) |
| void | set_HTTP_user_agent (char *) |
Define Documentation
|
|
Definition at line 64 of file thd_iochan.h. Referenced by iochan_init(). |
|
|
Definition at line 51 of file thd_iochan.h. Referenced by iochan_recv(), and iochan_send(). |
|
|
Value: do{ if( (ic) != NULL && (ic)->type == SHM_IOCHAN ) \ iochan_clearcheck( (ic) , (ms) ) ; \ } while(0) Definition at line 159 of file thd_iochan.h. |
|
|
Definition at line 63 of file thd_iochan.h. Referenced by iochan_init(). |
|
|
Definition at line 72 of file thd_iochan.h. Referenced by iochan_goodcheck(), iochan_recv(), iochan_recvall(), iochan_recvloop(), iochan_send(), and iochan_sendall(). |
|
|
Value: ( ((ic)->type == TCP_IOCHAN) || \ ((ic)->type == SHM_IOCHAN && (ic)->ioc2 != NULL) ) Definition at line 75 of file thd_iochan.h. |
|
|
codes for the "cmd" argument to iochan_ctl * Definition at line 149 of file thd_iochan.h. Referenced by iochan_ctl(). |
|
|
Definition at line 151 of file thd_iochan.h. Referenced by afni_io(), AFNI_plugout_workproc(), AFNI_send_image(), AFNI_start_io(), AFNI_version_check(), main(), open_URL_hpf(), and read_URL_http(). |
|
|
Definition at line 153 of file thd_iochan.h. Referenced by ART_start_io(), cleanup_rtinp(), new_RT_input(), RT_acquire_info(), RT_check_listen(), and RT_worker(). |
|
|
Definition at line 46 of file thd_iochan.h. |
|
|
Definition at line 43 of file thd_iochan.h. |
|
|
Definition at line 49 of file thd_iochan.h. |
|
|
Definition at line 56 of file thd_iochan.h. |
|
|
Definition at line 54 of file thd_iochan.h. Referenced by AFNI_send_image(), iochan_clearcheck(), iochan_close(), iochan_goodcheck(), iochan_init(), iochan_readcheck(), iochan_recv(), iochan_send(), and iochan_writecheck(). |
|
|
Definition at line 61 of file thd_iochan.h. |
|
|
Definition at line 60 of file thd_iochan.h. |
|
|
Definition at line 66 of file thd_iochan.h. Referenced by iochan_readcheck(), and iochan_recv(). |
|
|
Definition at line 69 of file thd_iochan.h. Referenced by iochan_clearcheck(), iochan_send(), and iochan_writecheck(). |
|
|
Definition at line 53 of file thd_iochan.h. Referenced by iochan_clearcheck(), iochan_close(), iochan_goodcheck(), iochan_init(), iochan_readcheck(), iochan_recv(), iochan_send(), iochan_set_cutoff(), and iochan_writecheck(). |
|
|
Definition at line 118 of file thd_iochan.h. |
|
|
Definition at line 58 of file thd_iochan.h. |
|
|
Definition at line 59 of file thd_iochan.h. |
Typedef Documentation
|
|
|
Function Documentation
|
|
Definition at line 1695 of file thd_iochan.c. Referenced by AFNI_splashdown(), AFNI_start_io(), calculate_results(), get_surf_data(), main(), and MAIN_workprocess().
01696 {
01697 struct timeval new_tval ;
01698 struct timezone tzone ;
01699 static struct timeval old_tval ;
01700 static int first = 1 ;
01701
01702 gettimeofday( &new_tval , &tzone ) ;
01703
01704 if( first ){
01705 old_tval = new_tval ;
01706 first = 0 ;
01707 return 0.0 ;
01708 }
01709
01710 if( old_tval.tv_usec > new_tval.tv_usec ){
01711 new_tval.tv_usec += 1000000 ;
01712 new_tval.tv_sec -- ;
01713 }
01714
01715 return (double)( (new_tval.tv_sec - old_tval.tv_sec )
01716 +(new_tval.tv_usec - old_tval.tv_usec)*1.0e-6 ) ;
01717 }
|
|
|
Definition at line 1723 of file thd_iochan.c.
01725 {
01726 struct tms ttt ;
01727
01728 (void) times( &ttt ) ;
01729 return ( (double) (ttt.tms_utime /* + ttt.tms_stime */ )
01730 / (double) CLK_TCK ) ;
01731 }
01732 #else
01733 { return 0.0 ; }
|
|
||||||||||||
|
loop until readcheck says no data available * Definition at line 1061 of file thd_iochan.c. References IOCHAN::bend, IOCHAN::bstart, IOCHAN::bufsize, error_string, IOCHAN::id, iochan_goodcheck(), iochan_sleep(), MIN, NEXTDMS, SHM_IOCHAN, SHMIOC_WRITE, TCP_IOCHAN, tcp_readcheck(), and IOCHAN::type. Referenced by AFNI_start_io(), AFNI_start_version_check(), ART_start_io(), main(), and RT_acquire_info().
01062 {
01063 int ii ;
01064
01065 /** check if the IOCHAN is good **/
01066
01067 error_string = NULL ;
01068
01069 ii = iochan_goodcheck(ioc,0) ;
01070 if( ii == -1 ) return -1 ; /* some error */
01071 if( ii == 0 ) return 1 ; /* not good yet, so can be no data */
01072
01073 /** tcp: ==> use the Unix "select" mechanism **/
01074
01075 if( ioc->type == TCP_IOCHAN ) return ( tcp_readcheck(ioc->id,msec) == 0 ) ;
01076
01077 /** shm: ==> must loop and wait ourselves **/
01078
01079 if( ioc->type == SHM_IOCHAN ){
01080 int nread , dms=0 , ms ;
01081
01082 if( msec < 0 ) msec = 999999999 ; /* a long time (11+ days) */
01083
01084 ioc = SHMIOC_WRITE(ioc) ; /* 24 June 1997 */
01085
01086 for( ms=0 ; ms < msec ; ms += dms ){
01087 nread = (*(ioc->bend) - *(ioc->bstart) + ioc->bufsize + 1) % (ioc->bufsize) ;
01088 if( nread == 0 ) return 1 ;
01089 dms = NEXTDMS(dms) ; dms = MIN(dms,msec-ms) ; iochan_sleep(dms) ;
01090 ii = iochan_goodcheck(ioc,0) ; if( ii == -1 ) return -1 ;
01091 }
01092 nread = (*(ioc->bend) - *(ioc->bstart) + ioc->bufsize + 1) % (ioc->bufsize) ;
01093 return (nread == 0) ;
01094 }
01095
01096 return -1 ; /* should never be reached */
01097 }
|
|
|
if there is a second channel, check it too * Definition at line 931 of file thd_iochan.c. References IOCHAN::bstart, CLOSEDOWN, free, IOCHAN::id, IOCHAN::ioc2, SHM_IOCHAN, shm_nattach(), shm_RMID_delay, TCP_IOCHAN, and IOCHAN::type. Referenced by AFNI_exit(), AFNI_plugout_exit(), ART_exit(), iochan_fork_relay(), iochan_fork_sigfunc(), iochan_init(), RT_exit(), and vc_exit().
00932 {
00933 if( ioc == NULL ) return ;
00934
00935 if( ioc->ioc2 != NULL ) iochan_close(ioc->ioc2) ;
00936
00937 if( ioc->type == TCP_IOCHAN ){
00938 if( ioc->id >= 0 ) CLOSEDOWN(ioc->id) ;
00939 }
00940
00941 else if( ioc->type == SHM_IOCHAN ){
00942 #ifndef DONT_USE_SHM
00943 if( ioc->id >= 0 ){
00944 shmdt( (char *) ioc->bstart ) ; /* detach */
00945 /* then kill */
00946 if( !shm_RMID_delay || shm_nattach(ioc->id) < 1 )
00947 shmctl( ioc->id , IPC_RMID , NULL ) ;
00948 }
00949 #endif
00950 }
00951
00952 free( ioc ) ; return ;
00953 }
|
|
||||||||||||||||
|
Definition at line 1470 of file thd_iochan.c. References arg, IOC_TCP_SENDSIZE, and IOCHAN::sendsize.
01471 {
01472 if( ioc == NULL ) return -1 ;
01473
01474 switch( cmd ){
01475
01476 case IOC_TCP_SENDSIZE:
01477 if( arg >= 0 ){ ioc->sendsize = arg ; return 0 ; }
01478 else return -1 ;
01479 break ;
01480
01481 }
01482 return -1 ;
01483 }
|
|
|
Definition at line 65 of file thd_iochan.c. Referenced by AFNI_start_version_check().
|
|
|
Definition at line 13 of file thd_iochan.c. References error_string. Referenced by afni_io(), AFNI_process_plugout(), and iochan_fork_relay().
00013 { return error_string; }
|
|
|
Definition at line 1033 of file thd_iochan.c. References iochan_readcheck(), iochan_recv(), and QBUF.
01034 {
01035 int ii , ntot = 0 ;
01036 char qbuf[QBUF] ;
01037
01038 do{
01039 ii = iochan_readcheck(ioc,0) ;
01040 if( ii == -1 ) return -1 ;
01041 if( ii == 0 ) return ntot ;
01042
01043 ii = iochan_recv( ioc , qbuf , QBUF ) ;
01044 if( ii == -1 ) return -1 ;
01045 ntot += ii ;
01046
01047 } while( 1 ) ; /** loop until readcheck says no data available **/
01048
01049 return -1 ; /* should not be reached */
01050 }
|
|
||||||||||||
|
Definition at line 1566 of file thd_iochan.c. References AFMALL, iochan_close(), iochan_error_string(), iochan_fork_sigfunc(), iochan_goodcheck(), iochan_init(), iochan_readcheck(), iochan_recvloop(), iochan_sendall(), iochan_sleep(), and iochan_writecheck(). Referenced by AFNI_start_io().
01567 {
01568 pid_t ppid = (pid_t)(-1) ;
01569 int jj , kk , nbuf ;
01570 #define MBUF 1048576 /* 1 Megabyte */
01571 char * buf , *sss ;
01572 IOCHAN *ioc_in, *ioc_out ;
01573
01574 if( name_in == NULL || name_out == NULL ) return ppid ;
01575
01576 /*-- fork into two processes --*/
01577
01578 ppid = fork() ;
01579 if( ppid == (pid_t)(-1) ){
01580 perror("iochan_fork failed") ;
01581 return ppid ;
01582 }
01583
01584 if( ppid != 0 ){ /* the parent process */
01585 pid_t qpid ;
01586 iochan_sleep(5) ; /* wait a little bit */
01587 qpid = waitpid( ppid , NULL , WNOHANG ) ; /* see if child died */
01588 if( qpid == ppid ) ppid = (pid_t)(-1) ; /* if it did, return error */
01589 return ppid ;
01590 }
01591
01592 /*--- from here on is the child process, which never returns ---*/
01593
01594 ioc_in = iochan_init( name_in , "accept" ) ; /* open input */
01595 if( ioc_in == NULL ) _exit(1) ; /* failed? */
01596
01597 ioc_out = iochan_init( name_out , "create" ) ; /* open output */
01598 if( ioc_out == NULL ){ /* failed? */
01599 iochan_close(ioc_in) ; _exit(1) ;
01600 }
01601
01602 /* set signal handler to deal with sudden death situations */
01603
01604 ioc_kill_1 = ioc_in ;
01605 ioc_kill_2 = ioc_out ;
01606 signal( SIGTERM , iochan_fork_sigfunc ) ;
01607 signal( SIGSEGV , iochan_fork_sigfunc ) ;
01608
01609 fprintf(stderr,"forked process for shm->tcp started\n") ;
01610
01611 do{ /* loop until both iochans are ready */
01612
01613 jj = iochan_goodcheck(ioc_in ,1) ;
01614 kk = iochan_goodcheck(ioc_out,1) ;
01615 if( jj < 0 || kk < 0 ){
01616 iochan_close(ioc_in) ; iochan_close(ioc_out) ; _exit(1) ;
01617 }
01618
01619 } while( jj == 0 || kk == 0 ) ;
01620
01621 fprintf(stderr,"forked process fully connected\n") ;
01622
01623 buf = AFMALL(char, MBUF) ; /* workspace for transfers */
01624 if( buf == NULL ){
01625 fprintf(stderr,"forked process can't malloc I/O buffer") ;
01626 iochan_close(ioc_in) ; iochan_close(ioc_out) ; _exit(1) ;
01627 }
01628
01629 while(1){ /* loop, waiting for data */
01630
01631 errno = 0 ;
01632 jj = iochan_readcheck( ioc_in , 20 ) ; /* any input? */
01633 if( jj < 0 ){ /* bad news? */
01634 if( errno ) perror( "forked readcheck" ) ;
01635 else fprintf(stderr,"forked readcheck abort: jj=%d!\n",jj) ;
01636 sss = iochan_error_string() ;
01637 if( sss != NULL ) fprintf(stderr," ** %s\n",sss) ;
01638 break ;
01639 }
01640 if( jj == 0 ) continue ; /* no news */
01641
01642 nbuf = iochan_recvloop( ioc_in , buf , MBUF ) ; /* get input! */
01643 if( nbuf <= 0 ) continue ; /* too weird! */
01644
01645 #if 0
01646 fprintf(stderr,"forked process read %d bytes\n",nbuf) ;
01647 #endif
01648
01649 errno = 0 ;
01650 kk = iochan_writecheck( ioc_out , 1 ) ; /* check */
01651 if( kk == 0 ){
01652 int qq ;
01653 fprintf(stderr,"forked writecheck repeat:") ;
01654 for( qq=0 ; qq < 1000 ; qq++ ){
01655 if( qq%50 == 0 ) fprintf(stderr," %d",qq+1) ;
01656 kk = iochan_writecheck( ioc_out , 2 ) ;
01657 if( kk != 0 ) break ;
01658 }
01659 fprintf(stderr,"\n") ;
01660 }
01661 if( kk <= 0 ){
01662 if( errno ) perror( "forked writecheck" ) ;
01663 else fprintf(stderr,"forked writecheck abort: kk=%d!\n",kk) ;
01664 sss = iochan_error_string() ;
01665 if( sss != NULL ) fprintf(stderr," ** %s\n",sss) ;
01666 break ;
01667 }
01668 kk = iochan_sendall( ioc_out , buf , nbuf ) ; /* send data! */
01669 if( kk < 0 ){ /* bad news? */
01670 if( errno ) perror( "forked sendall" ) ;
01671 else fprintf(stderr,"forked sendall abort: kk=%d!\n",kk) ;
01672 sss = iochan_error_string() ;
01673 if( sss != NULL ) fprintf(stderr," ** %s\n",sss) ;
01674 break ;
01675 }
01676
01677 #if 0
01678 fprintf(stderr,"forked process wrote %d bytes\n",nbuf) ;
01679 #endif
01680 }
01681
01682 /* bad news ==> shut down child operations */
01683
01684 fprintf(stderr,"forked process fails!\n") ;
01685
01686 iochan_close(ioc_in) ; iochan_close(ioc_out) ; _exit(1) ;
01687 }
|
|
||||||||||||
|
Definition at line 810 of file thd_iochan.c. References IOCHAN::bad, IOCHAN::bend, IOCHAN::bstart, IOCHAN::buf, IOCHAN::bufsize, CLOSEDOWN, error_string, free, IOCHAN::id, IOCHAN::ioc2, IOC_BAD, iochan_sleep(), MIN, IOCHAN::name, NEXTDMS, IOCHAN::port, shm_accept(), shm_alivecheck(), shm_attach(), SHM_IOCHAN, shm_nattach(), shm_size(), STATUS, tcp_accept(), tcp_alivecheck(), tcp_connect(), TCP_IOCHAN, tcp_readcheck(), and IOCHAN::type. Referenced by afni_io(), AFNI_plugout_workproc(), AFNI_process_plugout(), iochan_clearcheck(), iochan_fork_relay(), iochan_readcheck(), iochan_recv(), iochan_recvloop(), iochan_send(), iochan_writecheck(), main(), new_RT_input(), RT_check_listen(), and RT_worker().
00811 {
00812 int ii , jj ;
00813 char * bbb ;
00814
00815 /** check inputs for OK-osity **/
00816
00817 error_string = NULL ;
00818
00819 if( ioc == NULL ){
00820 error_string = "iochan_goodcheck: bad input" ; return -1 ;
00821 }
00822
00823 /** if it was good before, then check if it is still good **/
00824
00825 if( IOC_BAD(ioc) == 0 ){
00826 int ich = 1 ;
00827
00828 if( ioc->type == TCP_IOCHAN ){
00829 ich = tcp_alivecheck(ioc->id) ;
00830 } else if( ioc->type == SHM_IOCHAN ){
00831 ich = shm_alivecheck(ioc->id) ;
00832 if( ich && ioc->ioc2 != NULL )
00833 ich = shm_alivecheck(ioc->ioc2->id) ;
00834 }
00835
00836 if( ich == 0 ){
00837 error_string = "iochan_goodcheck: no longer alive" ; return -1 ;
00838 }
00839 else
00840 return 1 ;
00841 }
00842
00843 /** wasn't good before, so check if that condition has changed **/
00844
00845 /** TCP/IP waiting to accept call from another host **/
00846
00847 if( ioc->bad == TCP_WAIT_ACCEPT ){
00848 ii = tcp_readcheck(ioc->id,msec) ; /* see if ready */
00849 if( ii > 0 ){ /* if socket ready */
00850 STATUS("iochan_goodcheck: try to accept tcp");
00851 jj = tcp_accept( ioc->id , NULL,&bbb ) ; /* accept connection */
00852 if( jj >= 0 ){ /* if accept worked */
00853 STATUS("iochan_goodcheck: accept worked!") ;
00854 CLOSEDOWN( ioc->id ) ; /* close old socket */
00855 strcpy( ioc->name , bbb ) ; /* put IP into name */
00856 free(bbb) ; ioc->bad = 0 ; ioc->id = jj ; /* and ready to go! */
00857 } else {
00858 STATUS("iochan_goodcheck: accept failed!") ;
00859 }
00860 }
00861 }
00862
00863 /** TCP/IP waiting to connect call to another host **/
00864
00865 else if( ioc->bad == TCP_WAIT_CONNECT ){
00866 int dms=0 , ms ;
00867
00868 if( msec < 0 ) msec = 999999999 ; /* a long time (11+ days) */
00869 for( ms=0 ; ms < msec ; ms += dms ){
00870 ioc->id = tcp_connect( ioc->name , ioc->port ) ; /* try to connect to host */
00871 if( ioc->id >= 0 ) break ; /* worked? break out */
00872 dms = NEXTDMS(dms) ; dms = MIN(dms,msec-ms) ; iochan_sleep(dms) ;
00873 }
00874 if( ioc->id < 0 ) /* one last try? */
00875 ioc->id = tcp_connect( ioc->name , ioc->port ) ;
00876
00877 if( ioc->id >= 0 ) ioc->bad = 0 ; /* succeeded? */
00878 }
00879
00880 /** shmem segment waiting for creation (by someone else) **/
00881
00882 else if( ioc->bad == SHM_WAIT_CREATE ){
00883 int dms=0 , ms ;
00884
00885 if( msec < 0 ) msec = 999999999 ; /* a long time (11+ days) */
00886 for( ms=0 ; ms < msec ; ms += dms ){
00887 ioc->id = shm_accept( ioc->name ) ; /* try to attach to shmem segment */
00888 if( ioc->id >= 0 ) break ; /* works? break out */
00889 dms = NEXTDMS(dms) ; dms = MIN(dms,msec-ms) ; iochan_sleep(dms) ;
00890 }
00891 if( ioc->id < 0 ) /* one last try? */
00892 ioc->id = shm_accept( ioc->name ) ;
00893
00894 if( ioc->id >= 0 ){ /* found it? */
00895 char * bbb ;
00896 bbb = shm_attach( ioc->id ) ; /* attach it */
00897 ioc->bstart = (int *) bbb ; /* set start, */
00898 ioc->bend = (int *) (bbb + sizeof(int)) ; /* end markers */
00899 ioc->buf = bbb + 2*sizeof(int) ; /* after markers */
00900 ioc->bufsize = shm_size(ioc->id) - 2*sizeof(int) ; /* get its size */
00901 ioc->bad = 0 ; /* mark ready */
00902 }
00903 }
00904
00905 /** shmem segment we created waiting for someone else to attach **/
00906
00907 else if( ioc->bad == SHM_WAIT_ACCEPT ){
00908 int dms=0 , ms ;
00909
00910 if( msec < 0 ) msec = 999999999 ; /* a long time (11+ days) */
00911 for( ms=0 ; ms < msec ; ms += dms ){
00912 if( shm_nattach(ioc->id) > 1 ){ ioc->bad = 0 ; break ; }
00913 dms = NEXTDMS(dms) ; dms = MIN(dms,msec-ms) ; iochan_sleep(dms) ;
00914 }
00915 if( ioc->bad && shm_nattach(ioc->id) > 1 ) ioc->bad = 0 ;
00916 }
00917
00918 /** if there is a second channel, check it too **/
00919
00920 if( ioc->ioc2 != NULL && ioc->ioc2->bad != 0 )
00921 iochan_goodcheck( ioc->ioc2 , msec ) ;
00922
00923 return ( IOC_BAD(ioc) == 0 ) ;
00924 }
|
|
||||||||||||
|
Definition at line 546 of file thd_iochan.c. References ACCEPTOR, IOCHAN::bad, IOCHAN::bend, IOCHAN::bstart, IOCHAN::buf, IOCHAN::bufsize, CLOSEDOWN, CREATOR, error_string, free, getenv(), IOCHAN::id, IOCHAN::ioc2, iochan_close(), iochan_sleep(), key, malloc, IOCHAN::name, name, IOCHAN::port, IOCHAN::sendsize, shm_accept(), shm_attach(), shm_create(), SHM_IOCHAN, shm_nattach(), shm_RMID_delay, shm_size(), tcp_accept(), tcp_connect(), TCP_IOCHAN, tcp_listen(), tcp_readcheck(), IOCHAN::type, and IOCHAN::whoami. Referenced by afni_io(), AFNI_plugout_workproc(), AFNI_start_io(), AFNI_start_version_check(), ART_start_io(), iochan_fork_relay(), main(), new_PLUGOUT_spec(), new_RT_input(), open_URL_hpf(), RT_acquire_info(), RT_check_listen(), and RT_start_child().
00547 {
00548 IOCHAN * ioc ;
00549 int do_create , do_accept ;
00550
00551 /** 12 Dec 2002: check if shm_RMID_delay needs to be set **/
00552
00553 #ifndef DONT_USE_SHM
00554 { static int first=1 ;
00555 if( first ){
00556 char *eee = getenv("IOCHAN_DELAY_RMID") ;
00557 shm_RMID_delay = ( eee != NULL && (*eee=='Y' || *eee=='y') ) ;
00558 first = 0 ;
00559 }
00560 }
00561 #endif
00562
00563 /** check if inputs are reasonable **/
00564
00565 error_string = NULL ;
00566
00567 if( name == NULL || strlen(name) < 6 || strlen(name) > 127 ){
00568 error_string = "iochan_init: bad name" ; return NULL ;
00569 }
00570
00571 if( mode == NULL ){
00572 error_string = "iochan_init: bad mode" ; return NULL ;
00573 }
00574
00575 do_create = (strcmp(mode,"create") == 0 || strcmp(mode,"w") == 0) ;
00576 do_accept = (strcmp(mode,"accept") == 0 || strcmp(mode,"r") == 0) ;
00577
00578 if( !do_create && !do_accept ){
00579 error_string = "iochan_init: bad mode" ; return NULL ;
00580 }
00581
00582 #ifdef DEBUG
00583 fprintf(stderr,"iochan_init: name=%s mode=%s\n",name,mode) ;
00584 #endif
00585
00586 /***** deal with TCP/IP sockets *****/
00587
00588 if( strncmp(name,"tcp:",4) == 0 ){
00589 char host[128] , * hend ;
00590 int port=-1 , ii , jj ;
00591
00592 /** find "host" substring **/
00593
00594 hend = strstr( name+4 , ":" ) ;
00595 if( hend == NULL || hend-name > 128 ){
00596 error_string = "iochan_init: bad name" ; return NULL ;
00597 }
00598 for( ii=4 ; name[ii] != ':' ; ii++ ) host[ii-4] = name[ii] ;
00599 host[ii-4] = '\0' ;
00600
00601 /** get "port" number **/
00602
00603 port = strtol( name+ii+1 , NULL , 10 ) ;
00604 if( port <= 0 ){
00605 error_string = "iochan_init: bad port" ; return NULL ;
00606 }
00607
00608 /** initialize IOCHAN **/
00609
00610 ioc = (IOCHAN *) malloc( sizeof(IOCHAN) ) ;
00611
00612 ioc->type = TCP_IOCHAN ; /* what kind is this? */
00613 ioc->port = port ; /* save the port # */
00614 ioc->bufsize = 0 ; /* TCP has no buffer */
00615 ioc->buf = NULL ;
00616 ioc->sendsize = 0 ; /* no upper limit */
00617 ioc->ioc2 = NULL ; /* TCP has no second channel */
00618
00619 /** attach to incoming call **/
00620
00621 if( do_accept ){
00622 ioc->whoami = ACCEPTOR ; /* 24 June 1997 */
00623 ioc->id = tcp_listen( port ) ; /* set up to listen */
00624 if( ioc->id < 0 ){ /* error? must die! */
00625 error_string = "iochan_init: tcp_listen fails" ;
00626 free(ioc) ; return NULL ;
00627 }
00628 ioc->bad = TCP_WAIT_ACCEPT ; /* not connected yet */
00629 ii = tcp_readcheck(ioc->id,1) ; /* see if ready */
00630 if( ii > 0 ){ /* if socket ready */
00631 jj = tcp_accept( ioc->id , NULL,&hend ) ; /* accept connection */
00632 if( jj >= 0 ){ /* if accept worked */
00633 CLOSEDOWN( ioc->id ) ; /* close old socket */
00634 strcpy( ioc->name , hend ) ; /* put IP into name */
00635 free(hend) ; ioc->bad = 0 ; ioc->id = jj ; /* and ready to go! */
00636 }
00637 }
00638 return ioc ;
00639 }
00640
00641 /** place an outgoing call **/
00642
00643 if( do_create ){
00644 struct hostent * hostp ;
00645 ioc->whoami = CREATOR ; /* 24 June 1997 */
00646 hostp = gethostbyname(host) ; /* lookup host on net */
00647 if( hostp == NULL ){ /* fails? must die! */
00648 error_string = "iochan_init: gethostbyname fails" ;
00649 free(ioc) ; return NULL ;
00650 }
00651 ioc->id = tcp_connect( host , port ) ; /* connect to host */
00652 ioc->bad = (ioc->id < 0) ? TCP_WAIT_CONNECT : 0 ; /* fails? must wait */
00653 strcpy( ioc->name , host ) ; /* save the host name */
00654 return ioc ;
00655 }
00656 return NULL ; /* should never be reached */
00657 }
00658
00659 /***** deal with shared memory segments *****/
00660
00661 if( strncmp(name,"shm:",4) == 0 ){
00662 char key[128] , * kend , shm2[256] ;
00663 int size=-1 , ii , jj , size2=-1 ;
00664
00665 #ifdef DONT_USE_SHM
00666 return NULL ; /* 18 Dec 2002 */
00667 #endif
00668
00669 /** get keystring **/
00670
00671 kend = strstr( name+4 , ":" ) ;
00672 if( kend == NULL || kend-name > 128 ){
00673 error_string = "iochan_init: bad name" ; return NULL ;
00674 }
00675 for( ii=4 ; name[ii] != ':' ; ii++ ) key[ii-4] = name[ii] ;
00676 key[ii-4] = '\0' ;
00677
00678 /** get size **/
00679
00680 size = strtol( name+ii+1 , &kend , 10 ) ;
00681 if( size < 0 || (size == 0 && do_create) ){
00682 error_string = "iochan_init: bad size" ; return NULL ;
00683 }
00684 if( *kend == 'K' || *kend == 'k' ){ size *= 1024 ; kend++ ; }
00685 else if( *kend == 'M' || *kend == 'm' ){ size *= 1024*1024 ; kend++ ; }
00686
00687 /** 24 June 1997: get second size **/
00688
00689 if( *kend == '+' ){
00690 size2 = strtol( kend+1 , &kend , 10 ) ;
00691 if( size2 < 0 || (size2 == 0 && do_create) ){
00692 error_string = "iochan_init: bad size2" ; return NULL ;
00693 }
00694 if( *kend == 'K' || *kend == 'k' ){ size2 *= 1024 ; kend++ ; }
00695 else if( *kend == 'M' || *kend == 'm' ){ size2 *= 1024*1024 ; kend++ ; }
00696
00697 sprintf(shm2,"shm:%s++:%d",key,size2) ; /* second channel spec */
00698 } else {
00699 shm2[0] = '\0' ; /* no second channel */
00700 }
00701
00702 /** initialize IOCHAN **/
00703
00704 ioc = (IOCHAN *) malloc( sizeof(IOCHAN) ) ;
00705
00706 ioc->type = SHM_IOCHAN ; /* what type is this? */
00707 strcpy( ioc->name , key ) ; /* save the key name */
00708 ioc->ioc2 = NULL ; /* maybe reset below? */
00709
00710 /** open the second channel, if any **/
00711
00712 if( shm2[0] != '\0' ){
00713 ioc->ioc2 = iochan_init( shm2 , mode ) ;
00714 if( ioc->ioc2 == NULL ){
00715 error_string = "iochan_init: can't open shm2" ;
00716 free(ioc) ; return NULL ;
00717 }
00718 #ifdef DEBUG
00719 fprintf(stderr,"iochan_init: input=%s shm2=%s\n",name,shm2) ;
00720 #endif
00721 }
00722
00723 /** attach to existing shmem segment **/
00724
00725 if( do_accept ){
00726 ioc->whoami = ACCEPTOR ; /* 24 June 1997 */
00727 for( ii=0 ; ii < 2 ; ii++ ){ /* try to find segment */
00728 ioc->id = shm_accept( key ) ; /* several times */
00729 if( ioc->id >= 0 ) break ; /* works? break out */
00730 iochan_sleep(1) ; /* wait 1 millisecond */
00731 }
00732 if( ioc->id < 0 ) ioc->id = shm_accept( key ) ; /* 1 last try? */
00733
00734 if( ioc->id < 0 ){ /* failed to find segment? */
00735 ioc->bad = SHM_WAIT_CREATE ; /* mark for waiting */
00736
00737 } else { /* found it? */
00738 char * bbb ;
00739 bbb = shm_attach( ioc->id ) ; /* attach it */
00740 if( bbb == NULL ){ /* can't? quit */
00741 error_string = "iochan_init: shm_attach fails" ;
00742 iochan_close(ioc) ; return NULL ;
00743 }
00744 ioc->bstart = (int *) bbb ; /* set start, */
00745 ioc->bend = (int *) (bbb + sizeof(int)) ; /* end markers */
00746 ioc->buf = bbb + 2*sizeof(int) ; /* after markers */
00747 ioc->bufsize = shm_size(ioc->id) - 2*sizeof(int) ; /* get its size */
00748 if( ioc->bufsize <= 0 ){ /* can't? quit */
00749 error_string = "iochan_init: bufsize < 0" ;
00750 iochan_close(ioc) ; return NULL ;
00751 }
00752 ioc->bad = 0 ; /* mark ready */
00753 }
00754 return ioc ;
00755 }
00756
00757 /** make a new shmem segment **/
00758
00759 if( do_create ){
00760 char * bbb ;
00761 ioc->whoami = CREATOR ; /* 24 June 1997*/
00762 size = size + 1 ; /* extra byte */
00763 ioc->id = shm_create( key , size+2*sizeof(int) ) ; /* create it */
00764 if( ioc->id < 0 ){ /* can't? quit */
00765 error_string = "iochan_init: shm_create fails" ;
00766 iochan_close(ioc->ioc2) ; free(ioc) ; return NULL ;
00767 }
00768 bbb = shm_attach( ioc->id ) ; /* attach it */
00769 if( bbb == NULL ){ /* can't? quit */
00770 error_string = "iochan_init: shm_attach fails" ;
00771 iochan_close(ioc) ; free(ioc) ; return NULL ;
00772 }
00773 ioc->bstart = (int *) bbb ; /* init start, */
00774 ioc->bend = (int *) (bbb + sizeof(int)) ; /* end markers */
00775 *(ioc->bstart) = 0 ;
00776 *(ioc->bend) = size-1 ;
00777 ioc->buf = bbb + 2*sizeof(int) ; /* I/O buffer */
00778 ioc->bufsize = size ; /* buffer size */
00779 ioc->bad = (shm_nattach(ioc->id) < 2) /* ready if */
00780 ? SHM_WAIT_ACCEPT /* both are */
00781 : 0 ; /* attached */
00782 return ioc ;
00783 }
00784 return NULL ; /* should never be reached */
00785 }
00786
00787 return NULL ; /* should never be reached */
00788 }
|
|
||||||||||||
|
Definition at line 974 of file thd_iochan.c. References IOCHAN::bend, IOCHAN::bstart, IOCHAN::bufsize, error_string, IOCHAN::id, iochan_goodcheck(), iochan_sleep(), MIN, NEXTDMS, SHM_IOCHAN, SHMIOC_READ, tcp_alivecheck(), TCP_IOCHAN, tcp_readcheck(), and IOCHAN::type. Referenced by afni_io(), AFNI_process_plugout(), AFNI_version_check(), iochan_force_clear(), iochan_fork_relay(), main(), new_RT_input(), open_URL_hpf(), read_URL_http(), RT_check_listen(), RT_process_data(), and RT_worker().
00975 {
00976 int ii ;
00977
00978 /** check if the IOCHAN is good **/
00979
00980 error_string = NULL ;
00981
00982 ii = iochan_goodcheck(ioc,0) ;
00983 if( ii == -1 ) return -1 ; /* some error */
00984 if( ii == 0 ){ /* not good yet */
00985 ii = iochan_goodcheck(ioc,msec) ; /* so wait for it to get good */
00986 if( ii != 1 ) return 0 ; /* if still not good, exit */
00987 }
00988
00989 /** tcp: ==> just use the Unix "select" mechanism **/
00990
00991 if( ioc->type == TCP_IOCHAN ){
00992 ii = tcp_alivecheck( ioc->id ) ; if( !ii ) return -1 ;
00993 ii = tcp_readcheck( ioc->id , msec ) ;
00994 if( ii < 0 ) error_string = "iochan_readcheck: socket is bad" ;
00995 return ii ;
00996 }
00997
00998 /** shm: ==> must loop and wait ourselves **/
00999
01000 if( ioc->type == SHM_IOCHAN ){
01001 int nread , dms=0 , ms ;
01002
01003 if( msec < 0 ) msec = 999999999 ; /* a long time (11+ days) */
01004
01005 /** Compute the number of readable bytes into nread. This routine
01006 should be called by the "reading" process. It will then
01007 be waiting until the "writing" process increments ioc->bend. **/
01008
01009 ioc = SHMIOC_READ(ioc) ; /* 24 June 1997 */
01010
01011 for( ms=0 ; ms < msec ; ms += dms ){
01012 nread = (*(ioc->bend) - *(ioc->bstart) + ioc->bufsize + 1) % (ioc->bufsize) ;
01013 if( nread > 0 ) return nread ;
01014 dms = NEXTDMS(dms) ; dms = MIN(dms,msec-ms) ; iochan_sleep(dms) ;
01015 ii = iochan_goodcheck(ioc,0) ; if( ii == -1 ) return -1 ;
01016 }
01017 nread = (*(ioc->bend) - *(ioc->bstart) + ioc->bufsize + 1) % (ioc->bufsize) ;
01018 if( nread > 0 ) return nread ;
01019 return 0 ;
01020 }
01021
01022 return -1 ; /* should never be reached */
01023 }
|
|
||||||||||||||||
|
check for reasonable inputs * Definition at line 1319 of file thd_iochan.c. References BCOPY, IOCHAN::bend, IOCHAN::bstart, IOCHAN::buf, IOCHAN::bufsize, error_string, IOCHAN::id, IOC_BAD, iochan_goodcheck(), PERROR, SHM_IOCHAN, SHMIOC_READ, TCP_IOCHAN, tcp_recv, and IOCHAN::type. Referenced by afni_io(), AFNI_plugout_workproc(), AFNI_process_plugout(), AFNI_version_check(), iochan_force_clear(), iochan_recvall(), iochan_recvloop(), main(), new_RT_input(), read_URL_http(), and RT_worker().
01320 {
01321 /** check for reasonable inputs **/
01322
01323 error_string = NULL ;
01324
01325 if( ioc == NULL || IOC_BAD(ioc) != 0 ||
01326 buffer == NULL || nbytes < 0 ){
01327
01328 error_string = "iochan_recv: bad inputs" ; return -1 ;
01329 }
01330
01331 if( nbytes == 0 ) return 0 ;
01332 if( iochan_goodcheck(ioc,0) != 1 ) return -1 ;
01333
01334 /** tcp: just use recv **/
01335
01336 if( ioc->type == TCP_IOCHAN ){
01337 int ii = tcp_recv( ioc->id , buffer , nbytes , 0 ) ;
01338 if( ii == -1 ){
01339 PERROR("Can't read from socket? tcp[recv]") ;
01340 error_string = "iochan_recv: tcp recv fails" ;
01341 }
01342 return ii ;
01343 }
01344
01345 /** shm: read from the circular buffer, starting at bstart **/
01346
01347 if( ioc->type == SHM_IOCHAN ){
01348 int nread, bend,bstart , size , sbot,stop ;
01349
01350 ioc = SHMIOC_READ(ioc) ; /* 24 June 1997 */
01351
01352 bend = *(ioc->bend) ; bstart = *(ioc->bstart) ; size = ioc->bufsize ;
01353 nread = ( bend - bstart + size + 1 ) % size ; /* readable amount */
01354 if( nread <= 0 ) return 0 ; /* nothing!? */
01355 if( nread > nbytes ) nread = nbytes ; /* amount to read */
01356
01357 sbot = bstart ; stop = sbot + nread-1 ; /* from sbot to stop */
01358
01359 if( stop < size ){ /* 1 piece to copy */
01360 BCOPY( buffer, ioc->buf + sbot, nread ) ; /* copy the data */
01361 *(ioc->bstart) = (stop+1) % size ; /* move bstart up */
01362 #ifdef DEBUG
01363 fprintf(stderr,"iochan_recv: get 1 piece: %d to %d\n",sbot,stop) ;
01364 #endif
01365
01366 } else { /* 2 pieces to copy */
01367 int nn = size - sbot ; /* size of piece 1 */
01368 BCOPY( buffer , ioc->buf + sbot, nn ) ; /* copy piece 1 */
01369 BCOPY( buffer+nn, ioc->buf , nread-nn ) ; /* copy piece 2 */
01370 *(ioc->bstart) = nread-nn ; /* move bstart up */
01371 #ifdef DEBUG
01372 fprintf(stderr,"iochan_recv: get 2 pieces: %d to %d AND %d to %d\n",
01373 sbot,sbot+nn-1,0,nread-nn-1) ;
01374 #endif
01375
01376 }
01377 return nread ;
01378 }
01379
01380 return -1 ; /* should not be reached */
01381 }
|
|
||||||||||||||||
|
check for reasonable inputs * Definition at line 1425 of file thd_iochan.c. References error_string, IOC_BAD, iochan_recv(), iochan_sleep(), and NEXTDMS. Referenced by afni_io(), main(), and RT_read_image().
01426 {
01427 int ii , ntot=0 , dms=0 ;
01428
01429 /** check for reasonable inputs **/
01430
01431 error_string = NULL ;
01432
01433 if( ioc == NULL || IOC_BAD(ioc) != 0 ||
01434 buffer == NULL || nbytes < 0 ){
01435
01436 error_string = "iochan_recvall: bad inputs" ; return -1 ;
01437 }
01438
01439 if( nbytes == 0 ) return 0 ;
01440
01441 while(1){
01442 ii = iochan_recv( ioc , buffer+ntot , nbytes-ntot ) ; /* get what's left */
01443 if( ii == -1 ) return -1 ; /* an error!? */
01444 ntot += ii ; /* total so far */
01445 if( ntot == nbytes ) return nbytes ; /* all done!? */
01446 dms = NEXTDMS(dms) ; iochan_sleep(dms) ; /* wait a while */
01447 }
01448 return -1 ; /* should never be reached */
01449 }
|
|
||||||||||||||||
|
shm: read from the circular buffer, starting at bstart * Definition at line 1388 of file thd_iochan.c. References error_string, IOC_BAD, iochan_goodcheck(), iochan_recv(), and iochan_sleep(). Referenced by iochan_fork_relay().
01389 {
01390 int jj , nbuf=0 ;
01391
01392 error_string = NULL ;
01393
01394 /** check for reasonable inputs **/
01395
01396 if( ioc == NULL || IOC_BAD(ioc) != 0 ||
01397 buffer == NULL || nbytes < 0 ){
01398
01399 error_string = "iochan_recvloop: bad inputs" ; return -1 ;
01400 }
01401
01402 if( iochan_goodcheck(ioc,0) != 1 ) return -1 ;
01403
01404 if( nbytes == 0 ) return 0 ;
01405
01406 while(1){
01407 jj = iochan_recv( ioc , buffer+nbuf , nbytes-nbuf ) ;
01408 if( jj < 1 ) break ; /* stop if nothing more comes in */
01409 nbuf += jj ;
01410 if( nbuf >= nbytes ) break ; /* stop if overflow */
01411 iochan_sleep(1) ;
01412 }
01413
01414 return nbuf ;
01415 }
|
|
||||||||||||||||
|
This routine is called by the "writing" process. It will wait until the reading process increments ioc->bstart. * Definition at line 1176 of file thd_iochan.c. References BCOPY, IOCHAN::bend, IOCHAN::bstart, IOCHAN::buf, IOCHAN::bufsize, error_string, IOCHAN::id, IOC_BAD, iochan_goodcheck(), iochan_writecheck(), MIN, nosigpipe, PERROR, send, IOCHAN::sendsize, SHM_IOCHAN, SHMIOC_WRITE, TCP_IOCHAN, tcp_writecheck(), and IOCHAN::type. Referenced by iochan_sendall().
01177 {
01178 int ii ;
01179
01180 /** check for reasonable inputs **/
01181
01182 error_string = NULL ;
01183
01184 if( ioc == NULL || IOC_BAD(ioc) != 0 ||
01185 buffer == NULL || nbytes < 0 ){
01186
01187 error_string = "iochan_send: bad inputs" ; return -1 ;
01188 }
01189
01190 if( nbytes == 0 ) return 0 ;
01191
01192 ii = iochan_goodcheck(ioc,0) ;
01193 if( ii != 1 ){
01194 if( error_string == NULL )
01195 error_string = "iochan_send: iochan_goodcheck fails" ;
01196 return ii ;
01197 }
01198
01199 ii = iochan_writecheck(ioc,1) ;
01200 if( ii <= 0 ){
01201 if( error_string == NULL )
01202 error_string = "iochan_send: iochan_writecheck fails" ;
01203 return ii ;
01204 }
01205
01206 /** tcp: ==> just use send **/
01207
01208 if( ioc->type == TCP_IOCHAN ){
01209 if( !nosigpipe ){ signal( SIGPIPE , SIG_IGN ) ; nosigpipe = 1 ; }
01210
01211 if( ioc->sendsize <= 0 || nbytes <= ioc->sendsize ){
01212 int nsent = send( ioc->id , buffer , nbytes , 0 ) ;
01213 if( nsent == -1 ) PERROR("Can't use socket? tcp[send]") ;
01214 if( nsent < 0 ) error_string = "iochan_send: tcp send fails" ;
01215 return nsent ;
01216 } else {
01217 int nsent , ntosend , ntot = 0 ;
01218 do{
01219 while( tcp_writecheck(ioc->id,1) == 0 ) ; /* spin */
01220 ntosend = MIN( ioc->sendsize , nbytes-ntot ) ;
01221 nsent = send( ioc->id , buffer+ntot , ntosend , 0 ) ;
01222 if( nsent == -1 ) PERROR("Can't use socket? tcp[send]") ;
01223 if( nsent <= 0 ){
01224 error_string = "iochan_send: tcp send fails" ;
01225 return ((ntot>0) ? ntot : nsent) ;
01226 }
01227 ntot += nsent ;
01228 } while( ntot < nbytes ) ;
01229 return ntot ;
01230 }
01231 }
01232
01233 /** shm: ==> write into the circular buffer, past "bend" **/
01234
01235 if( ioc->type == SHM_IOCHAN ){
01236 int nread,nwrite , bend,bstart , ebot,etop , size ;
01237
01238 ioc = SHMIOC_WRITE(ioc) ; /* 24 June 1997 */
01239
01240 bend = *(ioc->bend) ; bstart = *(ioc->bstart) ; size = ioc->bufsize ;
01241 nread = ( bend - bstart + size + 1 ) % size ; /* amount readable */
01242 nwrite = size - 1 - nread ; /* amount writeable */
01243 if( nwrite <= 0 ) return 0 ; /* can't write! */
01244
01245 if( nwrite > nbytes ) nwrite = nbytes ; /* how much to write */
01246
01247 ebot = bend+1 ; if( ebot >= size ) ebot = 0 ; /* start at ebot */
01248 etop = ebot+nwrite-1 ; /* end at etop */
01249
01250 if( etop < size ){ /* 1 piece to copy */
01251 BCOPY( ioc->buf + ebot, buffer, nwrite ) ; /* copy data */
01252 *(ioc->bend) = etop ; /* change bend */
01253 #ifdef DEBUG
01254 fprintf(stderr,"iochan_send: shm 1 piece: %d to %d\n",ebot,etop) ;
01255 #endif
01256
01257 } else { /* 2 pieces to copy */
01258 int nn = size - ebot ; /* size of piece 1 */
01259 BCOPY( ioc->buf + ebot, buffer , nn ) ; /* copy piece 1 */
01260 BCOPY( ioc->buf , buffer+nn, nwrite-nn ) ; /* copy piece 2 */
01261 *(ioc->bend) = nwrite-nn-1 ; /* change bend */
01262 #ifdef DEBUG
01263 fprintf(stderr,"iochan_send: shm 2 pieces: %d to %d AND %d to %d\n",
01264 ebot,ebot+nn-1,0,nwrite-nn-1) ;
01265 #endif
01266
01267 }
01268 return nwrite ;
01269 }
01270
01271 return -1 ; /* should not be reached */
01272 }
|
|
||||||||||||||||
|
shm: ==> write into the circular buffer, past "bend" * Definition at line 1282 of file thd_iochan.c. References error_string, IOC_BAD, iochan_send(), iochan_sleep(), and NEXTDMS. Referenced by afni_io(), AFNI_send_image(), AFNI_start_io(), AFNI_start_version_check(), ART_send_control_info(), ART_send_end_of_run(), ART_send_volume(), ART_start_io(), iochan_fork_relay(), main(), open_URL_hpf(), and RT_acquire_info().
01283 {
01284 int ii , ntot=0 , dms=0 ;
01285
01286 error_string = NULL ;
01287
01288 /** check for reasonable inputs **/
01289
01290 if( ioc == NULL || IOC_BAD(ioc) != 0 ||
01291 buffer == NULL || nbytes < 0 ){
01292
01293 error_string = "iochan_sendall: bad inputs" ; return -1 ;
01294 }
01295
01296 if( nbytes == 0 ) return 0 ;
01297
01298 while(1){
01299 ii = iochan_send( ioc , buffer+ntot , nbytes-ntot ); /* send what's left */
01300 if( ii == -1 ){ /* an error!? */
01301 if( error_string == NULL )
01302 error_string = "iochan_sendall: iochan_send fails" ;
01303 return -1 ;
01304 }
01305 ntot += ii ; /* total sent so far */
01306 if( ntot == nbytes ) return nbytes ; /* all done!? */
01307 dms = NEXTDMS(dms) ; iochan_sleep(dms) ; /* wait a while */
01308 }
01309 return -1 ; /* should never be reached */
01310 }
|
|
|
Definition at line 955 of file thd_iochan.c. References IOCHAN::id, TCP_IOCHAN, tcp_set_cutoff(), and IOCHAN::type. Referenced by afni_io(), AFNI_plugout_exit(), AFNI_plugout_workproc(), and open_URL_hpf().
00956 {
00957 if( ioc == NULL ) return ;
00958
00959 if( ioc->type == TCP_IOCHAN && ioc->id >= 0 ) tcp_set_cutoff( ioc->id ) ;
00960 return ;
00961 }
|
|
|
check for reasonable inputs * Definition at line 1455 of file thd_iochan.c. Referenced by AFNI_exit(), afni_io(), AFNI_plugout_workproc(), AFNI_send_image(), AFNI_start_io(), AFNI_start_version_check(), AFNI_startup_timeout_CB(), ART_open_afni_link(), ART_send_control_info(), ART_send_end_of_run(), ART_start_io(), calculate_results(), find_more_volumes(), iochan_clearcheck(), iochan_fork_relay(), iochan_goodcheck(), iochan_init(), iochan_readcheck(), iochan_recvall(), iochan_recvloop(), iochan_sendall(), iochan_writecheck(), main(), MAIN_workprocess(), new_PLUGOUT_spec(), new_RT_input(), RT_acquire_info(), RT_worker(), THD_fetch_dataset(), and THD_fetch_many_datasets().
01456 {
01457 struct timeval tv ;
01458 if( msec <= 0 ) return ;
01459 tv.tv_sec = msec/1000 ;
01460 tv.tv_usec = (msec%1000)*1000 ;
01461 select( 1 , NULL,NULL,NULL , &tv ) ;
01462 return ;
01463 }
|
|
||||||||||||
|
shm: ==> must loop and wait ourselves * Definition at line 1110 of file thd_iochan.c. References IOCHAN::bend, IOCHAN::bstart, IOCHAN::bufsize, error_string, IOCHAN::id, iochan_goodcheck(), iochan_sleep(), MIN, NEXTDMS, SHM_IOCHAN, SHMIOC_WRITE, TCP_IOCHAN, tcp_writecheck(), and IOCHAN::type. Referenced by afni_io(), AFNI_send_image(), AFNI_start_io(), AFNI_start_version_check(), ART_start_io(), iochan_fork_relay(), iochan_send(), main(), open_URL_hpf(), and RT_acquire_info().
01111 {
01112 int ii ;
01113
01114 /** check if the IOCHAN is good **/
01115
01116 error_string = NULL ;
01117
01118 ii = iochan_goodcheck(ioc,0) ;
01119 if( ii == -1 ) return -1 ; /* some error */
01120 if( ii == 0 ){ /* not good yet */
01121 ii = iochan_goodcheck(ioc,msec) ; /* so wait for it to get good */
01122 if( ii != 1 ) return ii ; /* if still not good, exit */
01123 }
01124
01125 /** tcp: ==> just use the Unix "select" mechanism **/
01126
01127 if( ioc->type == TCP_IOCHAN ){
01128 ii = tcp_writecheck( ioc->id , msec ) ;
01129 if( ii == -1 ) error_string = "iochan_writecheck: socket not ready" ;
01130 return ii ;
01131 }
01132
01133 /** shm: ==> must loop and wait ourselves **/
01134
01135 if( ioc->type == SHM_IOCHAN ){
01136 int nread , dms=0 , ms , nwrite ;
01137
01138 if( msec < 0 ) msec = 999999999 ; /* a long time (11+ days) */
01139
01140 ioc = SHMIOC_WRITE(ioc) ; /* 24 June 1997 */
01141
01142 /** This routine is called by the "writing" process. It will
01143 wait until the reading process increments ioc->bstart. **/
01144
01145 for( ms=0 ; ms < msec ; ms += dms ){
01146 nread = (*(ioc->bend) - *(ioc->bstart) + ioc->bufsize + 1) % (ioc->bufsize) ;
01147 nwrite = ioc->bufsize - 1 - nread ;
01148 if( nwrite > 0 ) return nwrite ;
01149 dms = NEXTDMS(dms) ; dms = MIN(dms,msec-ms) ; iochan_sleep(dms) ;
01150 ii = iochan_goodcheck(ioc,0) ; if( ii == -1 ) return -1 ;
01151 }
01152 nread = (*(ioc->bend) - *(ioc->bstart) + ioc->bufsize + 1) % (ioc->bufsize) ;
01153 nwrite = ioc->bufsize - 1 - nread ;
01154 if( nwrite > 0 ) return nwrite ;
01155 return 0 ;
01156 }
01157
01158 return -1 ; /* should never be reached */
01159 }
|
|
||||||||||||||||||||
|
Definition at line 59 of file thd_http.c. References DMESS, FAILED, file, http_user_agent, IOCHAN_CLOSE, iochan_init(), iochan_readcheck(), iochan_sendall(), iochan_set_cutoff(), and iochan_writecheck(). Referenced by open_URL_http().
00060 {
00061 IOCHAN * ioc ;
00062 char str[512] ;
00063 int ii ;
00064
00065 if( host == NULL || port <= 0 || file == NULL ) return NULL ;
00066
00067 sprintf(str,"tcp:%s:%d",host,port) ;
00068 DMESS(" ++Opening %s",str);
00069 ioc = iochan_init( str , "create" ) ;
00070 if( ioc == NULL ){ FAILED; return NULL; }
00071 fprintf(stderr,".");
00072 iochan_set_cutoff( ioc ) ;
00073 fprintf(stderr,".");
00074 ii = iochan_writecheck( ioc , msec ) ;
00075 if( ii <= 0 ){ FAILED; IOCHAN_CLOSE(ioc) ; return NULL ; }
00076
00077 DMESS(" ++GET %s",file);
00078 if( use_http_10 )
00079 sprintf(str,"GET %s HTTP/1.0\r\n"
00080 "User-Agent: %s\r\n"
00081 "\r\n", file , http_user_agent ) ; /* HTTP 1.0 */
00082 else
00083 sprintf(str,"GET %s\r\n",file) ; /* HTTP 0.9 */
00084 ii = iochan_sendall( ioc , str , strlen(str) ) ;
00085 if( ii <= 0 ){ FAILED; IOCHAN_CLOSE(ioc); return NULL; }
00086
00087 ii = iochan_readcheck( ioc , msec ) ;
00088 if( ii <= 0 ){ FAILED; IOCHAN_CLOSE(ioc) ; return NULL ; }
00089 DMESS("%s"," **OPENED");
00090 return ioc ;
00091 }
|
|
||||||||||||
|
Definition at line 104 of file thd_http.c. References file, HTTP, HTTPLEN, and open_URL_hpf(). Referenced by read_URL_http().
00105 {
00106 char * s, * h , * file ;
00107 char hostname[256] ;
00108 int port;
00109 IOCHAN * ioc ;
00110
00111 /* check inputs */
00112
00113 if( url == NULL || strstr(url,HTTP) != url ) return NULL ;
00114
00115 /* parse hostname */
00116
00117 for( s=url+HTTPLEN , h=hostname ;
00118 (*s != '\0') && (*s != ':') && (*s != '/') ; s++ , h++ ) *h = *s ;
00119
00120 *h = '\0' ; if( hostname[0] == '\0' ) return NULL ;
00121
00122 /* parse port number if present */
00123
00124 port = 0 ;
00125 if( *s == ':' ){ port = strtol( ++s , &h , 10 ) ; s = h ; }
00126 if( port <= 0 ) port = 80 ;
00127
00128 /* get the file name (keep leading "/") */
00129
00130 file = (*s == '/') ? s : "/" ;
00131
00132 /* do the actual work */
00133
00134 ioc = open_URL_hpf( hostname , port , file , msec ) ;
00135 return ioc ;
00136 }
|
|
||||||||||||
|
Definition at line 419 of file thd_http.c. References debug, FTP, getenv(), HTTP, read_URL_ftp(), and read_URL_http(). Referenced by AFNI_start_version_check(), main(), and read_URL_tmpdir().
00420 {
00421 int nn ;
00422 if( url == NULL || data == NULL ) return( -1 );
00423
00424 if( getenv("AFNI_WWW_DEBUG") != NULL ) debug = 1 ;
00425
00426 if( strstr(url,HTTP) == url ){
00427 nn = read_URL_http( url , 4000 , data ) ; return(nn) ;
00428 }
00429
00430 else if( strstr(url,FTP) == url ){
00431 nn = read_URL_ftp( url , data ) ; return(nn) ;
00432 }
00433
00434 return( -1 );
00435 }
|
|
||||||||||||
|
Definition at line 310 of file thd_http.c. References AFMALL, file, FTP, ftp_name, ftp_pwd, FTPLEN, mktemp(), setup_tmpdir(), THD_filesize(), tmpdir, and unlink. Referenced by NI_read_URL(), and read_URL().
00311 {
00312 char * s, * h , * file , qname[256] , sname[256] , * cpt , * buf ;
00313 char hostname[256] ;
00314 int port , ii , cflag , nuse ;
00315 FILE * sp ;
00316
00317 /* sanity check */
00318
00319 if( url == NULL || data == NULL || strstr(url,FTP) != url ) return( -1 );
00320
00321 /* parse hostname */
00322
00323 for( s=url+FTPLEN , h=hostname ;
00324 (*s != '\0') && (*s != ':') && (*s != '/') ; s++ , h++ ) *h = *s ;
00325
00326 *h = '\0' ; if( hostname[0] == '\0' ) return( -1 );
00327
00328 /* parse port number, if present */
00329
00330 port = 0 ;
00331 if( *s == ':' ){ port = strtol( ++s , &h , 10 ) ; s = h ; }
00332
00333 /* get the file name (strip off leading "/") */
00334
00335 if( *s == '/' ){
00336 file = s+1 ; if( file[0] == '\0' ) return( -1 );
00337 } else {
00338 return( -1 );
00339 }
00340
00341 /* check if file will be returned gzip-ed */
00342
00343 ii = strlen(file) ;
00344 if( ii > 3 ){
00345 cpt = file + (ii-3) ; cflag = (strcmp(cpt,".gz") == 0) ;
00346 } else {
00347 cflag = 0 ;
00348 }
00349
00350 /* make name for output file */
00351
00352 setup_tmpdir() ;
00353 strcpy(qname,tmpdir) ; strcat(qname,"elvisXXXXXX") ;
00354 mktemp(qname) ;
00355 if( qname[0] == '\0' ) return( -1 );
00356 if( cflag ) strcat(qname,".gz") ;
00357
00358 /* write the script file that will be used to run ftp */
00359
00360 strcpy(sname,tmpdir) ; strcat(sname,"dahmerXXXXXX") ;
00361 mktemp(sname) ; if( sname[0] == '\0' ) return( -1 );
00362 sp = fopen( sname , "w" ) ; if( sp == NULL ) return( -1 );
00363
00364 fprintf( sp , "#!/bin/sh\n" ) ;
00365 fprintf( sp , "ftp -n << EEEEE &> /dev/null\n") ;
00366 if( port > 0 )
00367 fprintf( sp , "open %s %d\n" , hostname , port ) ;
00368 else
00369 fprintf( sp , "open %s\n" , hostname ) ;
00370 fprintf( sp , "user %s %s\n" , ftp_name, ftp_pwd ) ;
00371 fprintf( sp , "binary\n" ) ;
00372 fprintf( sp , "get %s %s\n" , file , qname ) ;
00373 fprintf( sp , "bye\n" ) ;
00374 fprintf( sp , "EEEEE\n" ) ;
00375 fprintf( sp , "exit\n" ) ;
00376 fclose( sp ) ;
00377 chmod( sname , S_IRUSR | S_IWUSR | S_IXUSR ) ;
00378
00379 /* execute the script, then delete it */
00380
00381 system( sname ) ; unlink( sname ) ;
00382
00383 /* check the size of the output file */
00384
00385 nuse = THD_filesize( qname ) ;
00386 if( nuse <= 0 ){ unlink(qname) ; return( -1 ); }
00387
00388 /* uncompress the file, if needed */
00389
00390 if( cflag ){
00391 sprintf( sname , "gzip -dq %s" , qname ) ; /* execute gzip */
00392 ii = system(sname) ;
00393 if( ii != 0 ){ unlink(qname) ; return( -1 ); } /* gzip failed */
00394 ii = strlen(qname) ; qname[ii-3] = '\0' ; /* fix filename */
00395 nuse = THD_filesize( qname ) ; /* find how big */
00396 if( nuse <= 0 ){ unlink(qname) ; return( -1 ); }
00397 }
00398
00399 /* suck the file into memory */
00400
00401 sp = fopen( qname , "rb" ) ;
00402 if( sp == NULL ){ unlink(qname) ; return( -1 ); }
00403 buf = AFMALL(char,nuse) ; if( buf == NULL ){ unlink(qname) ; return( -1 ); }
00404
00405 fread( buf , 1 , nuse , sp ) ; /* AT LAST! */
00406 fclose(sp) ; unlink(qname) ;
00407
00408 /* data is in buf, nuse bytes of it */
00409
00410 *data = buf ; return( nuse );
00411 }
|
|
||||||||||||||||
|
Definition at line 158 of file thd_http.c. References AFMALL, AFREALL, DMESS, FAILED, free, IOCHAN_CLOSE, iochan_readcheck(), iochan_recv(), mktemp(), open_URL_http(), prog, QBUF, setup_tmpdir(), THD_filesize(), tmpdir, and unlink. Referenced by NI_read_URL(), and read_URL().
00159 {
00160 IOCHAN * ioc ;
00161 char * buf=NULL , * cpt , qbuf[QBUF] , qname[256] ;
00162 int ii,jj , nall , nuse , nget=0, nmeg=0 ;
00163 int cflag , first ;
00164 FILE * cfile ;
00165
00166 /* sanity check */
00167
00168 if( url == NULL || data == NULL || msec < 0 ) return( -1 );
00169
00170 /* open http channel to get url */
00171
00172 ioc = open_URL_http( url , msec ) ;
00173 if( ioc == NULL ){ DMESS("%s","\n"); return( -1 ); }
00174
00175 /* check if url will be returned gzip-ed */
00176
00177 ii = strlen(url) ;
00178 if( ii > 3 ){
00179 cpt = url + (ii-3) ; cflag = (strcmp(cpt,".gz") == 0) ;
00180 } else {
00181 cflag = 0 ;
00182 }
00183
00184 if( cflag ){
00185 setup_tmpdir() ;
00186 strcpy(qname,tmpdir) ; strcat(qname,"gosiaXXXXXX") ;
00187 mktemp(qname) ;
00188 if( qname[0] != '\0' ){
00189 strcat(qname,".gz") ; cfile = fopen( qname , "wb" ) ;
00190 if( cfile == NULL ) cflag == 0 ;
00191 } else {
00192 cflag = 0 ;
00193 }
00194
00195 if( cflag == 0 ){
00196 DMESS(" **Temp file %s FAILS\n",qname); IOCHAN_CLOSE(ioc); return(-1);
00197 }
00198 DMESS(" ++Temp file=%s",qname);
00199 }
00200
00201 /* read all of url */
00202
00203 if( !cflag ){ buf = AFMALL(char, QBUF ) ; nall = QBUF ; }
00204 nuse = 0 ; first = 1 ;
00205
00206 do{
00207 if(debug)fprintf(stderr,".");
00208 ii = iochan_readcheck( ioc , msec ) ; /* wait for data to be ready */
00209 if( ii <= 0 ) break ; /* quit if no data */
00210 ii = iochan_recv( ioc , qbuf , QBUF ) ;
00211 if( ii <= 0 ) break ; /* quit if no data */
00212
00213 if( prog ){
00214 nget += ii ; jj = nget/(1024*1024) ;
00215 if( jj > nmeg ){ nmeg=jj; fprintf(stderr,"."); }
00216 }
00217
00218 if( first ){ /* check for "not found" */
00219 if( buf == NULL ){ buf = AFMALL(char, ii) ; }
00220 memcpy( buf , qbuf , ii ) ;
00221 for( jj=0 ; jj < ii ; jj++ ) buf[jj] = toupper(buf[jj]) ;
00222 buf[ii-1] = '\0' ;
00223 cpt = strstr(buf,"NOT FOUND") ;
00224 if( cpt != NULL ){
00225 if( cflag ){ fclose(cfile) ; unlink(qname) ; }
00226 DMESS("%s"," **NOT FOUND\n");
00227 free(buf) ; IOCHAN_CLOSE(ioc) ; return( -1 );
00228 }
00229 first = 0 ;
00230 if( cflag ){ free(buf) ; buf = NULL ; }
00231 }
00232
00233 if( cflag ){ /* write to temp file */
00234 nall = fwrite( qbuf , 1 , ii , cfile ) ;
00235 if( nall != ii ){ /* write failed? */
00236 DMESS("\n** Write to temp file %s FAILED!\n",qname);
00237 fclose(cfile) ; unlink(qname) ;
00238 IOCHAN_CLOSE(ioc) ; return( -1 );
00239 }
00240 } else { /* save to buffer */
00241 if( nuse+ii > nall ){ /* enlarge buffer? */
00242 nall += QBUF ;
00243 buf = AFREALL(buf, char, nall) ;
00244 }
00245 memcpy( buf+nuse , qbuf , ii ) ; /* copy data into buffer */
00246 }
00247 nuse += ii ; /* how many bytes so far */
00248 } while(1) ;
00249 IOCHAN_CLOSE(ioc) ;
00250
00251 if( prog && nmeg > 0 ) fprintf(stderr,"!\n") ;
00252
00253 /* didn't get anything? */
00254
00255 if( nuse <= 0 ){
00256 if( cflag ){ fclose(cfile) ; unlink(qname) ; }
00257 else { free(buf) ; }
00258 FAILED; return(-1);
00259 }
00260 if(debug)fprintf(stderr,"!\n");
00261
00262 /* uncompression time? */
00263
00264 if( cflag ){
00265 fclose(cfile) ;
00266 sprintf( qbuf , "gzip -dq %s" , qname ) ; /* execute gzip */
00267 ii = system(qbuf) ;
00268 if( ii != 0 ){ DMESS("%s"," **gzip failed!\n");
00269 unlink(qname) ; return( -1 ); } /* gzip failed */
00270 ii = strlen(qname) ; qname[ii-3] = '\0' ; /* fix filename */
00271 nuse = THD_filesize( qname ) ; /* find how big */
00272 if( nuse <= 0 ){ DMESS("%s"," **gzip failed!\n");
00273 unlink(qname) ; return( -1 ); }
00274
00275 cfile = fopen( qname , "rb" ) ;
00276 if( cfile == NULL ){ DMESS("%s"," **gzip failed!\n");
00277 unlink(qname) ; return( -1 ); }
00278 buf = AFMALL(char, nuse) ;
00279 fread( buf , 1 , nuse , cfile ) ; /* read file in */
00280 fclose(cfile) ; unlink(qname) ;
00281 }
00282
00283 /* data is in buf, nuse bytes of it */
00284
00285 DMESS("%s","\n"); *data = buf ; return( nuse );
00286 }
|
|
|
Definition at line 21 of file thd_http.c. References use_http_10. Referenced by AFNI_start_version_check(), and main().
00021 { use_http_10 = n; } /* 24 Mar 2005 */
|
|
|
Definition at line 23 of file thd_http.c. References http_user_agent. Referenced by AFNI_start_version_check(), and main().
00024 {
00025 if( ua == NULL || *ua == '\0' ) http_user_agent = "read_URL" ;
00026 else http_user_agent = strdup(ua) ;
00027 }
|
|
||||||||||||
|
Definition at line 293 of file thd_http.c. References ftp_name, ftp_pwd, and name.
|
|
|
Definition at line 141 of file thd_http.c. Referenced by main().
|
|
|
Definition at line 410 of file thd_iochan.c. References key, and string_to_key(). Referenced by iochan_goodcheck(), and iochan_init().
00411 {
00412 key_t key ;
00413 int shmid ;
00414
00415 key = string_to_key( key_string ) ;
00416 shmid = shmget( key , 0 , 0777 ) ;
00417 return shmid ;
00418 }
|
|
|
make a new shmem segment * Definition at line 795 of file thd_iochan.c. References shm_nattach(). Referenced by iochan_goodcheck().
00796 {
00797 if( shmid < 0 ) return 0 ;
00798 return (shm_nattach(shmid) >= 2) ;
00799 }
|
|
|
Definition at line 446 of file thd_iochan.c. References PERROR. Referenced by iochan_goodcheck(), iochan_init(), proc_finalize_shm_volumes(), and THD_alloc_datablock().
00447 {
00448 char * adr ;
00449 adr = (char *) shmat( shmid , NULL , 0 ) ;
00450 if( adr == (char *) -1 ){
00451 adr = NULL ; PERROR("Can't attach? shm_attach") ;
00452 }
00453 return adr ;
00454 }
|
|
||||||||||||
|
Definition at line 425 of file thd_iochan.c. References key, PERROR, and string_to_key(). Referenced by iochan_init(), proc_finalize_shm_volumes(), and THD_alloc_datablock().
00426 {
00427 key_t key ;
00428 int shmid ;
00429
00430 key = string_to_key( key_string ) ;
00431 shmid = shmget( key , size , 0777 | IPC_CREAT ) ;
00432 if( shmid < 0 ){
00433 PERROR("Can't create? shm_create") ;
00434 if( pron ) fprintf(stderr,"key_string=%s key=%d size=%d\n",
00435 key_string , (int)key , size ) ;
00436 }
00437 return shmid ;
00438 }
|
|
|
Definition at line 477 of file thd_iochan.c. References PERROR, and STATUS. Referenced by iochan_close(), iochan_goodcheck(), iochan_init(), and shm_alivecheck().
00478 {
00479 int ii ;
00480 struct shmid_ds buf ;
00481
00482 if( shmid < 0 ){ STATUS("shm_nattach: illegal shmid") ; return -1 ; }
00483 errno = 0 ;
00484 ii = shmctl( shmid , IPC_STAT , &buf ) ;
00485 if( ii < 0 ){
00486 PERROR("Has shared memory buffer gone bad? shm_nattach") ;
00487 return -1 ;
00488 }
00489 return buf.shm_nattch ;
00490 }
|
|
|
Definition at line 461 of file thd_iochan.c. References PERROR. Referenced by iochan_goodcheck(), and iochan_init().
00462 {
00463 int ii ;
00464 struct shmid_ds buf ;
00465
00466 if( shmid < 0 ) return -1 ;
00467 ii = shmctl( shmid , IPC_STAT , &buf ) ;
00468 if( ii < 0 ){ PERROR("Can't check? shm_size"); return -1; }
00469 return buf.shm_segsz ;
00470 }
|
|
|
get address of connector * Definition at line 388 of file thd_iochan.c. Referenced by shm_accept(), and shm_create().
00389 {
00390 int ii , sum ;
00391
00392 sum = 666 ;
00393 if( key_string == NULL ) return (key_t) sum ;
00394
00395 for( ii=0 ; key_string[ii] != '\0' ; ii++ )
00396 sum += ((int)key_string[ii]) << ((ii%3)*8) ;
00397
00398 if( sum < 0 ) sum = -sum ;
00399 else if( sum == 0 ) sum = 314159265 ;
00400
00401 return (key_t) sum ;
00402 }
|
|
||||||||||||||||
|
set port on remote computer * Definition at line 338 of file thd_iochan.c. References malloc, and PERROR. Referenced by iochan_goodcheck(), iochan_init(), NI_stream_goodcheck(), and NI_stream_open().
00339 {
00340 struct sockaddr_in pin ;
00341 int addrlen , sd_new ;
00342 struct hostent * hostp ;
00343 char * sout , * str ;
00344
00345 /** accept the connection **/
00346
00347 /** STATUS("tcp_accept: about to call accept") ; **/
00348
00349 addrlen = sizeof(pin) ;
00350 sd_new = accept( sd , (struct sockaddr *)&pin , &addrlen ) ;
00351 if( sd_new == -1 ){ PERROR("Can't accept? tcp_accept"); return -1; }
00352
00353 /** get name of connector **/
00354
00355 if( hostname != NULL ){
00356 hostp = gethostbyaddr( (char *) (&pin.sin_addr) ,
00357 sizeof(struct in_addr) , AF_INET ) ;
00358 if( hostp != NULL ){
00359 sout = (char *) malloc( strlen(hostp->h_name)+1 ) ;
00360 strcpy(sout,hostp->h_name) ;
00361 } else {
00362 sout = (char *) malloc( strlen("UNKNOWN")+1 ) ;
00363 strcpy(sout,"UNKNOWN") ;
00364 }
00365 *hostname = sout ;
00366 }
00367
00368 /** get address of connector **/
00369
00370 if( hostaddr != NULL ){
00371 str = inet_ntoa( pin.sin_addr ) ;
00372 sout = (char *) malloc( strlen(str)+1 ) ;
00373 strcpy(sout,str) ;
00374 *hostaddr = sout ;
00375 }
00376
00377 return sd_new ;
00378 }
|
|
|
Definition at line 203 of file thd_iochan.c. References PERROR, tcp_readcheck(), and tcp_recv. Referenced by iochan_goodcheck(), iochan_readcheck(), NI_stream_goodcheck(), and NI_stream_readcheck().
00204 {
00205 int ii ;
00206 char bbb[4] ;
00207
00208 ii = tcp_readcheck(sd,0) ; /* can I read? */
00209 if( ii == 0 ) return 1 ; /* can't read is OK */
00210 if( ii < 0 ) return 0 ; /* some error is bad */
00211 errno = 0 ;
00212 ii = tcp_recv( sd , bbb , 1 , MSG_PEEK ) ; /* try to read one byte */
00213 if( ii == 1 ) return 1 ; /* if we get it, good */
00214 if( errno ) PERROR("Socket gone bad? tcp_alivecheck") ;
00215 return 0 ; /* no data ==> death! */
00216 }
|
|
||||||||||||
|
Definition at line 223 of file thd_iochan.c. References CLOSEDOWN, l, PERROR, socket, SOCKET_BUFSIZE, and STATUS. Referenced by iochan_goodcheck(), iochan_init(), NI_stream_goodcheck(), and NI_stream_open().
00224 {
00225 int sd , l ;
00226 struct sockaddr_in sin ;
00227 struct hostent * hostp ;
00228
00229 if( host == NULL || port < 1 ){ STATUS("tcp_connect: illegal inputs") ; return -1 ; }
00230
00231 /** open a socket **/
00232
00233 sd = socket( AF_INET , SOCK_STREAM , 0 ) ;
00234 if( sd == -1 ){ PERROR("Can't create? tcp_connect[socket]"); return -1; }
00235
00236 /** set socket options (no delays, large buffers) **/
00237
00238 #if 0
00239 l = 1;
00240 setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (void *)&l, sizeof(int)) ;
00241 #endif
00242 l = SOCKET_BUFSIZE ;
00243 setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (void *)&l, sizeof(int)) ;
00244 setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (void *)&l, sizeof(int)) ;
00245
00246 /** set port on remote computer **/
00247
00248 memset( &sin , 0 , sizeof(sin) ) ;
00249 sin.sin_family = AF_INET ;
00250 sin.sin_port = htons(port) ;
00251
00252 /** set remote computer **/
00253
00254 hostp = gethostbyname(host) ;
00255 if( hostp == NULL ){
00256 PERROR("Can't lookup? tcp_connect[gethostbyname]"); CLOSEDOWN(sd); return -1;
00257 }
00258 sin.sin_addr.s_addr = ((struct in_addr *)(hostp->h_addr))->s_addr ;
00259
00260 if( connect(sd , (struct sockaddr *)&sin , sizeof(sin)) == -1 ){
00261 PERROR("Can't connect? tcp_connect[connect]") ; CLOSEDOWN(sd); return -1;
00262 }
00263
00264 return sd ;
00265 }
|
|
|
set remote computer * Definition at line 276 of file thd_iochan.c. References CLOSEDOWN, l, PERROR, socket, SOCKET_BUFSIZE, and STATUS. Referenced by iochan_init(), and NI_stream_open().
00277 {
00278 int sd , l ;
00279 struct sockaddr_in sin ;
00280
00281 if( port < 1 ){ STATUS("tcp_listen: illegal port") ; return -1 ; }
00282
00283 /** open a socket **/
00284
00285 sd = socket( AF_INET , SOCK_STREAM , 0 ) ;
00286 if( sd == -1 ){ PERROR("Can't create? tcp_listen[socket]"); return -1; }
00287
00288 /** set socket options (no delays, large buffers) **/
00289
00290 #if 0
00291 l = 1;
00292 setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (void *)&l, sizeof(int)) ;
00293 #endif
00294 l = SOCKET_BUFSIZE ;
00295 setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (void *)&l, sizeof(int)) ;
00296 setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (void *)&l, sizeof(int)) ;
00297
00298 /** set port on remote computer **/
00299
00300 memset( &sin , 0 , sizeof(sin) ) ;
00301 sin.sin_family = AF_INET ;
00302 sin.sin_port = htons(port) ;
00303 sin.sin_addr.s_addr = INADDR_ANY ; /* reader reads from anybody */
00304
00305 if( bind(sd , (struct sockaddr *)&sin , sizeof(sin)) == -1 ){
00306 PERROR("Can't bind? tcp_listen[bind]"); CLOSEDOWN(sd); return -1;
00307 }
00308
00309 if( listen(sd,1) == -1 ){
00310 PERROR("Can't listen? tcp_listen[listen]"); CLOSEDOWN(sd); return -1;
00311 }
00312
00313 return sd ;
00314 }
|
|
||||||||||||
|
Definition at line 107 of file thd_iochan.c. References PERROR, and STATUS. Referenced by iochan_clearcheck(), iochan_goodcheck(), iochan_init(), iochan_readcheck(), NI_stream_goodcheck(), NI_stream_open(), NI_stream_read(), NI_stream_readcheck(), and tcp_alivecheck().
00108 {
00109 int ii ;
00110 fd_set rfds ;
00111 struct timeval tv , * tvp ;
00112
00113 if( sd < 0 ){ STATUS("tcp_readcheck: illegal sd") ; return -1 ; } /* bad socket id */
00114
00115 FD_ZERO(&rfds) ; FD_SET(sd, &rfds) ; /* check only sd */
00116
00117 if( msec >= 0 ){ /* set timer */
00118 tv.tv_sec = msec/1000 ;
00119 tv.tv_usec = (msec%1000)*1000 ;
00120 tvp = &tv ;
00121 } else {
00122 tvp = NULL ; /* forever */
00123 }
00124
00125 /** STATUS("tcp_readcheck: call select") ; **/
00126
00127 ii = select(sd+1, &rfds, NULL, NULL, tvp) ; /* check it */
00128 if( ii == -1 ) PERROR( "Socket gone bad? tcp_readcheck[select]" ) ;
00129 return ii ;
00130 }
|
|
|
STATUS("tcp_writecheck: call select") ; * Definition at line 179 of file thd_iochan.c. Referenced by iochan_set_cutoff(), tcp_accept(), tcp_connect(), and tcp_listen().
00180 {
00181 #ifdef SO_LINGER
00182 { struct linger lg ;
00183 lg.l_onoff = 1 ;
00184 lg.l_linger = 0 ;
00185 setsockopt(sd, SOL_SOCKET, SO_LINGER, (void *)&lg, sizeof(struct linger)) ;
00186 }
00187 #endif
00188 #ifdef SO_REUSEADDR
00189 { int optval = 1;
00190 setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval)) ;
00191 }
00192 #endif
00193 return ;
00194 }
|
|
||||||||||||
|
STATUS("tcp_readcheck: call select") ; * Definition at line 132 of file thd_iochan.c. References PERROR, and STATUS. Referenced by iochan_send(), iochan_writecheck(), NI_stream_write(), NI_stream_writecheck(), RT_mp_comm_close(), and RT_mp_comm_send_data().
00133 {
00134 int ii ;
00135 fd_set wfds ;
00136 struct timeval tv , * tvp ;
00137
00138 if( sd < 0 ){ STATUS("tcp_writecheck: illegal sd") ; return -1 ; } /* bad socket id */
00139
00140 FD_ZERO(&wfds) ; FD_SET(sd, &wfds) ; /* check only sd */
00141
00142 if( msec >= 0 ){ /* set timer */
00143 tv.tv_sec = msec/1000 ;
00144 tv.tv_usec = (msec%1000)*1000 ;
00145 tvp = &tv ;
00146 } else {
00147 tvp = NULL ; /* forever */
00148 }
00149
00150 /** STATUS("tcp_writecheck: call select") ; **/
00151
00152 ii = select(sd+1, NULL , &wfds, NULL, tvp) ; /* check it */
00153 if( ii == -1 ) PERROR( "Socket gone bad? tcp_writecheck[select]" ) ;
00154 return ii ;
00155 }
|