view release on metacpan or search on metacpan
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);
}