Diff for /libaitrpc/src/srv.c between versions 1.5.2.5 and 1.5.2.6

version 1.5.2.5, 2011/09/07 10:46:54 version 1.5.2.6, 2011/10/31 14:45:26
Line 333  int Line 333  int
 rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_short Port, const char *diskDir)  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_short Port, const char *diskDir)
 {  {
         int n = 1;          int n = 1;
        struct sockaddr sa;        io_sockaddr_t sa;
        struct sockaddr_in *sin = (struct sockaddr_in*) &sa; 
        struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) &sa; 
        struct sockaddr_un *sun = (struct sockaddr_un*) &sa; 
   
         if (!srv) {          if (!srv) {
                 rpc_SetErr(EINVAL, "Error:: Invalid parameters can`t init BLOB server ...\n");                  rpc_SetErr(EINVAL, "Error:: Invalid parameters can`t init BLOB server ...\n");
Line 360  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s Line 357  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s
         srv->srv_blob.server.cli_parent = srv;          srv->srv_blob.server.cli_parent = srv;
   
         memcpy(&sa, &srv->srv_server.cli_sa, sizeof sa);          memcpy(&sa, &srv->srv_server.cli_sa, sizeof sa);
        switch (srv->srv_server.cli_sa.sa_family) {        switch (srv->srv_server.cli_sa.sa.sa_family) {
                 case AF_INET:                  case AF_INET:
                        sin->sin_port = htons(Port);                        sa.sin.sin_port = htons(Port);
                        memcpy(&srv->srv_blob.server.cli_sa, sin, sizeof(struct sockaddr));                        memcpy(&srv->srv_blob.server.cli_sa, &sa, sizeof sa);
                         break;                          break;
                 case AF_INET6:                  case AF_INET6:
                        sin6->sin6_port = htons(Port);                        sa.sin6.sin6_port = htons(Port);
                        memcpy(&srv->srv_blob.server.cli_sa, sin6, sizeof(struct sockaddr));                        memcpy(&srv->srv_blob.server.cli_sa, &sa, sizeof sa);
                         break;                          break;
                 case AF_LOCAL:                  case AF_LOCAL:
                        strlcat(sun->sun_path, ".blob", sizeof sun->sun_path);                        strlcat(sa.sun.sun_path, ".blob", sizeof sa.sun.sun_path);
                        memcpy(&srv->srv_blob.server.cli_sa, sun, sizeof(struct sockaddr));                        memcpy(&srv->srv_blob.server.cli_sa, &sa, sizeof sa);
                         break;                          break;
                 default:                  default:
                         return -1;                          return -1;
         }          }
   
         /* create BLOB server socket */          /* create BLOB server socket */
        srv->srv_blob.server.cli_sock = socket(srv->srv_server.cli_sa.sa_family, SOCK_STREAM, 0);        srv->srv_blob.server.cli_sock = socket(srv->srv_server.cli_sa.sa.sa_family, SOCK_STREAM, 0);
         if (srv->srv_blob.server.cli_sock == -1) {          if (srv->srv_blob.server.cli_sock == -1) {
                 LOGERR;                  LOGERR;
                 return -1;                  return -1;
Line 399  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s Line 396  rpc_srv_initBLOBServer(rpc_srv_t * __restrict srv, u_s
                 close(srv->srv_blob.server.cli_sock);                  close(srv->srv_blob.server.cli_sock);
                 return -1;                  return -1;
         }          }
        if (bind(srv->srv_blob.server.cli_sock, &srv->srv_blob.server.cli_sa        if (bind(srv->srv_blob.server.cli_sock, &srv->srv_blob.server.cli_sa.sa, 
                                 sizeof srv->srv_blob.server.cli_sa) == -1) {                                  sizeof srv->srv_blob.server.cli_sa) == -1) {
                 LOGERR;                  LOGERR;
                 close(srv->srv_blob.server.cli_sock);                  close(srv->srv_blob.server.cli_sock);
Line 451  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) Line 448  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv)
   
         /* close all clients connections & server socket */          /* close all clients connections & server socket */
         for (i = 0, c = srv->srv_blob.clients; i < srv->srv_numcli && c; i++, c++)          for (i = 0, c = srv->srv_blob.clients; i < srv->srv_numcli && c; i++, c++)
                if (c->cli_sa.sa_family)                if (c->cli_sa.sa.sa_family)
                         shutdown(c->cli_sock, SHUT_RDWR);                          shutdown(c->cli_sock, SHUT_RDWR);
         close(srv->srv_blob.server.cli_sock);          close(srv->srv_blob.server.cli_sock);
   
Line 481  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) Line 478  rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv)
 int  int
 rpc_srv_loopBLOB(rpc_srv_t * __restrict srv)  rpc_srv_loopBLOB(rpc_srv_t * __restrict srv)
 {  {
        socklen_t salen = sizeof(struct sockaddr);        socklen_t salen = sizeof(io_sockaddr_t);
         register int i;          register int i;
         rpc_cli_t *c;          rpc_cli_t *c;
         fd_set fds;          fd_set fds;
Line 500  rpc_srv_loopBLOB(rpc_srv_t * __restrict srv) Line 497  rpc_srv_loopBLOB(rpc_srv_t * __restrict srv)
   
         while (srv->srv_blob.state != kill && srv->srv_kill != kill) {          while (srv->srv_blob.state != kill && srv->srv_kill != kill) {
                 for (c = srv->srv_blob.clients, i = 0; i < srv->srv_numcli && c; i++, c++)                  for (c = srv->srv_blob.clients, i = 0; i < srv->srv_numcli && c; i++, c++)
                        if (!c->cli_sa.sa_family)                        if (!c->cli_sa.sa.sa_family)
                                 break;                                  break;
                 if (i >= srv->srv_numcli) {                  if (i >= srv->srv_numcli) {
 #ifdef HAVE_PTHREAD_YIELD  #ifdef HAVE_PTHREAD_YIELD
Line 522  rpc_srv_loopBLOB(rpc_srv_t * __restrict srv) Line 519  rpc_srv_loopBLOB(rpc_srv_t * __restrict srv)
                 if (!ret)                  if (!ret)
                         continue;                          continue;
   
                c->cli_sock = accept(srv->srv_blob.server.cli_sock, &c->cli_sa, &salen);                c->cli_sock = accept(srv->srv_blob.server.cli_sock, &c->cli_sa.sa, &salen);
                 if (c->cli_sock == -1) {                  if (c->cli_sock == -1) {
                         LOGERR;                          LOGERR;
                         continue;                          continue;
Line 560  rpc_srv_initServer(u_int regProgID, u_int regProcID, i Line 557  rpc_srv_initServer(u_int regProgID, u_int regProcID, i
         rpc_srv_t *srv = NULL;          rpc_srv_t *srv = NULL;
         int n = 1;          int n = 1;
         struct hostent *host = NULL;          struct hostent *host = NULL;
        struct sockaddr sa;        io_sockaddr_t sa;
        struct sockaddr_in *sin = (struct sockaddr_in*) &sa; 
        struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) &sa; 
        struct sockaddr_un *sun = (struct sockaddr_un*) &sa; 
   
         if (!concurentClients || !regProgID ||           if (!concurentClients || !regProgID || 
                         (family != AF_INET && family != AF_INET6 && family != AF_LOCAL)) {                          (family != AF_INET && family != AF_INET6 && family != AF_LOCAL)) {
Line 582  rpc_srv_initServer(u_int regProgID, u_int regProcID, i Line 576  rpc_srv_initServer(u_int regProgID, u_int regProcID, i
                 }                  }
         }          }
         memset(&sa, 0, sizeof sa);          memset(&sa, 0, sizeof sa);
        sa.sa_family = family;        sa.sa.sa_family = family;
         switch (family) {          switch (family) {
                 case AF_INET:                  case AF_INET:
                        sin->sin_len = sizeof(struct sockaddr_in);                        sa.sin.sin_len = sizeof(struct sockaddr_in);
                        sin->sin_port = htons(Port);                        sa.sin.sin_port = htons(Port);
                         if (csHost)                          if (csHost)
                                memcpy(&sin->sin_addr, host->h_addr, host->h_length);                                memcpy(&sa.sin.sin_addr, host->h_addr, host->h_length);
                         break;                          break;
                 case AF_INET6:                  case AF_INET6:
                        sin6->sin6_len = sizeof(struct sockaddr_in6);                        sa.sin6.sin6_len = sizeof(struct sockaddr_in6);
                        sin6->sin6_port = htons(Port);                        sa.sin6.sin6_port = htons(Port);
                         if (csHost)                          if (csHost)
                                memcpy(&sin6->sin6_addr, host->h_addr, host->h_length);                                memcpy(&sa.sin6.sin6_addr, host->h_addr, host->h_length);
                         break;                          break;
                 case AF_LOCAL:                  case AF_LOCAL:
                        sun->sun_len = sizeof(struct sockaddr_un);                        sa.sun.sun_len = sizeof(struct sockaddr_un);
                         if (csHost)                          if (csHost)
                                strlcpy(sun->sun_path, csHost, sizeof sun->sun_path);                                strlcpy(sa.sun.sun_path, csHost, sizeof sa.sun.sun_path);
                         unlink(sa.sun.sun_path);
                         break;                          break;
                 default:                  default:
                         rpc_SetErr(EINVAL, "Error:: Invalid parameters can`t start RPC server ...\n");                          rpc_SetErr(EINVAL, "Error:: Invalid parameters can`t start RPC server ...\n");
Line 621  rpc_srv_initServer(u_int regProgID, u_int regProcID, i Line 616  rpc_srv_initServer(u_int regProgID, u_int regProcID, i
   
         srv->srv_server.cli_tid = pthread_self();          srv->srv_server.cli_tid = pthread_self();
         srv->srv_server.cli_parent = srv;          srv->srv_server.cli_parent = srv;
        switch (family) {        memcpy(&srv->srv_server.cli_sa, &sa, sizeof sa);
                case AF_INET: 
                        memcpy(&srv->srv_server.cli_sa, sin, sizeof srv->srv_server.cli_sa); 
                        break; 
                case AF_INET6: 
                        memcpy(&srv->srv_server.cli_sa, sin6, sizeof srv->srv_server.cli_sa); 
                        break; 
                case AF_LOCAL: 
                        memcpy(&srv->srv_server.cli_sa, sun, sizeof srv->srv_server.cli_sa); 
                        unlink(sun->sun_path); 
                        break; 
        } 
   
         /* create server socket */          /* create server socket */
         srv->srv_server.cli_sock = socket(family, SOCK_STREAM, 0);          srv->srv_server.cli_sock = socket(family, SOCK_STREAM, 0);
Line 660  rpc_srv_initServer(u_int regProgID, u_int regProcID, i Line 644  rpc_srv_initServer(u_int regProgID, u_int regProcID, i
                 free(srv);                  free(srv);
                 return NULL;                  return NULL;
         }          }
        if (bind(srv->srv_server.cli_sock, &srv->srv_server.cli_sa, sizeof srv->srv_server.cli_sa) == -1) {        if (bind(srv->srv_server.cli_sock, &srv->srv_server.cli_sa.sa, sizeof srv->srv_server.cli_sa) == -1) {
                 LOGERR;                  LOGERR;
                 close(srv->srv_server.cli_sock);                  close(srv->srv_server.cli_sock);
                 free(srv);                  free(srv);
Line 707  rpc_srv_endServer(rpc_srv_t ** __restrict psrv) Line 691  rpc_srv_endServer(rpc_srv_t ** __restrict psrv)
   
         /* close all clients connections & server socket */          /* close all clients connections & server socket */
         for (i = 0, c = (*psrv)->srv_clients; i < (*psrv)->srv_numcli && c; i++, c++)          for (i = 0, c = (*psrv)->srv_clients; i < (*psrv)->srv_numcli && c; i++, c++)
                if (c->cli_sa.sa_family) {                if (c->cli_sa.sa.sa_family) {
                         shutdown(c->cli_sock, SHUT_RDWR);                          shutdown(c->cli_sock, SHUT_RDWR);
                         close(c->cli_sock);                          close(c->cli_sock);
                 }                  }
Line 743  rpc_srv_endServer(rpc_srv_t ** __restrict psrv) Line 727  rpc_srv_endServer(rpc_srv_t ** __restrict psrv)
 int  int
 rpc_srv_loopServer(rpc_srv_t * __restrict srv)  rpc_srv_loopServer(rpc_srv_t * __restrict srv)
 {  {
        socklen_t salen = sizeof(struct sockaddr);        socklen_t salen = sizeof(io_sockaddr_t);
         register int i;          register int i;
         rpc_cli_t *c;          rpc_cli_t *c;
         fd_set fds;          fd_set fds;
Line 765  rpc_srv_loopServer(rpc_srv_t * __restrict srv) Line 749  rpc_srv_loopServer(rpc_srv_t * __restrict srv)
   
         while (srv->srv_kill != kill) {          while (srv->srv_kill != kill) {
                 for (c = srv->srv_clients, i = 0; i < srv->srv_numcli && c; i++, c++)                  for (c = srv->srv_clients, i = 0; i < srv->srv_numcli && c; i++, c++)
                        if (!c->cli_sa.sa_family)                        if (!c->cli_sa.sa.sa_family)
                                 break;                                  break;
                 if (i >= srv->srv_numcli) {                  if (i >= srv->srv_numcli) {
 #ifdef HAVE_PTHREAD_YIELD  #ifdef HAVE_PTHREAD_YIELD
Line 787  rpc_srv_loopServer(rpc_srv_t * __restrict srv) Line 771  rpc_srv_loopServer(rpc_srv_t * __restrict srv)
                 if (!ret)                  if (!ret)
                         continue;                          continue;
   
                c->cli_sock = accept(srv->srv_server.cli_sock, &c->cli_sa, &salen);                c->cli_sock = accept(srv->srv_server.cli_sock, &c->cli_sa.sa, &salen);
                 if (c->cli_sock == -1) {                  if (c->cli_sock == -1) {
                         LOGERR;                          LOGERR;
                         continue;                          continue;

Removed from v.1.5.2.5  
changed lines
  Added in v.1.5.2.6


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>