Apache2-AuthenNTLM

 view release on metacpan or  search on metacpan

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

    }

  return(fd);

}

/* handle the details of establishing the RFCNB session with remote 
   end 

*/

int RFCNB_Session_Req(struct RFCNB_Con *con, 
		      char *Called_Name, 
		      char *Calling_Name,
		      BOOL *redirect,
		      struct in_addr *Dest_IP,
		      int * port)

{ char *sess_pkt;

  /* Response packet should be no more than 9 bytes, make 16 jic */
/* 
  char ln1[16], ln2[16];
  char n1[32], n2[32]; */
  char resp[16];
  int len;
  struct RFCNB_Pkt *pkt, res_pkt;

  /* We build and send the session request, then read the response */

  pkt = RFCNB_Alloc_Pkt(RFCNB_Pkt_Sess_Len);

  if (pkt == NULL) {

    return(RFCNBE_Bad);  /* Leave the error that RFCNB_Alloc_Pkt gives) */

  }

  sess_pkt = pkt -> data;    /* Get pointer to packet proper */
  memset (sess_pkt, 0, RFCNB_Pkt_Sess_Len) ;
  


  sess_pkt[RFCNB_Pkt_Type_Offset]  = RFCNB_SESSION_REQUEST;
  RFCNB_Put_Pkt_Len(sess_pkt, (RFCNB_Pkt_Sess_Len-RFCNB_Pkt_Hdr_Len));
  sess_pkt[RFCNB_Pkt_N1Len_Offset] = 32;
  sess_pkt[RFCNB_Pkt_N2Len_Offset] = 32;

  RFCNB_CvtPad_Name(Called_Name, (sess_pkt + RFCNB_Pkt_Called_Offset));
  RFCNB_CvtPad_Name(Calling_Name, (sess_pkt + RFCNB_Pkt_Calling_Offset));

  /* 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);

  }

  /* Now analyze the packet ... */

  switch (RFCNB_Pkt_Type(resp)) {

    case RFCNB_SESSION_REJ:         /* Didnt like us ... too bad */

      /* Why did we get rejected ? */
    
      switch (CVAL(resp,RFCNB_Pkt_Error_Offset)) {

      case 0x80: 
	RFCNB_errno = RFCNBE_CallRejNLOCN;
	break;
      case 0x81:
	RFCNB_errno = RFCNBE_CallRejNLFCN;
	break;
      case 0x82:
	RFCNB_errno = RFCNBE_CallRejCNNP;
	break;
      case 0x83:
	RFCNB_errno = RFCNBE_CallRejInfRes;
	break;
      case 0x8F:
	RFCNB_errno = RFCNBE_CallRejUnSpec;
	break;
      default:
	RFCNB_errno = RFCNBE_ProtErr;
	break;
      }
      RFCNB_Free_Pkt(pkt);
      return(RFCNBE_Bad);
      break;

    case RFCNB_SESSION_ACK:        /* Got what we wanted ...      */
      RFCNB_Free_Pkt(pkt);
      return(0);
      break;

    case RFCNB_SESSION_RETARGET:   /* Go elsewhere                */

      *redirect = TRUE;       /* Copy port and ip addr       */

      memcpy(Dest_IP, (resp + RFCNB_Pkt_IP_Offset), sizeof(struct in_addr));
      *port = SVAL(resp, RFCNB_Pkt_Port_Offset);
      RFCNB_Free_Pkt(pkt);
      return(0);
      break;



( run in 1.379 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )