⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bnftp.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 2 页
字号:
    {        fprintf(stderr,"%s: could not determine screen size\n",argv[0]);        if (changed_in)            tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);        return STATUS_FAILURE;    }        if ((sd = psock_socket(PSOCK_PF_INET,PSOCK_SOCK_STREAM,PSOCK_IPPROTO_TCP))<0)    {	fprintf(stderr,"%s: could not create socket (psock_socket: %s)\n",argv[0],pstrerror(psock_errno()));	if (changed_in)	    tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);	return STATUS_FAILURE;    }        memset(&saddr,0,sizeof(saddr));    saddr.sin_family = PSOCK_AF_INET;    saddr.sin_port   = htons(servport);    memcpy(&saddr.sin_addr.s_addr,host->h_addr_list[0],host->h_length);    if (psock_connect(sd,(struct sockaddr *)&saddr,sizeof(saddr))<0)    {	fprintf(stderr,"%s: could not connect to server \"%s\" port %hu (psock_connect: %s)\n",argv[0],servname,servport,pstrerror(psock_errno()));	if (changed_in)	    tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);	return STATUS_FAILURE;    }        printf("Connected to %s:%hu.\n",inet_ntoa(saddr.sin_addr),servport);    #ifdef CLIENTDEBUG    eventlog_set(stderr);#endif        if (!(packet = packet_create(packet_class_init)))    {	fprintf(stderr,"%s: could not create packet\n",argv[0]);	if (changed_in)	    tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);	return STATUS_FAILURE;    }    bn_byte_set(&packet->u.client_initconn.class,CLIENT_INITCONN_CLASS_FILE);    if (hexstrm)    {	fprintf(hexstrm,"%d: send class=%s[0x%02hx] type=%s[0x%04hx] length=%u\n",		sd,		packet_get_class_str(packet),(unsigned int)packet_get_class(packet),		packet_get_type_str(packet,packet_dir_from_client),packet_get_type(packet),		packet_get_size(packet));	hexdump(hexstrm,packet_get_raw_data(packet,0),packet_get_size(packet));    }    client_blocksend_packet(sd,packet);    packet_del_ref(packet);        if (!(rpacket = packet_create(packet_class_file)))    {	fprintf(stderr,"%s: could not create packet\n",argv[0]);	if (changed_in)	    tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);	return STATUS_FAILURE;    }        if (!(fpacket = packet_create(packet_class_raw)))    {	fprintf(stderr,"%s: could not create packet\n",argv[0]);	if (changed_in)	    tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);	packet_del_ref(rpacket);	return STATUS_FAILURE;    }        if (!reqfile) /* if not specified on the command line then prompt for it */    {    	munged = 1;    	commpos = 0;    	text[0] = '\0';	    	for (;;)    	{	    switch (client_get_comm("filename: ",text,sizeof(text),&commpos,1,munged,screen_width))	    {	    case -1: /* cancel or error */	    	printf("\n");	    	if (changed_in)		    tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);	    	packet_del_ref(fpacket);	    	packet_del_ref(rpacket);	    	return STATUS_FAILURE;			    case 0: /* timeout */	    	munged = 0;	    	continue;			    case 1:	    	munged = 0;	    	if (text[0]=='\0')		    continue;	    	printf("\n");	    }	    break;    	}	reqfile = text;    }        if (stat(reqfile,&exist_buf)==0) /* check if the file exists */    {	char text2[MAX_MESSAGE_LEN];	        	munged = 1;	commpos = 0;	text2[0] = '\0';	  	while (exist_action==EXIST_ACTION_ASK)	{	    switch (client_get_comm("File exists [O]verwrite, [B]ackup or [R]esume?: ",text2,sizeof(text2),&commpos,1,munged,screen_width))	    {	    case -1: /* cancel or error */	    	printf("\n");	    	if (changed_in)		    tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);	    	packet_del_ref(fpacket);	    	packet_del_ref(rpacket);	    	return STATUS_FAILURE;			    case 0: /* timeout */	    	munged = 0;	    	continue;			    case 1:	    	munged = 0;	    	if (text2[0]=='\0')		    continue;	    	printf("\n");		break;	    }	    	    switch (text2[0])	    {	    case 'o':	    case 'O':		exist_action = EXIST_ACTION_OVERWRITE;		break;	    case 'b':	    case 'B':		exist_action = EXIST_ACTION_BACKUP;		break;	    case 'r':	    case 'R':		exist_action = EXIST_ACTION_RESUME;		break;	    default:		printf("Please answer with o,O,b,B,r or R.\n");		munged = 1;		continue;	    }	    break;	}		switch (exist_action)	{	case EXIST_ACTION_OVERWRITE:	    if (!startoffsetoverride)	    	startoffset = 0;	    break;	case EXIST_ACTION_BACKUP:	    {		char *       bakfile;		unsigned int bnr;		int          renamed=0;				bakfile = xmalloc(strlen(reqfile)+1+2+1); /* assuming we go up to bnr 99 we need reqfile+'.'+'99'+'\0' */		for (bnr=0; bnr<100; bnr++)		{		    sprintf(bakfile,"%s.%d",reqfile,bnr);		    if (stat(bakfile,&exist_buf)==0)			continue; /* backup exists */		    /* backup does not exist */		    if (rename(reqfile,bakfile)<0) /* just rename the existing file to the backup */			fprintf(stderr,"%s: could not create backup file \"%s\" (rename: %s)\n",argv[0],bakfile,pstrerror(errno));		    else		    {			renamed = 1;			printf("Renaming \"%s\" to \"%s\".\n",reqfile,bakfile);		    }		    break;		}		xfree(bakfile);		if (!renamed)		{		    fprintf(stderr,"%s: could not create backup for \"%s\".\n",argv[0],reqfile);		    if (changed_in)			tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);		    packet_del_ref(fpacket);		    packet_del_ref(rpacket);		    return STATUS_FAILURE;		}	    	if (!startoffsetoverride)	    	    startoffset = 0;	    }	    break;	case EXIST_ACTION_RESUME:	    if (!startoffsetoverride)	    	startoffset = exist_buf.st_size;	    break;	    		}	    }    else	if (!startoffsetoverride)	    startoffset = 0;        if (changed_in)	tcsetattr(fd_stdin,TCSAFLUSH,&in_attr_old);        if (!(packet = packet_create(packet_class_file)))    {	fprintf(stderr,"%s: could not create packet\n",argv[0]);	packet_del_ref(fpacket);	packet_del_ref(rpacket);	return STATUS_FAILURE;    }    if (newproto) {	/* first send ARCH/CTAG */	packet_set_size(packet, sizeof(t_client_file_req2));	packet_set_type(packet, CLIENT_FILE_REQ2);	bn_int_tag_set(&packet->u.client_file_req2.archtag,archtag);	bn_int_tag_set(&packet->u.client_file_req2.clienttag,clienttag);	bn_long_set_a_b(&packet->u.client_file_req2.unknown1,0,0);    } else {	packet_set_size(packet,sizeof(t_client_file_req));	packet_set_type(packet, CLIENT_FILE_REQ);	bn_int_tag_set(&packet->u.client_file_req.archtag,archtag);	bn_int_tag_set(&packet->u.client_file_req.clienttag,clienttag);	bn_int_set(&packet->u.client_file_req.adid,0);	bn_int_set(&packet->u.client_file_req.extensiontag,0);	bn_int_set(&packet->u.client_file_req.startoffset,startoffset);	bn_long_set_a_b(&packet->u.client_file_req.timestamp,0x00000000,0x00000000);	packet_append_string(packet,reqfile);    }    if (hexstrm)    {	fprintf(hexstrm,"%d: send class=%s[0x%02hx] type=%s[0x%04hx] length=%u\n",		sd,		packet_get_class_str(packet),(unsigned int)packet_get_class(packet),		packet_get_type_str(packet,packet_dir_from_client),packet_get_type(packet),		packet_get_size(packet));	hexdump(hexstrm,packet_get_raw_data(packet,0),packet_get_size(packet));    }    if (newproto) printf("\nSending ARCH/CTAG info...");    else printf("\nRequesting info...");    fflush(stdout);    client_blocksend_packet(sd,packet);    packet_del_ref(packet);        if (newproto) {	/* received the stupid 4 bytes unknown "packet" */	packet_set_size(fpacket, sizeof(t_server_file_unknown1));	if (client_blockrecv_packet(sd,fpacket)<0)	{	    fprintf(stderr,"%s: server closed connection\n",argv[0]);	    packet_del_ref(fpacket);	    packet_del_ref(rpacket);	    return STATUS_FAILURE;	}	if (hexstrm)	{	    fprintf(hexstrm,"%d: recv class=%s[0x%02hx] type=%s[0x%04hx] length=%u\n",		     sd,		     packet_get_class_str(fpacket),(unsigned int)packet_get_class(fpacket),		     packet_get_type_str(fpacket,packet_dir_from_server),packet_get_type(fpacket),		     packet_get_size(fpacket));	    hexdump(hexstrm,packet_get_raw_data(fpacket,0),packet_get_size(fpacket));	}	/* send file info request */	packet_set_size(fpacket, sizeof(t_client_file_req3));	bn_int_set(&fpacket->u.client_file_req3.unknown1, 0);	bn_long_set_a_b(&fpacket->u.client_file_req3.timestamp, 0, 0);	bn_long_set_a_b(&fpacket->u.client_file_req3.unknown2, 0, 0);	bn_long_set_a_b(&fpacket->u.client_file_req3.unknown3, 0, 0);	bn_long_set_a_b(&fpacket->u.client_file_req3.unknown4, 0, 0);	bn_long_set_a_b(&fpacket->u.client_file_req3.unknown5, 0, 0);	bn_long_set_a_b(&fpacket->u.client_file_req3.unknown6, 0, 0);	packet_append_string(fpacket, reqfile);	printf("\nRequesting info...");	fflush(stdout);	client_blocksend_packet(sd,fpacket);	if (hexstrm)	{	    fprintf(hexstrm,"%d: send class=%s[0x%02hx] type=%s[0x%04hx] length=%u\n",		    sd,		    packet_get_class_str(fpacket),(unsigned int)packet_get_class(fpacket),		    packet_get_type_str(fpacket,packet_dir_from_client),packet_get_type(fpacket),		    packet_get_size(fpacket));	    hexdump(hexstrm,packet_get_raw_data(fpacket,0),packet_get_size(fpacket));	}    }    do    {	if (client_blockrecv_packet(sd,rpacket)<0)	{	    fprintf(stderr,"%s: server closed connection\n",argv[0]);	    packet_del_ref(fpacket);	    packet_del_ref(rpacket);	    return STATUS_FAILURE;	}	if (hexstrm)	{	    fprintf(hexstrm,"%d: recv class=%s[0x%02hx] type=%s[0x%04hx] length=%u\n",		     sd,		     packet_get_class_str(rpacket),(unsigned int)packet_get_class(rpacket),		     packet_get_type_str(rpacket,packet_dir_from_server),packet_get_type(rpacket),		     packet_get_size(rpacket));	    hexdump(hexstrm,packet_get_raw_data(rpacket,0),packet_get_size(rpacket));	}    }    while (packet_get_type(rpacket)!=SERVER_FILE_REPLY);        filelen = bn_int_get(rpacket->u.server_file_reply.filelen);    bn_long_to_bnettime(rpacket->u.server_file_reply.timestamp,&bntime);    tm = bnettime_to_time(bntime);    strftime(timestr,FILE_TIME_MAXLEN,FILE_TIME_FORMAT,localtime(&tm));    filename = packet_get_str_const(rpacket,sizeof(t_server_file_reply),MAX_FILENAME_STR);        if (exist_action==EXIST_ACTION_RESUME)    {	if (!(fp = fopen(reqfile,"ab")))	{	    fprintf(stderr,"%s: could not open file \"%s\" for appending (fopen: %s)\n",argv[0],reqfile,pstrerror(errno));	    packet_del_ref(fpacket);	    packet_del_ref(rpacket);	    return STATUS_FAILURE;	}    }    else    {	if (!(fp = fopen(reqfile,"wb")))	{	    fprintf(stderr,"%s: could not open file \"%s\" for writing (fopen: %s)\n",argv[0],reqfile,pstrerror(errno));	    packet_del_ref(fpacket);	    packet_del_ref(rpacket);	    return STATUS_FAILURE;	}    }        printf("\n name: \"");    str_print_term(stdout,filename,0,0);    printf("\"\n changed: %s\n length: %u bytes\n",timestr,filelen);    fflush(stdout);        if (startoffset>0) {	filelen -= startoffset; /* for resuming files */	printf("Resuming at position %u (%u bytes remaining).\n",startoffset,filelen);    }        printf("\nSaving to \"%s\"...",reqfile);    for (currsize=0; currsize+MAX_PACKET_SIZE<=filelen; currsize+=MAX_PACKET_SIZE)    {	printf(".");	fflush(stdout);		if (client_blockrecv_raw_packet(sd,fpacket,MAX_PACKET_SIZE)<0)	{	    printf("error\n");	    fprintf(stderr,"%s: server closed connection\n",argv[0]);	    if (fclose(fp)<0)		fprintf(stderr,"%s: could not close file \"%s\" after writing (fclose: %s)\n",argv[0],reqfile,pstrerror(errno));	    packet_del_ref(fpacket);	    packet_del_ref(rpacket);	    return STATUS_FAILURE;	}	if (hexstrm)	{	    fprintf(hexstrm,"%d: recv class=%s[0x%02hx] type=%s[0x%04hx] length=%u\n",		     sd,		     packet_get_class_str(fpacket),(unsigned int)packet_get_class(fpacket),		     packet_get_type_str(fpacket,packet_dir_from_server),packet_get_type(fpacket),		     packet_get_size(fpacket));	    hexdump(hexstrm,packet_get_raw_data(fpacket,0),packet_get_size(fpacket));	}	if (fwrite(packet_get_raw_data_const(fpacket,0),1,MAX_PACKET_SIZE,fp)<MAX_PACKET_SIZE)	{	    printf("error\n");	    fprintf(stderr,"%s: could not write to file \"%s\" (fwrite: %s)\n",argv[0],reqfile,pstrerror(errno));	    if (fclose(fp)<0)		fprintf(stderr,"%s: could not close file \"%s\" after writing (fclose: %s)\n",argv[0],reqfile,pstrerror(errno));	    packet_del_ref(fpacket);	    packet_del_ref(rpacket);	    return STATUS_FAILURE;	}    }    filelen -= currsize;    if (filelen)    {	printf(".");	fflush(stdout);		if (client_blockrecv_raw_packet(sd,fpacket,filelen)<0)	{	    printf("error\n");	    fprintf(stderr,"%s: server closed connection\n",argv[0]);	    if (fclose(fp)<0)		fprintf(stderr,"%s: could not close file \"%s\" after writing (fclose: %s)\n",argv[0],reqfile,pstrerror(errno));	    packet_del_ref(fpacket);	    packet_del_ref(rpacket);	    return STATUS_FAILURE;	}	if (hexstrm)	{	    fprintf(hexstrm,"%d: recv class=%s[0x%02hx] type=%s[0x%04hx] length=%u\n",		     sd,		     packet_get_class_str(fpacket),(unsigned int)packet_get_class(fpacket),		     packet_get_type_str(fpacket,packet_dir_from_server),packet_get_type(fpacket),		     packet_get_size(fpacket));	    hexdump(hexstrm,packet_get_raw_data(fpacket,0),packet_get_size(fpacket));	}	if (fwrite(packet_get_raw_data_const(fpacket,0),1,filelen,fp)<filelen)	{	    printf("error\n");	    fprintf(stderr,"%s: could not write to file \"%s\"\n",argv[0],reqfile);	    if (fclose(fp)<0)		fprintf(stderr,"%s: could not close file \"%s\" after writing (fclose: %s)\n",argv[0],reqfile,pstrerror(errno));	    packet_del_ref(fpacket);	    packet_del_ref(rpacket);	    return STATUS_FAILURE;	}    }        packet_del_ref(fpacket);    packet_del_ref(rpacket);        if (hexstrm)    {	fprintf(hexstrm,"# end of dump\n");	if (fclose(hexstrm)<0)	    fprintf(stderr,"%s: could not close hexdump file \"%s\" after writing (fclose: %s)",argv[0],hexfile,pstrerror(errno));    }        if (fclose(fp)<0)    {	fprintf(stderr,"%s: could not close file \"%s\" after writing (fclose: %s)\n",argv[0],reqfile,pstrerror(errno));	return STATUS_FAILURE;    }        printf("done\n");    return STATUS_FAILURE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -