int main(int argc, char *argv[]) { int s = tcp_listen("0.0.0.0", 445); select_group_t *sg = select_group_create(); if(s < 0) return 0; select_group_add_socket(sg, s, SOCKET_TYPE_LISTEN, NULL); select_set_listen(sg, s, listener); /* We start by receiving a header. */ state = RECV_STATE_HEADER; while(1) { select_group_do_select(sg, 3, 0); } #if 0 /* Do 'session setup' */ length = smb_get_length(smb); data = safe_malloc(length); smb_get(smb, data, length); tcp_send(s, data, length); while(1) { select_group_do_select(sg, -1, -1); } select_group_destroy(sg); #endif return 0; }
/* * smb_receive * fs points to the correct segment */ static int smb_receive(struct smb_sb_info *server) { struct socket *socket = server_sock(server); unsigned char * packet = server->packet; int len, result; unsigned char peek_buf[4]; result = smb_get_length(socket, peek_buf); if (result < 0) goto out; len = result; /* * Some servers do not respect our max_xmit and send * larger packets. Try to allocate a new packet, * but don't free the old one unless we succeed. */ if (len + 4 > server->packet_size) { int new_len = smb_round_length(len + 4); result = -ENOMEM; packet = smb_vmalloc(new_len); if (packet == NULL) goto out; smb_vfree(server->packet); server->packet = packet; server->packet_size = new_len; } memcpy(packet, peek_buf, 4); result = smb_receive_raw(socket, packet + 4, len); if (result < 0) { #ifdef SMBFS_DEBUG_VERBOSE printk("smb_receive: receive error: %d\n", result); #endif goto out; } server->rcls = *(packet + smb_rcls); server->err = WVAL(packet, smb_err); #ifdef SMBFS_DEBUG_VERBOSE if (server->rcls != 0) printk("smb_receive: rcls=%d, err=%d\n", server->rcls, server->err); #endif out: return result; }