Hi,

Try this version of store.c
Error diagnostic for UdmStoreOpen function added.
Please feedback any error messages produced.

Aiko wrote:
> Author: Aiko
> Email: [EMAIL PROTECTED]
> Message:
> Hi,
> 
> no firewall. The cachelogd run correct!
> 
> cu
> Aiko
> 
> Reply: <http://www.mnogosearch.org/board/message.php?id=3541>


-- 
Maxim Zakharov            http://sochi.net.ru/~maxime/
  Sochi, Russia               http://www.sochi.com/

#include <udm_config.h>

#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <sys/types.h>
#ifdef   HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif

#include "udm_store.h"
#include "udm_services.h"
#include "udm_xmalloc.h"

#ifdef HAVE_ZLIB

#ifndef MSG_WAITALL
#define MSG_WAITALL 0
#endif

ssize_t UdmRecvall(int s, void *buf, size_t len, int flags) {
  size_t received = 0, r;
  char *b = buf;
  while ( (received < len) && ((r = recv(s, &b[received], len - received, flags)) >= 0 
) ) {
    received += r;
  }
  return received;
}
#endif


__INDLIB__ int UdmStoreDoc(UDM_ENV *Conf, const char *Doc, size_t DocSize, unsigned 
int rec_id) {

#ifdef HAVE_ZLIB
  const char *hello = "S\0";
  char result[8];
  int s;

  if ((s = UdmStoreOpen(Conf)) < 0) {
    return -1;
  }

  send (s, hello, 1, 0);
  send (s, &rec_id, sizeof(rec_id), 0);
  send (s, &DocSize, sizeof(DocSize), 0);
  send (s, Doc, DocSize, 0);

  if (UdmRecvall(s, result, 6, MSG_WAITALL) < 0) {
    closesocket(s);
    return -1;
  }
  
  closesocket(s);

  if (strncmp(result, "STORED", 6) != 0) {
    return -1;
  }

  return 0;

#else
  return -1;

#endif

}


__INDLIB__ char * UdmUnStoreDoc(UDM_ENV *Conf, unsigned int rec_id, size_t *DS) {

#ifdef HAVE_ZLIB
  const char *hello = "G\0";
  size_t DocSize;
  char *Doc = NULL;
  int s;

  if ((s = UdmStoreOpen(Conf)) < 0) {
    return NULL;
  }

  send (s, hello, 1, 0);
  send (s, &rec_id, sizeof(rec_id), 0);
  if (UdmRecvall(s, &DocSize, sizeof(DocSize), MSG_WAITALL) < 0) {
    closesocket(s);
    return NULL;
  }
  if (DocSize == 0) {
    closesocket(s);
    return NULL;
  }
  if ((Doc = UdmXmalloc(DocSize)) == NULL) {
    closesocket(s);
    return NULL;
  }
  if (UdmRecvall(s, Doc, DocSize, MSG_WAITALL) < 0) {
    closesocket(s);
    return NULL;
  }
  closesocket(s);
  *DS = DocSize;
  return Doc;

#else
  return NULL;
#endif
}

int UdmStoreOpen(UDM_ENV *Conf) {

#ifdef HAVE_ZLIB
  struct hostent *hp;
  struct sockaddr_in server_addr;
  int s, nport = UDM_STORED_PORT;

  if(Conf->stored_addr){
    char * cport;
                        
    if((cport=strchr(Conf->stored_addr,':'))){
      *cport='\0';
      nport=atoi(cport+1);
    }
  }else{
    return -1;
/*    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);*/
  }

  if ((hp = gethostbyname(Conf->stored_addr)) == 0 ) {
    fprintf(stderr, "StoreOpen ERR gethostbyname: %s\n", hstrerror(h_errno));
    return -1;
  }
  bzero(&server_addr, sizeof(server_addr));
  memmove(hp->h_addr, &server_addr.sin_addr, (size_t)hp->h_length);
  server_addr.sin_family = hp->h_addrtype;
  server_addr.sin_port = htons((u_short)nport);

  if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    fprintf(stderr, "StoreOpen ERR socket: %s\n", strerror(errno));
    return -1;
  }
  
  if(connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
    fprintf(stderr, "StoreOpen ERR connect: %s\n", strerror(errno));
    closesocket(s);
    return -1;
  }

  return s;

#else
  return -1;
#endif

}

Reply via email to