Apache-AuthenNTLM

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN


 0.15  9. Apr 2002

   - Added patch from Brian Paulsen which causes correct handling of
     non unicode charset (needed for some versions of win9x) and
     more verbose debugging output (decoded flags)

 0.14  26. Feb 2002

   - fixed a problem that page content of Perl sometimes goes to the
     stderr instead of stdout

 0.13  9. Jan 2002

    - return mapped username, when second request on same connection, 
      instead of unmapped

 0.12  8. Jan 2002 

    - fix broken Authen::Smb::authen function in Authen::Smb 0.92 that
      ships with Apache::AuthenNTLM

smb/smbval/.svn/text-base/rfcnb-io.c.svn-base  view on Meta::CPAN

#include <sys/uio.h>
#include <sys/signal.h>
#include <string.h>

int RFCNB_Timeout = 0;    /* Timeout in seconds ... */

void rfcnb_alarm(int sig)

{

  fprintf(stderr, "IO Timed out ...\n");

}

/* Set timeout value and setup signal handling */

int RFCNB_Set_Timeout(int seconds)

{
  int temp;
  /* If we are on a Bezerkeley system, use sigvec, else sigaction */

smb/smbval/.svn/text-base/rfcnb-io.c.svn-base  view on Meta::CPAN

   in the buffer we allocated or were passed ...                         */

int RFCNB_Discard_Rest(struct RFCNB_Con *con, int len)

{ char temp[100];   /* Read into here */
  int rest, this_read, bytes_read;

  /* len is the amount we should read */

#ifdef RFCNB_DEBUG
  fprintf(stderr, "Discard_Rest called to discard: %i\n", len);
#endif

  rest = len;

  while (rest > 0) {

    this_read = (rest > sizeof(temp)?sizeof(temp):rest);

    bytes_read = read(con -> fd, temp, this_read);

smb/smbval/.svn/text-base/rfcnb-io.c.svn-base  view on Meta::CPAN


    tot_sent += this_len;

    if (tot_sent == len) break;   /* Let's not send too much */

    pkt_ptr = pkt_ptr -> next;

  }

#ifdef RFCNB_DEBUG
  fprintf(stderr, "Frags = %i, tot_sent = %i\n", i, tot_sent);
#endif

  /* Set up an alarm if timeouts are set ... */

  if (RFCNB_Timeout > 0) 
    alarm(RFCNB_Timeout);

  if ((len_sent = writev(con -> fd, io_list, i)) < 0) { /* An error */

    con -> rfc_errno = errno;

smb/smbval/.svn/text-base/rfcnb-io.c.svn-base  view on Meta::CPAN

      RFCNB_errno = RFCNBE_BadWrite;
    RFCNB_saved_errno = errno;
    return(RFCNBE_Bad);
  }

  if (RFCNB_Timeout > 0)
    alarm(0);                /* Reset that sucker */

#ifdef RFCNB_DEBUG

  fprintf(stderr, "Len sent = %i ...\n", len_sent);
  RFCNB_Print_Pkt(stderr, "sent", pkt, len_sent); /* Print what send ... */

#endif

  return(len_sent);

}

/* Read an RFCNB packet off the connection. 

   We read the first 4 bytes, that tells us the length, then read the

smb/smbval/.svn/text-base/rfcnb-io.c.svn-base  view on Meta::CPAN

  char hdr[RFCNB_Pkt_Hdr_Len];      /* Local space for the header */
  struct RFCNB_Pkt *pkt_frag;
  int more, this_time, offset, frag_len, this_len;
  BOOL seen_keep_alive = TRUE;

  /* Read that header straight into the buffer */

  if (len < RFCNB_Pkt_Hdr_Len) { /* What a bozo */

#ifdef RFCNB_DEBUG
    fprintf(stderr, "Trying to read less than a packet:");
    perror("");
#endif
    RFCNB_errno = RFCNBE_BadParam;
    return(RFCNBE_Bad);

  }

  /* We discard keep alives here ... */

  if (RFCNB_Timeout > 0) 
    alarm(RFCNB_Timeout);

  while (seen_keep_alive) {

    if ((read_len = read(con -> fd, hdr, sizeof(hdr))) < 0) { /* Problems */
#ifdef RFCNB_DEBUG
      fprintf(stderr, "Reading the packet, we got:");
      perror("");
#endif
      if (errno == EINTR)
	RFCNB_errno = RFCNBE_Timeout;
      else
	RFCNB_errno = RFCNBE_BadRead;
      RFCNB_saved_errno = errno;
      return(RFCNBE_Bad);

    }

    /* Now we check out what we got */

    if (read_len == 0) { /* Connection closed, send back eof?  */

#ifdef RFCNB_DEBUG
      fprintf(stderr, "Connection closed reading\n");
#endif 

      if (errno == EINTR) 
	RFCNB_errno = RFCNBE_Timeout;
      else
	RFCNB_errno = RFCNBE_ConGone;
      RFCNB_saved_errno = errno;
      return(RFCNBE_Bad);

    }

    if (RFCNB_Pkt_Type(hdr) == RFCNB_SESSION_KEEP_ALIVE) {

#ifdef RFCNB_DEBUG
      fprintf(stderr, "RFCNB KEEP ALIVE received\n");
#endif
      
    }
    else {
      seen_keep_alive = FALSE;
    }

  }
 
  /* What if we got less than or equal to a hdr size in bytes? */

  if (read_len < sizeof(hdr)) { /* We got a small packet */

    /* Now we need to copy the hdr portion we got into the supplied packet */

    memcpy(pkt -> data, hdr, read_len);  /*Copy data */

#ifdef RFCNB_DEBUG
    RFCNB_Print_Pkt(stderr, "rcvd", pkt, read_len);
#endif

    return(read_len);

  }

  /* Now, if we got at least a hdr size, alloc space for rest, if we need it */

  pkt_len = RFCNB_Pkt_Len(hdr);

#ifdef RFCNB_DEBUG
  fprintf(stderr, "Reading Pkt: Length = %i\n", pkt_len);
#endif  

  /* Now copy in the hdr */

  memcpy(pkt -> data, hdr, sizeof(hdr));

  /* Get the rest of the packet ... first figure out how big our buf is? */
  /* And make sure that we handle the fragments properly ... Sure should */
  /* use an iovec ...                                                    */

smb/smbval/.svn/text-base/rfcnb-io.c.svn-base  view on Meta::CPAN

	else
	  RFCNB_errno = RFCNBE_ConGone;
      }

      RFCNB_saved_errno = errno;
      return(RFCNBE_Bad);

    }

#ifdef RFCNB_DEBUG
    fprintf(stderr, "Frag_Len = %i, this_time = %i, this_len = %i, more = %i\n", frag_len,
                    this_time, this_len, more);
#endif

    read_len = read_len + this_time;  /* How much have we read ... */

    /* Now set up the next part */

    if (pkt_frag -> next == NULL) break;       /* That's it here */

    pkt_frag = pkt_frag -> next;
    this_len = pkt_frag -> len;
    offset = 0;

    more = more - this_time;

  }

#ifdef RFCNB_DEBUG
  fprintf(stderr,"Pkt Len = %i, read_len = %i\n", pkt_len, read_len);
  RFCNB_Print_Pkt(stderr, "rcvd", pkt, read_len + sizeof(hdr));
#endif

  if (read_len < (pkt_len + sizeof(hdr))) {  /* Discard the rest */

    return(RFCNB_Discard_Rest(con, (pkt_len + sizeof(hdr)) - read_len));

  }

  if (RFCNB_Timeout > 0)
    alarm(0);                /* Reset that sucker */

smb/smbval/.svn/text-base/rfcnb-util.c.svn-base  view on Meta::CPAN


  /* this magic AA marks the calling name as workstation (gr) */
  sess_pkt[RFCNB_Pkt_Calling_Offset+30] = 'A' ;
  sess_pkt[RFCNB_Pkt_Calling_Offset+31] = 'A' ;
  
  
  /* Now send the packet */

#ifdef RFCNB_DEBUG

  fprintf(stderr, "Sending packet: ");
  
#endif

  if ((len = RFCNB_Put_Pkt(con, pkt, RFCNB_Pkt_Sess_Len)) < 0) {
    RFCNB_Free_Pkt(pkt);
    return(RFCNBE_Bad);       /* Should be able to write that lot ... */

    }

#ifdef RFCNB_DEBUG

  fprintf(stderr, "Getting packet.\n");

#endif

  res_pkt.data = resp;
  res_pkt.len  = sizeof(resp);
  res_pkt.next = NULL;

  if ((len = RFCNB_Get_Pkt(con, &res_pkt, sizeof(resp))) < 0) {
    RFCNB_Free_Pkt(pkt);
    return(RFCNBE_Bad);

smb/smbval/.svn/text-base/session.c.svn-base  view on Meta::CPAN


  hdr = pkt -> data;

  /* Following crap is for portability across multiple UNIX machines */

  *(hdr + RFCNB_Pkt_Type_Offset)  = RFCNB_SESSION_MESSAGE;
  RFCNB_Put_Pkt_Len(hdr, Length);

#ifdef RFCNB_DEBUG

  fprintf(stderr, "Sending packet: ");
  
#endif

  if ((len = RFCNB_Put_Pkt(Con_Handle, pkt, Length + RFCNB_Pkt_Hdr_Len)) < 0) {

    /* No need to change RFCNB_errno as it was done by put_pkt ...     */

    return(RFCNBE_Bad);   /* Should be able to write that lot ... */
    
  }

smb/smbval/.svn/text-base/session.c.svn-base  view on Meta::CPAN

    RFCNB_saved_errno = errno;
    return(RFCNBE_Bad);

  }

  pkt -> next = Data;  /* Plug in the data portion */

  if ((ret_len = RFCNB_Get_Pkt(con_Handle, pkt, Length + RFCNB_Pkt_Hdr_Len)) < 0) {

#ifdef RFCNB_DEBUG
    fprintf(stderr, "Bad packet return in RFCNB_Recv... \n");
#endif

    return(RFCNBE_Bad);

  }

  /* We should check that we go a message and not a keep alive */

  pkt -> next = NULL;

smb/smbval/.svn/text-base/smblib-util.c.svn-base  view on Meta::CPAN

    p = p + strlen(Prots[i]) + 2; /* Adjust len of p for null plus dialectID */

  }

  /* Now send the packet and sit back ... */

  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0){


#ifdef DEBUG
    fprintf(stderr, "Error sending negotiate protocol\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_SendFailed; /* Failed, check lower layer errno */
    return(SMBlibE_BAD);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, alloc_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to negotiate\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_RecvFailed; /* Failed, check lower layer errno */
    return(SMBlibE_BAD);

  }

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_Negotiate failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(SMBlibE_BAD);

  }
  
  if (SVAL(SMB_Hdr(pkt), SMB_negrCP_idx_offset) == 0xFFFF) {

#ifdef DEBUG
    fprintf(stderr, "None of our protocols was accepted ... ");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_NegNoProt;
    return(SMBlibE_BAD);

  }

  /* Now, unpack the info from the response, if any and evaluate the proto */
  /* selected. We must make sure it is one we like ...                     */

smb/smbval/.svn/text-base/smblib-util.c.svn-base  view on Meta::CPAN


    Con_Handle -> max_xmit = SVAL(SMB_Hdr(pkt), SMB_negrLM_mbs_offset);
    Con_Handle -> MaxMPX = SVAL(SMB_Hdr(pkt), SMB_negrLM_mmc_offset);
    Con_Handle -> MaxVC = SVAL(SMB_Hdr(pkt), SMB_negrLM_mnv_offset);
    Con_Handle -> Raw_Support = SVAL(SMB_Hdr(pkt), SMB_negrLM_rm_offset);
    Con_Handle -> SessionKey = IVAL(SMB_Hdr(pkt), SMB_negrLM_sk_offset);
    Con_Handle -> SvrTZ = SVAL(SMB_Hdr(pkt), SMB_negrLM_stz_offset);
    Con_Handle -> Encrypt_Key_Len = SVAL(SMB_Hdr(pkt), SMB_negrLM_ekl_offset);
    
    p = (SMB_Hdr(pkt) + SMB_negrLM_buf_offset);
    fprintf(stderr, "%d", (char *)(SMB_Hdr(pkt) + SMB_negrLM_buf_offset));
    memcpy(Con_Handle->Encrypt_Key, p, 8);

    p = (SMB_Hdr(pkt) + SMB_negrLM_buf_offset + Con_Handle -> Encrypt_Key_Len);

    strncpy(p, Con_Handle -> Svr_PDom, sizeof(Con_Handle -> Svr_PDom) - 1);

    break;

  case 17:        /* NT LM 0.12 and LN LM 1.0 */

smb/smbval/.svn/text-base/smblib-util.c.svn-base  view on Meta::CPAN

    memcpy(Con_Handle -> Encrypt_Key, p, 8);
    p = (SMB_Hdr(pkt) + SMB_negrNTLM_buf_offset + Con_Handle -> Encrypt_Key_Len);

    strncpy(p, Con_Handle -> Svr_PDom, sizeof(Con_Handle -> Svr_PDom) - 1);

    break;

  default:

#ifdef DEBUG
    fprintf(stderr, "Unknown NegProt response format ... Ignored\n");
    fprintf(stderr, "  wct = %i\n", CVAL(SMB_Hdr(pkt), SMB_hdr_wct_offset));
#endif

    break;
  }

#ifdef DEBUG
  fprintf(stderr, "Protocol selected is: %i:%s\n", prot, Prots[prot]);
#endif

  RFCNB_Free_Pkt(pkt);
  return(0);

}

/* Get our hostname */

void SMB_Get_My_Name(char *name, int len)

smb/smbval/.svn/text-base/smblib-util.c.svn-base  view on Meta::CPAN

{ 
  /* int loc; */

  if (gethostname(name, len) < 0) { /* Error getting name */

    strncpy(name, "unknown", len);

    /* Should check the error */

#ifdef DEBUG
    fprintf(stderr, "gethostname in SMB_Get_My_Name returned error:");
    perror("");
#endif

  }

  /* only keep the portion up to the first "." */


}

smb/smbval/.svn/text-base/smblib-util.c.svn-base  view on Meta::CPAN

{ struct RFCNB_Pkt *pkt;
  int param_len, i, pkt_len;
  char *p;
  SMB_Tree_Handle tree;

  /* Figure out how much space is needed for path, password, dev ... */

  if (path == NULL || password == NULL || device == NULL) {

#ifdef DEBUG
    fprintf(stderr, "Bad parameter passed to SMB_TreeConnect\n");
#endif

    SMBlib_errno = SMBlibE_BadParam;
    return(NULL);

  }

  /* The + 2 is because of the \0 and the marker ...                    */

  param_len = strlen(path) + 2 + strlen(password) + 2 + strlen(device) + 2;

smb/smbval/.svn/text-base/smblib-util.c.svn-base  view on Meta::CPAN

  strcpy(p + 1, password);
  p = p + strlen(password) + 2;
  *p = SMBasciiID;
  strcpy(p + 1, device);

  /* Now send the packet and sit back ... */

  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0){

#ifdef DEBUG
    fprintf(stderr, "Error sending TCon request\n");
#endif

    if (Tree_Handle == NULL)
      free(tree);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_SendFailed;
    return(NULL);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to TCon\n");
#endif

    if (Tree_Handle == NULL) 
      free(tree);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_RecvFailed;
    return(NULL);

  }

  /* Check out the response type ... */

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_TCon failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    if (Tree_Handle == NULL)
      free(tree);
    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(NULL);

  }

  tree -> tid = SVAL(SMB_Hdr(pkt), SMB_tconr_tid_offset);
  tree -> mbs = SVAL(SMB_Hdr(pkt), SMB_tconr_mbs_offset);

#ifdef DEBUG
  fprintf(stderr, "TConn succeeded, with TID=%i, Max Xmit=%i\n",
                 tree -> tid, tree -> mbs);
#endif

  /* Now link the Tree to the Server Structure ... */

  if (Con_Handle -> first_tree == NULL) {

    Con_Handle -> first_tree = tree;
    Con_Handle -> last_tree = tree;

smb/smbval/.svn/text-base/smblib-util.c.svn-base  view on Meta::CPAN

  *(SMB_Hdr(pkt) + SMB_hdr_wct_offset) = 0;

  SSVAL(SMB_Hdr(pkt), SMB_hdr_tid_offset, Tree_Handle -> tid);
  SSVAL(SMB_Hdr(pkt), SMB_tcon_bcc_offset, 0);

  /* Now send the packet and sit back ... */

  if (RFCNB_Send(Tree_Handle -> con -> Trans_Connect, pkt, pkt_len) < 0){

#ifdef DEBUG
    fprintf(stderr, "Error sending TDis request\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_SendFailed;
    return(SMBlibE_BAD);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Tree_Handle -> con -> Trans_Connect, pkt, pkt_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to TCon\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_RecvFailed;
    return(SMBlibE_BAD);

  }

  /* Check out the response type ... */

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_TDis failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(SMBlibE_BAD);

  }

  Tree_Handle -> tid = 0xFFFF;        /* Invalid TID */
  Tree_Handle -> mbs = 0;             /* Invalid     */

#ifdef DEBUG

  fprintf(stderr, "Tree disconnect successful ...\n");

#endif

  /* What about the tree handle ? */

  if (discard == TRUE) { /* Unlink it and free it ... */

    if (Tree_Handle -> next == NULL)
      Tree_Handle -> con -> first_tree = Tree_Handle -> prev;
    else

smb/smbval/.svn/text-base/smblib.c.svn-base  view on Meta::CPAN

int SMBlib_Set_Sock_NoDelay(SMB_Handle_Type Con_Handle, BOOL yn)

{


  if (RFCNB_Set_Sock_NoDelay(Con_Handle -> Trans_Connect, yn) < 0) {

#ifdef DEBUG
#endif

    fprintf(stderr, "Setting no-delay on TCP socket failed ...\n");

  }

  return(0);

}

/* SMB_Connect_Server: Connect to a server, but don't negotiate protocol */
/* or anything else ...                                                  */

smb/smbval/.svn/text-base/smblib.c.svn-base  view on Meta::CPAN

    p = p + strlen(Con_Handle -> LMType);
    *p = 0;

  }

  /* Now send it and get a response */

  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0){

#ifdef DEBUG
    fprintf(stderr, "Error sending SessSetupX request\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_SendFailed;
    return(SMBlibE_BAD);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to SessSetupAndX\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_RecvFailed;
    return(SMBlibE_BAD);

  }

  /* Check out the response type ... */

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_SessSetupAndX failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(SMBlibE_BAD);

  }

smb/smbval/.svn/text-base/smblib.c.svn-base  view on Meta::CPAN

  if (SVAL(SMB_Hdr(pkt), SMB_ssetpr_act_offset) & 0x1)
        {
        /* do we allow guest login? NO! */
        RFCNB_Free_Pkt(pkt);
        SMBlib_errno = SMBlibE_GuestOnly ;
        return(SMBlibE_BAD);                        
        }
                                                      

#ifdef DEBUG
  fprintf(stderr, "SessSetupAndX response. Action = %i\n", 
          SVAL(SMB_Hdr(pkt), SMB_ssetpr_act_offset));
#endif

  /* Now pick up the UID for future reference ... */

  Con_Handle -> uid = SVAL(SMB_Hdr(pkt), SMB_hdr_uid_offset);
  RFCNB_Free_Pkt(pkt);

  return(0);

smb/smbval/.svn/text-base/smblib.c.svn-base  view on Meta::CPAN

  SSVAL(SMB_Hdr(pkt), SMB_hdr_uid_offset, Con_Handle -> uid);
  *(SMB_Hdr(pkt) + SMB_hdr_wct_offset) = 13;
  *(SMB_Hdr(pkt) + SMB_hdr_axc_offset) = 0xFF;    /* No extra command */
  SSVAL(SMB_Hdr(pkt), SMB_hdr_axo_offset, 0);    
  
    
  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0)
    {
      
#ifdef DEBUG
	fprintf(stderr, "Error sending UlogOffX request\n");
#endif
	
	RFCNB_Free_Pkt(pkt);
	SMBlib_errno = SMBlibE_SendFailed;
	return(SMBlibE_BAD);
      }    

    if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0) 
      {
	
#ifdef DEBUG
	fprintf(stderr, "Error receiving response uLogoffAndX\n");
#endif
	
	RFCNB_Free_Pkt(pkt);
	SMBlib_errno = SMBlibE_RecvFailed;
	return(SMBlibE_BAD);
      }

    if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS)
      {  /* Process error */

#ifdef DEBUG
	fprintf(stderr, "SMB_UlogoffAndX failed with errorclass = %i, Error Code = %i\n",
		CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
		SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

	SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
	RFCNB_Free_Pkt(pkt);
	SMBlib_errno = SMBlibE_Remote;
	return(SMBlibE_BAD);
	
      }

smb/smbval/rfcnb-io.c  view on Meta::CPAN

#include <sys/uio.h>
#include <sys/signal.h>
#include <string.h>

int RFCNB_Timeout = 0;    /* Timeout in seconds ... */

void rfcnb_alarm(int sig)

{

  fprintf(stderr, "IO Timed out ...\n");

}

/* Set timeout value and setup signal handling */

int RFCNB_Set_Timeout(int seconds)

{
  int temp;
  /* If we are on a Bezerkeley system, use sigvec, else sigaction */

smb/smbval/rfcnb-io.c  view on Meta::CPAN

   in the buffer we allocated or were passed ...                         */

int RFCNB_Discard_Rest(struct RFCNB_Con *con, int len)

{ char temp[100];   /* Read into here */
  int rest, this_read, bytes_read;

  /* len is the amount we should read */

#ifdef RFCNB_DEBUG
  fprintf(stderr, "Discard_Rest called to discard: %i\n", len);
#endif

  rest = len;

  while (rest > 0) {

    this_read = (rest > sizeof(temp)?sizeof(temp):rest);

    bytes_read = read(con -> fd, temp, this_read);

smb/smbval/rfcnb-io.c  view on Meta::CPAN


    tot_sent += this_len;

    if (tot_sent == len) break;   /* Let's not send too much */

    pkt_ptr = pkt_ptr -> next;

  }

#ifdef RFCNB_DEBUG
  fprintf(stderr, "Frags = %i, tot_sent = %i\n", i, tot_sent);
#endif

  /* Set up an alarm if timeouts are set ... */

  if (RFCNB_Timeout > 0) 
    alarm(RFCNB_Timeout);

  if ((len_sent = writev(con -> fd, io_list, i)) < 0) { /* An error */

    con -> rfc_errno = errno;

smb/smbval/rfcnb-io.c  view on Meta::CPAN

      RFCNB_errno = RFCNBE_BadWrite;
    RFCNB_saved_errno = errno;
    return(RFCNBE_Bad);
  }

  if (RFCNB_Timeout > 0)
    alarm(0);                /* Reset that sucker */

#ifdef RFCNB_DEBUG

  fprintf(stderr, "Len sent = %i ...\n", len_sent);
  RFCNB_Print_Pkt(stderr, "sent", pkt, len_sent); /* Print what send ... */

#endif

  return(len_sent);

}

/* Read an RFCNB packet off the connection. 

   We read the first 4 bytes, that tells us the length, then read the

smb/smbval/rfcnb-io.c  view on Meta::CPAN

  char hdr[RFCNB_Pkt_Hdr_Len];      /* Local space for the header */
  struct RFCNB_Pkt *pkt_frag;
  int more, this_time, offset, frag_len, this_len;
  BOOL seen_keep_alive = TRUE;

  /* Read that header straight into the buffer */

  if (len < RFCNB_Pkt_Hdr_Len) { /* What a bozo */

#ifdef RFCNB_DEBUG
    fprintf(stderr, "Trying to read less than a packet:");
    perror("");
#endif
    RFCNB_errno = RFCNBE_BadParam;
    return(RFCNBE_Bad);

  }

  /* We discard keep alives here ... */

  if (RFCNB_Timeout > 0) 
    alarm(RFCNB_Timeout);

  while (seen_keep_alive) {

    if ((read_len = read(con -> fd, hdr, sizeof(hdr))) < 0) { /* Problems */
#ifdef RFCNB_DEBUG
      fprintf(stderr, "Reading the packet, we got:");
      perror("");
#endif
      if (errno == EINTR)
	RFCNB_errno = RFCNBE_Timeout;
      else
	RFCNB_errno = RFCNBE_BadRead;
      RFCNB_saved_errno = errno;
      return(RFCNBE_Bad);

    }

    /* Now we check out what we got */

    if (read_len == 0) { /* Connection closed, send back eof?  */

#ifdef RFCNB_DEBUG
      fprintf(stderr, "Connection closed reading\n");
#endif 

      if (errno == EINTR) 
	RFCNB_errno = RFCNBE_Timeout;
      else
	RFCNB_errno = RFCNBE_ConGone;
      RFCNB_saved_errno = errno;
      return(RFCNBE_Bad);

    }

    if (RFCNB_Pkt_Type(hdr) == RFCNB_SESSION_KEEP_ALIVE) {

#ifdef RFCNB_DEBUG
      fprintf(stderr, "RFCNB KEEP ALIVE received\n");
#endif
      
    }
    else {
      seen_keep_alive = FALSE;
    }

  }
 
  /* What if we got less than or equal to a hdr size in bytes? */

  if (read_len < sizeof(hdr)) { /* We got a small packet */

    /* Now we need to copy the hdr portion we got into the supplied packet */

    memcpy(pkt -> data, hdr, read_len);  /*Copy data */

#ifdef RFCNB_DEBUG
    RFCNB_Print_Pkt(stderr, "rcvd", pkt, read_len);
#endif

    return(read_len);

  }

  /* Now, if we got at least a hdr size, alloc space for rest, if we need it */

  pkt_len = RFCNB_Pkt_Len(hdr);

#ifdef RFCNB_DEBUG
  fprintf(stderr, "Reading Pkt: Length = %i\n", pkt_len);
#endif  

  /* Now copy in the hdr */

  memcpy(pkt -> data, hdr, sizeof(hdr));

  /* Get the rest of the packet ... first figure out how big our buf is? */
  /* And make sure that we handle the fragments properly ... Sure should */
  /* use an iovec ...                                                    */

smb/smbval/rfcnb-io.c  view on Meta::CPAN

	else
	  RFCNB_errno = RFCNBE_ConGone;
      }

      RFCNB_saved_errno = errno;
      return(RFCNBE_Bad);

    }

#ifdef RFCNB_DEBUG
    fprintf(stderr, "Frag_Len = %i, this_time = %i, this_len = %i, more = %i\n", frag_len,
                    this_time, this_len, more);
#endif

    read_len = read_len + this_time;  /* How much have we read ... */

    /* Now set up the next part */

    if (pkt_frag -> next == NULL) break;       /* That's it here */

    pkt_frag = pkt_frag -> next;
    this_len = pkt_frag -> len;
    offset = 0;

    more = more - this_time;

  }

#ifdef RFCNB_DEBUG
  fprintf(stderr,"Pkt Len = %i, read_len = %i\n", pkt_len, read_len);
  RFCNB_Print_Pkt(stderr, "rcvd", pkt, read_len + sizeof(hdr));
#endif

  if (read_len < (pkt_len + sizeof(hdr))) {  /* Discard the rest */

    return(RFCNB_Discard_Rest(con, (pkt_len + sizeof(hdr)) - read_len));

  }

  if (RFCNB_Timeout > 0)
    alarm(0);                /* Reset that sucker */

smb/smbval/rfcnb-util.c  view on Meta::CPAN


  /* this magic AA marks the calling name as workstation (gr) */
  sess_pkt[RFCNB_Pkt_Calling_Offset+30] = 'A' ;
  sess_pkt[RFCNB_Pkt_Calling_Offset+31] = 'A' ;
  
  
  /* Now send the packet */

#ifdef RFCNB_DEBUG

  fprintf(stderr, "Sending packet: ");
  
#endif

  if ((len = RFCNB_Put_Pkt(con, pkt, RFCNB_Pkt_Sess_Len)) < 0) {
    RFCNB_Free_Pkt(pkt);
    return(RFCNBE_Bad);       /* Should be able to write that lot ... */

    }

#ifdef RFCNB_DEBUG

  fprintf(stderr, "Getting packet.\n");

#endif

  res_pkt.data = resp;
  res_pkt.len  = sizeof(resp);
  res_pkt.next = NULL;

  if ((len = RFCNB_Get_Pkt(con, &res_pkt, sizeof(resp))) < 0) {
    RFCNB_Free_Pkt(pkt);
    return(RFCNBE_Bad);

smb/smbval/session.c  view on Meta::CPAN


  hdr = pkt -> data;

  /* Following crap is for portability across multiple UNIX machines */

  *(hdr + RFCNB_Pkt_Type_Offset)  = RFCNB_SESSION_MESSAGE;
  RFCNB_Put_Pkt_Len(hdr, Length);

#ifdef RFCNB_DEBUG

  fprintf(stderr, "Sending packet: ");
  
#endif

  if ((len = RFCNB_Put_Pkt(Con_Handle, pkt, Length + RFCNB_Pkt_Hdr_Len)) < 0) {

    /* No need to change RFCNB_errno as it was done by put_pkt ...     */

    return(RFCNBE_Bad);   /* Should be able to write that lot ... */
    
  }

smb/smbval/session.c  view on Meta::CPAN

    RFCNB_saved_errno = errno;
    return(RFCNBE_Bad);

  }

  pkt -> next = Data;  /* Plug in the data portion */

  if ((ret_len = RFCNB_Get_Pkt(con_Handle, pkt, Length + RFCNB_Pkt_Hdr_Len)) < 0) {

#ifdef RFCNB_DEBUG
    fprintf(stderr, "Bad packet return in RFCNB_Recv... \n");
#endif

    return(RFCNBE_Bad);

  }

  /* We should check that we go a message and not a keep alive */

  pkt -> next = NULL;

smb/smbval/smblib-util.c  view on Meta::CPAN

    p = p + strlen(Prots[i]) + 2; /* Adjust len of p for null plus dialectID */

  }

  /* Now send the packet and sit back ... */

  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0){


#ifdef DEBUG
    fprintf(stderr, "Error sending negotiate protocol\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_SendFailed; /* Failed, check lower layer errno */
    return(SMBlibE_BAD);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, alloc_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to negotiate\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_RecvFailed; /* Failed, check lower layer errno */
    return(SMBlibE_BAD);

  }

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_Negotiate failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(SMBlibE_BAD);

  }
  
  if (SVAL(SMB_Hdr(pkt), SMB_negrCP_idx_offset) == 0xFFFF) {

#ifdef DEBUG
    fprintf(stderr, "None of our protocols was accepted ... ");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_NegNoProt;
    return(SMBlibE_BAD);

  }

  /* Now, unpack the info from the response, if any and evaluate the proto */
  /* selected. We must make sure it is one we like ...                     */

smb/smbval/smblib-util.c  view on Meta::CPAN


    Con_Handle -> max_xmit = SVAL(SMB_Hdr(pkt), SMB_negrLM_mbs_offset);
    Con_Handle -> MaxMPX = SVAL(SMB_Hdr(pkt), SMB_negrLM_mmc_offset);
    Con_Handle -> MaxVC = SVAL(SMB_Hdr(pkt), SMB_negrLM_mnv_offset);
    Con_Handle -> Raw_Support = SVAL(SMB_Hdr(pkt), SMB_negrLM_rm_offset);
    Con_Handle -> SessionKey = IVAL(SMB_Hdr(pkt), SMB_negrLM_sk_offset);
    Con_Handle -> SvrTZ = SVAL(SMB_Hdr(pkt), SMB_negrLM_stz_offset);
    Con_Handle -> Encrypt_Key_Len = SVAL(SMB_Hdr(pkt), SMB_negrLM_ekl_offset);
    
    p = (SMB_Hdr(pkt) + SMB_negrLM_buf_offset);
    fprintf(stderr, "%d", (char *)(SMB_Hdr(pkt) + SMB_negrLM_buf_offset));
    memcpy(Con_Handle->Encrypt_Key, p, 8);

    p = (SMB_Hdr(pkt) + SMB_negrLM_buf_offset + Con_Handle -> Encrypt_Key_Len);

    strncpy(p, Con_Handle -> Svr_PDom, sizeof(Con_Handle -> Svr_PDom) - 1);

    break;

  case 17:        /* NT LM 0.12 and LN LM 1.0 */

smb/smbval/smblib-util.c  view on Meta::CPAN

    memcpy(Con_Handle -> Encrypt_Key, p, 8);
    p = (SMB_Hdr(pkt) + SMB_negrNTLM_buf_offset + Con_Handle -> Encrypt_Key_Len);

    strncpy(p, Con_Handle -> Svr_PDom, sizeof(Con_Handle -> Svr_PDom) - 1);

    break;

  default:

#ifdef DEBUG
    fprintf(stderr, "Unknown NegProt response format ... Ignored\n");
    fprintf(stderr, "  wct = %i\n", CVAL(SMB_Hdr(pkt), SMB_hdr_wct_offset));
#endif

    break;
  }

#ifdef DEBUG
  fprintf(stderr, "Protocol selected is: %i:%s\n", prot, Prots[prot]);
#endif

  RFCNB_Free_Pkt(pkt);
  return(0);

}

/* Get our hostname */

void SMB_Get_My_Name(char *name, int len)

smb/smbval/smblib-util.c  view on Meta::CPAN

{ 
  /* int loc; */

  if (gethostname(name, len) < 0) { /* Error getting name */

    strncpy(name, "unknown", len);

    /* Should check the error */

#ifdef DEBUG
    fprintf(stderr, "gethostname in SMB_Get_My_Name returned error:");
    perror("");
#endif

  }

  /* only keep the portion up to the first "." */


}

smb/smbval/smblib-util.c  view on Meta::CPAN

{ struct RFCNB_Pkt *pkt;
  int param_len, i, pkt_len;
  char *p;
  SMB_Tree_Handle tree;

  /* Figure out how much space is needed for path, password, dev ... */

  if (path == NULL || password == NULL || device == NULL) {

#ifdef DEBUG
    fprintf(stderr, "Bad parameter passed to SMB_TreeConnect\n");
#endif

    SMBlib_errno = SMBlibE_BadParam;
    return(NULL);

  }

  /* The + 2 is because of the \0 and the marker ...                    */

  param_len = strlen(path) + 2 + strlen(password) + 2 + strlen(device) + 2;

smb/smbval/smblib-util.c  view on Meta::CPAN

  strcpy(p + 1, password);
  p = p + strlen(password) + 2;
  *p = SMBasciiID;
  strcpy(p + 1, device);

  /* Now send the packet and sit back ... */

  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0){

#ifdef DEBUG
    fprintf(stderr, "Error sending TCon request\n");
#endif

    if (Tree_Handle == NULL)
      free(tree);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_SendFailed;
    return(NULL);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to TCon\n");
#endif

    if (Tree_Handle == NULL) 
      free(tree);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_RecvFailed;
    return(NULL);

  }

  /* Check out the response type ... */

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_TCon failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    if (Tree_Handle == NULL)
      free(tree);
    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(NULL);

  }

  tree -> tid = SVAL(SMB_Hdr(pkt), SMB_tconr_tid_offset);
  tree -> mbs = SVAL(SMB_Hdr(pkt), SMB_tconr_mbs_offset);

#ifdef DEBUG
  fprintf(stderr, "TConn succeeded, with TID=%i, Max Xmit=%i\n",
                 tree -> tid, tree -> mbs);
#endif

  /* Now link the Tree to the Server Structure ... */

  if (Con_Handle -> first_tree == NULL) {

    Con_Handle -> first_tree = tree;
    Con_Handle -> last_tree = tree;

smb/smbval/smblib-util.c  view on Meta::CPAN

  *(SMB_Hdr(pkt) + SMB_hdr_wct_offset) = 0;

  SSVAL(SMB_Hdr(pkt), SMB_hdr_tid_offset, Tree_Handle -> tid);
  SSVAL(SMB_Hdr(pkt), SMB_tcon_bcc_offset, 0);

  /* Now send the packet and sit back ... */

  if (RFCNB_Send(Tree_Handle -> con -> Trans_Connect, pkt, pkt_len) < 0){

#ifdef DEBUG
    fprintf(stderr, "Error sending TDis request\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_SendFailed;
    return(SMBlibE_BAD);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Tree_Handle -> con -> Trans_Connect, pkt, pkt_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to TCon\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_RecvFailed;
    return(SMBlibE_BAD);

  }

  /* Check out the response type ... */

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_TDis failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(SMBlibE_BAD);

  }

  Tree_Handle -> tid = 0xFFFF;        /* Invalid TID */
  Tree_Handle -> mbs = 0;             /* Invalid     */

#ifdef DEBUG

  fprintf(stderr, "Tree disconnect successful ...\n");

#endif

  /* What about the tree handle ? */

  if (discard == TRUE) { /* Unlink it and free it ... */

    if (Tree_Handle -> next == NULL)
      Tree_Handle -> con -> first_tree = Tree_Handle -> prev;
    else

smb/smbval/smblib.c  view on Meta::CPAN

int SMBlib_Set_Sock_NoDelay(SMB_Handle_Type Con_Handle, BOOL yn)

{


  if (RFCNB_Set_Sock_NoDelay(Con_Handle -> Trans_Connect, yn) < 0) {

#ifdef DEBUG
#endif

    fprintf(stderr, "Setting no-delay on TCP socket failed ...\n");

  }

  return(0);

}

/* SMB_Connect_Server: Connect to a server, but don't negotiate protocol */
/* or anything else ...                                                  */

smb/smbval/smblib.c  view on Meta::CPAN

    p = p + strlen(Con_Handle -> LMType);
    *p = 0;

  }

  /* Now send it and get a response */

  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0){

#ifdef DEBUG
    fprintf(stderr, "Error sending SessSetupX request\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_SendFailed;
    return(SMBlibE_BAD);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to SessSetupAndX\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_RecvFailed;
    return(SMBlibE_BAD);

  }

  /* Check out the response type ... */

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_SessSetupAndX failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(SMBlibE_BAD);

  }

smb/smbval/smblib.c  view on Meta::CPAN

  if (SVAL(SMB_Hdr(pkt), SMB_ssetpr_act_offset) & 0x1)
        {
        /* do we allow guest login? NO! */
        RFCNB_Free_Pkt(pkt);
        SMBlib_errno = SMBlibE_GuestOnly ;
        return(SMBlibE_BAD);                        
        }
                                                      

#ifdef DEBUG
  fprintf(stderr, "SessSetupAndX response. Action = %i\n", 
          SVAL(SMB_Hdr(pkt), SMB_ssetpr_act_offset));
#endif

  /* Now pick up the UID for future reference ... */

  Con_Handle -> uid = SVAL(SMB_Hdr(pkt), SMB_hdr_uid_offset);
  RFCNB_Free_Pkt(pkt);

  return(0);

smb/smbval/smblib.c  view on Meta::CPAN

  SSVAL(SMB_Hdr(pkt), SMB_hdr_uid_offset, Con_Handle -> uid);
  *(SMB_Hdr(pkt) + SMB_hdr_wct_offset) = 13;
  *(SMB_Hdr(pkt) + SMB_hdr_axc_offset) = 0xFF;    /* No extra command */
  SSVAL(SMB_Hdr(pkt), SMB_hdr_axo_offset, 0);    
  
    
  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0)
    {
      
#ifdef DEBUG
	fprintf(stderr, "Error sending UlogOffX request\n");
#endif
	
	RFCNB_Free_Pkt(pkt);
	SMBlib_errno = SMBlibE_SendFailed;
	return(SMBlibE_BAD);
      }    

    if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0) 
      {
	
#ifdef DEBUG
	fprintf(stderr, "Error receiving response uLogoffAndX\n");
#endif
	
	RFCNB_Free_Pkt(pkt);
	SMBlib_errno = SMBlibE_RecvFailed;
	return(SMBlibE_BAD);
      }

    if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS)
      {  /* Process error */

#ifdef DEBUG
	fprintf(stderr, "SMB_UlogoffAndX failed with errorclass = %i, Error Code = %i\n",
		CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
		SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

	SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
	RFCNB_Free_Pkt(pkt);
	SMBlib_errno = SMBlibE_Remote;
	return(SMBlibE_BAD);
	
      }



( run in 0.750 second using v1.01-cache-2.11-cpan-49f99fa48dc )