$B"#"#"#(B $BDs6!$9$k(B API $B"#"#"#(B 
 
  Openssl $B$N(B API $B$N4JC1$J%i%C%Q!<$G!$(Bsocket $B$H$[$\F1MM$N%$%s%?!<%U%'!<%9$rDs6!$7$^$9!%(B

  $B6qBNE*$K$O!$0J2<$N%G!<%?9=B$$H4X?t$rDs6!$9$k(B C $B$N%i%$%V%i%j$G$9!%(B
  $B3F4X?t$O!$L>A0$+$iN`?d$5$l$kDL$j$N5!G=$rDs6!$7$^$9!%(B
 
  struct opt_t {
	char *priv_key;
	char *password;
	char *certificate;
	char *ca_cert;
  };

  void    grid_initialize ( const struct opt_t *opt );
  void    grid_finalize ( void );
  int     grid_connect( int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen );
  int	  grid_bind ( int sockfd, struct sockaddr *my_addr, socklen_t addrlen );
  int  	  grid_listen ( int s, int backlog );
  int     grid_accept ( int s, struct sockaddr *addr, socklen_t *addrlen );
  ssize_t grid_send ( int s, const void *buf, size_t len, int flags );
  ssize_t grid_recv ( int s, void *buf, size_t len, int flags );
  int     grid_shutdown ( int s, int how );

  /* Grid_xxx () functions are same as grid_xxx () functions except that
   * the Grid_xxx () functions abort when they fail. */
  int     Grid_connect( int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen );
  void    Grid_bind ( int sockfd, struct sockaddr *my_addr, socklen_t addrlen );
  void    Grid_listen ( int s, int backlog );
  int     Grid_accept( int s, struct sockaddr *addr , socklen_t *addrlen );
  size_t  Grid_send( int s, const void *buf, size_t len, int flags );
  size_t  Grid_recv( int s, void *buf, size_t len, int flags );

  /* conveninent functions for network programming */
  int  Socket ( int domain, int type, int protocol );
  void Setsockopt_reuseaddr ( int s );
  in_addr_t in_addr_of_hostname ( const char *name );
  struct sockaddr_in create_inet_sockaddr ( in_addr_t in_addr, int port );

  $B%W%m%;%9$rN)$A>e$2$k;~$K!$%f!<%6$O(B
    - $B<+J,$NHkL)80(B 
    - $BHkL)80$N%Q%9%o!<%I(B
    - $B<+J,$N>ZL@=q(B
    - $B<+J,$N>ZL@=q$r=pL>$7$?(B CA $B$N>ZL@=q(B
  $B$rM?$($k$h$&$K$7$^$9!%(B
   
  $B%f!<%6$+$iM?$($i$l$?>pJs$r85$K%3%M%/%7%g%s3NN);~$KG'>Z$r9T$$$^$9!%(B

  $B:#8=:_$O!$(B
  $B<+J,$,;XDj$5$l$?(B CA $B$r(B X $B$H$9$k$H!$(B
  X $B0J30$N(B CA $B$K$h$C$F=pL>$5$l$?HkL)80!&>ZL@=q$r;H$C$F$$$k(B
  $B%W%m%;%9$+$i$N(B connect $B$O5qH]$9$k$h$&$K$7$F$$$^$9!%(B

 
$B"#"#"#(B $B%i%$%V%i%j$N%S%k%I(B & $B%$%s%9%H!<%k(B $B"#"#"#(B 

  > cvs -d :pserver:anonymous@oop7.is.s.u-tokyo.ac.jp:/roots/phoenix login
  Logging in to :pserver:anonymous@oop7.is.s.u-tokyo.ac.jp:2401/roots/phoenix
  CVS password:  $B!J6u%Q%9%o!<%I!K(B
 
  > cvs -d :pserver:anonymous@oop7.is.s.u-tokyo.ac.jp:/roots/phoenix co libgrid

  > cd libgrid/

  > ./configure -prefix=$INSTALL_PREFIX

  > make

  > make install 


$B"#"#"#(B $B%i%$%V%i%j$N;HMQNc(B $B"#"#"#(B 

  Linux $B$J$i$P(B 

  > gcc -I$INSTALL_DIR/include -L$INSTALL_DIR/lib -lgrid -lssl foo.c -o foo

  $B$J$I$H$9$k$3$H$G!$%3%s%Q%$%k$9$k$3$H$,$G$-$^$9!%(B


  $B@8@.$5$l$?<B9T%U%!%$%k$r(B

  > LD_LIBRARY_PATH=$INSTALL_DIR/lib ./foo

  $B$H$$$&$h$&$K<B9T$9$k$3$H$,$G$-$^$9!%(B

  sample/sample.c $B$K%5%s%W%k%3!<%I$,CV$$$F$"$j$^$9!%(B


$B"#"#"#(B $B80!&>ZL@=q!&(BCA$B$K$D$$$F(B $B"#"#"#(B 
   
  See doc/how_to_ca.txt 
 

$B"#"#"#(B TODO $B"#"#"#(B 

  - $B4X?t$NJV$jCM$r$-$A$s$H07$&!%(B
     $B!J%(%i!<=hM}!$Hs%V%m%C%-%s%04X78!K(B

  - grid_finalize ()
    grid_shutdown ()
    grid_get_error_kind ()
    $B$J$I$r<BAu$9$k!%(B
    
  - $B3F4X?t$r(B reentrant $B$K$9$k!%(B

  - $BK\Ev$K$-$A$s$HG'>Z$,F0$$$F$$$k$+$N3NG'(B
