亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sftp-server.c

?? C++編寫
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * Copyright (c) 2000, 2001, 2002 Markus Friedl.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include "includes.h"RCSID("$OpenBSD: sftp-server.c,v 1.41 2003/03/26 04:02:51 deraadt Exp $");#include "buffer.h"#include "bufaux.h"#include "getput.h"#include "log.h"#include "xmalloc.h"#include "sftp.h"#include "sftp-common.h"/* helper */#define get_int64()			buffer_get_int64(&iqueue);#define get_int()			buffer_get_int(&iqueue);#define get_string(lenp)		buffer_get_string(&iqueue, lenp);#define TRACE				debug/* input and output queue */Buffer iqueue;Buffer oqueue;/* Version of client */int version;/* portable attibutes, etc. */typedef struct Stat Stat;struct Stat {	char *name;	char *long_name;	Attrib attrib;};static interrno_to_portable(int unixerrno){	int ret = 0;	switch (unixerrno) {	case 0:		ret = SSH2_FX_OK;		break;	case ENOENT:	case ENOTDIR:	case EBADF:	case ELOOP:		ret = SSH2_FX_NO_SUCH_FILE;		break;	case EPERM:	case EACCES:	case EFAULT:		ret = SSH2_FX_PERMISSION_DENIED;		break;	case ENAMETOOLONG:	case EINVAL:		ret = SSH2_FX_BAD_MESSAGE;		break;	default:		ret = SSH2_FX_FAILURE;		break;	}	return ret;}static intflags_from_portable(int pflags){	int flags = 0;	if ((pflags & SSH2_FXF_READ) &&	    (pflags & SSH2_FXF_WRITE)) {		flags = O_RDWR;	} else if (pflags & SSH2_FXF_READ) {		flags = O_RDONLY;	} else if (pflags & SSH2_FXF_WRITE) {		flags = O_WRONLY;	}	if (pflags & SSH2_FXF_CREAT)		flags |= O_CREAT;	if (pflags & SSH2_FXF_TRUNC)		flags |= O_TRUNC;	if (pflags & SSH2_FXF_EXCL)		flags |= O_EXCL;	return flags;}static Attrib *get_attrib(void){	return decode_attrib(&iqueue);}/* handle handles */typedef struct Handle Handle;struct Handle {	int use;	DIR *dirp;	int fd;	char *name;};enum {	HANDLE_UNUSED,	HANDLE_DIR,	HANDLE_FILE};Handle	handles[100];static voidhandle_init(void){	int i;	for (i = 0; i < sizeof(handles)/sizeof(Handle); i++)		handles[i].use = HANDLE_UNUSED;}static inthandle_new(int use, char *name, int fd, DIR *dirp){	int i;	for (i = 0; i < sizeof(handles)/sizeof(Handle); i++) {		if (handles[i].use == HANDLE_UNUSED) {			handles[i].use = use;			handles[i].dirp = dirp;			handles[i].fd = fd;			handles[i].name = xstrdup(name);			return i;		}	}	return -1;}static inthandle_is_ok(int i, int type){	return i >= 0 && i < sizeof(handles)/sizeof(Handle) &&	    handles[i].use == type;}static inthandle_to_string(int handle, char **stringp, int *hlenp){	if (stringp == NULL || hlenp == NULL)		return -1;	*stringp = xmalloc(sizeof(int32_t));	PUT_32BIT(*stringp, handle);	*hlenp = sizeof(int32_t);	return 0;}static inthandle_from_string(char *handle, u_int hlen){	int val;	if (hlen != sizeof(int32_t))		return -1;	val = GET_32BIT(handle);	if (handle_is_ok(val, HANDLE_FILE) ||	    handle_is_ok(val, HANDLE_DIR))		return val;	return -1;}static char *handle_to_name(int handle){	if (handle_is_ok(handle, HANDLE_DIR)||	    handle_is_ok(handle, HANDLE_FILE))		return handles[handle].name;	return NULL;}static DIR *handle_to_dir(int handle){	if (handle_is_ok(handle, HANDLE_DIR))		return handles[handle].dirp;	return NULL;}static inthandle_to_fd(int handle){	if (handle_is_ok(handle, HANDLE_FILE))		return handles[handle].fd;	return -1;}static inthandle_close(int handle){	int ret = -1;	if (handle_is_ok(handle, HANDLE_FILE)) {		ret = close(handles[handle].fd);		handles[handle].use = HANDLE_UNUSED;		xfree(handles[handle].name);	} else if (handle_is_ok(handle, HANDLE_DIR)) {		ret = closedir(handles[handle].dirp);		handles[handle].use = HANDLE_UNUSED;		xfree(handles[handle].name);	} else {		errno = ENOENT;	}	return ret;}static intget_handle(void){	char *handle;	int val = -1;	u_int hlen;	handle = get_string(&hlen);	if (hlen < 256)		val = handle_from_string(handle, hlen);	xfree(handle);	return val;}/* send replies */static voidsend_msg(Buffer *m){	int mlen = buffer_len(m);	buffer_put_int(&oqueue, mlen);	buffer_append(&oqueue, buffer_ptr(m), mlen);	buffer_consume(m, mlen);}static voidsend_status(u_int32_t id, u_int32_t error){	Buffer msg;	const char *status_messages[] = {		"Success",			/* SSH_FX_OK */		"End of file",			/* SSH_FX_EOF */		"No such file",			/* SSH_FX_NO_SUCH_FILE */		"Permission denied",		/* SSH_FX_PERMISSION_DENIED */		"Failure",			/* SSH_FX_FAILURE */		"Bad message",			/* SSH_FX_BAD_MESSAGE */		"No connection",		/* SSH_FX_NO_CONNECTION */		"Connection lost",		/* SSH_FX_CONNECTION_LOST */		"Operation unsupported",	/* SSH_FX_OP_UNSUPPORTED */		"Unknown error"			/* Others */	};	TRACE("sent status id %u error %u", id, error);	buffer_init(&msg);	buffer_put_char(&msg, SSH2_FXP_STATUS);	buffer_put_int(&msg, id);	buffer_put_int(&msg, error);	if (version >= 3) {		buffer_put_cstring(&msg,		    status_messages[MIN(error,SSH2_FX_MAX)]);		buffer_put_cstring(&msg, "");	}	send_msg(&msg);	buffer_free(&msg);}static voidsend_data_or_handle(char type, u_int32_t id, char *data, int dlen){	Buffer msg;	buffer_init(&msg);	buffer_put_char(&msg, type);	buffer_put_int(&msg, id);	buffer_put_string(&msg, data, dlen);	send_msg(&msg);	buffer_free(&msg);}static voidsend_data(u_int32_t id, char *data, int dlen){	TRACE("sent data id %u len %d", id, dlen);	send_data_or_handle(SSH2_FXP_DATA, id, data, dlen);}static voidsend_handle(u_int32_t id, int handle){	char *string;	int hlen;	handle_to_string(handle, &string, &hlen);	TRACE("sent handle id %u handle %d", id, handle);	send_data_or_handle(SSH2_FXP_HANDLE, id, string, hlen);	xfree(string);}static voidsend_names(u_int32_t id, int count, Stat *stats){	Buffer msg;	int i;	buffer_init(&msg);	buffer_put_char(&msg, SSH2_FXP_NAME);	buffer_put_int(&msg, id);	buffer_put_int(&msg, count);	TRACE("sent names id %u count %d", id, count);	for (i = 0; i < count; i++) {		buffer_put_cstring(&msg, stats[i].name);		buffer_put_cstring(&msg, stats[i].long_name);		encode_attrib(&msg, &stats[i].attrib);	}	send_msg(&msg);	buffer_free(&msg);}static voidsend_attrib(u_int32_t id, Attrib *a){	Buffer msg;	TRACE("sent attrib id %u have 0x%x", id, a->flags);	buffer_init(&msg);	buffer_put_char(&msg, SSH2_FXP_ATTRS);	buffer_put_int(&msg, id);	encode_attrib(&msg, a);	send_msg(&msg);	buffer_free(&msg);}/* parse incoming */static voidprocess_init(void){	Buffer msg;	version = get_int();	TRACE("client version %d", version);	buffer_init(&msg);	buffer_put_char(&msg, SSH2_FXP_VERSION);	buffer_put_int(&msg, SSH2_FILEXFER_VERSION);	send_msg(&msg);	buffer_free(&msg);}static voidprocess_open(void){	u_int32_t id, pflags;	Attrib *a;	char *name;	int handle, fd, flags, mode, status = SSH2_FX_FAILURE;	id = get_int();	name = get_string(NULL);	pflags = get_int();		/* portable flags */	a = get_attrib();	flags = flags_from_portable(pflags);	mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ? a->perm : 0666;	TRACE("open id %u name %s flags %d mode 0%o", id, name, pflags, mode);	fd = open(name, flags, mode);	if (fd < 0) {		status = errno_to_portable(errno);	} else {		handle = handle_new(HANDLE_FILE, name, fd, NULL);		if (handle < 0) {			close(fd);		} else {			send_handle(id, handle);			status = SSH2_FX_OK;		}	}	if (status != SSH2_FX_OK)		send_status(id, status);	xfree(name);}static voidprocess_close(void){	u_int32_t id;	int handle, ret, status = SSH2_FX_FAILURE;	id = get_int();	handle = get_handle();	TRACE("close id %u handle %d", id, handle);	ret = handle_close(handle);	status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;	send_status(id, status);}static voidprocess_read(void){	char buf[64*1024];	u_int32_t id, len;	int handle, fd, ret, status = SSH2_FX_FAILURE;	u_int64_t off;	id = get_int();	handle = get_handle();	off = get_int64();	len = get_int();	TRACE("read id %u handle %d off %llu len %d", id, handle,	    (unsigned long long)off, len);	if (len > sizeof buf) {		len = sizeof buf;		log("read change len %d", len);	}	fd = handle_to_fd(handle);	if (fd >= 0) {		if (lseek(fd, off, SEEK_SET) < 0) {			error("process_read: seek failed");			status = errno_to_portable(errno);		} else {			ret = read(fd, buf, len);			if (ret < 0) {				status = errno_to_portable(errno);			} else if (ret == 0) {				status = SSH2_FX_EOF;			} else {				send_data(id, buf, ret);				status = SSH2_FX_OK;			}		}	}	if (status != SSH2_FX_OK)		send_status(id, status);}static voidprocess_write(void){	u_int32_t id;	u_int64_t off;	u_int len;	int handle, fd, ret, status = SSH2_FX_FAILURE;	char *data;	id = get_int();	handle = get_handle();	off = get_int64();	data = get_string(&len);	TRACE("write id %u handle %d off %llu len %d", id, handle,	    (unsigned long long)off, len);	fd = handle_to_fd(handle);	if (fd >= 0) {		if (lseek(fd, off, SEEK_SET) < 0) {			status = errno_to_portable(errno);			error("process_write: seek failed");		} else {/* XXX ATOMICIO ? */			ret = write(fd, data, len);			if (ret == -1) {				error("process_write: write failed");				status = errno_to_portable(errno);			} else if (ret == len) {				status = SSH2_FX_OK;			} else {				log("nothing at all written");			}		}	}	send_status(id, status);	xfree(data);}static voidprocess_do_stat(int do_lstat){	Attrib a;	struct stat st;	u_int32_t id;	char *name;	int ret, status = SSH2_FX_FAILURE;	id = get_int();	name = get_string(NULL);	TRACE("%sstat id %u name %s", do_lstat ? "l" : "", id, name);	ret = do_lstat ? lstat(name, &st) : stat(name, &st);	if (ret < 0) {		status = errno_to_portable(errno);	} else {		stat_to_attrib(&st, &a);		send_attrib(id, &a);		status = SSH2_FX_OK;	}	if (status != SSH2_FX_OK)		send_status(id, status);	xfree(name);}static voidprocess_stat(void){	process_do_stat(0);}static voidprocess_lstat(void){	process_do_stat(1);}static voidprocess_fstat(void){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜免费欧美电影| 2023国产一二三区日本精品2022| 精品亚洲国产成人av制服丝袜| 中文字幕一区二区三区四区| 日韩一级成人av| 欧美日韩成人在线一区| 日本伦理一区二区| 不卡视频在线观看| 成人综合在线视频| 国产九色精品成人porny| 国产午夜精品一区二区三区四区| 日韩一级精品视频在线观看| 欧美日韩一级大片网址| 97久久久精品综合88久久| 国产精品一线二线三线| 久久精品国产亚洲高清剧情介绍 | 成人免费看的视频| 久久成人免费电影| 精品综合久久久久久8888| 狠狠色丁香九九婷婷综合五月| 蜜臀av国产精品久久久久| 蜜桃视频在线一区| 国产精品一二三| www.综合网.com| 91麻豆高清视频| 色成人在线视频| 色综合久久88色综合天天6| 91黄视频在线| 欧美日韩aaa| 欧美一区二区三区小说| 欧美大度的电影原声| 日韩欧美一级二级| 欧美丝袜丝交足nylons| 日韩无一区二区| 国产欧美一区在线| 日韩美女久久久| 一区二区成人在线观看| 日本美女一区二区| 国产.欧美.日韩| 在线一区二区视频| 在线播放视频一区| 久久久亚洲精华液精华液精华液| 久久久电影一区二区三区| 国产精品久久久久永久免费观看| 亚洲精品成a人| 精品国产sm最大网站免费看| 亚洲色图视频免费播放| 婷婷成人综合网| 成人黄色小视频| 欧美伊人久久久久久久久影院| 日韩一级成人av| 国产精品久久久久7777按摩| 欧美aaaaa成人免费观看视频| 国产不卡在线视频| 欧美日韩在线免费视频| 久久久久高清精品| 一区二区三区四区在线免费观看| 国产欧美va欧美不卡在线| 亚洲午夜久久久久中文字幕久| 久久99久久99精品免视看婷婷| 色天天综合色天天久久| 精品少妇一区二区三区| 亚洲欧美日韩成人高清在线一区| 首页综合国产亚洲丝袜| 高清不卡一二三区| 日韩一区二区视频| 天堂资源在线中文精品| 91美女蜜桃在线| 中文字幕一区二区三区不卡 | 久久久久久久久蜜桃| 亚洲成av人影院在线观看网| 99视频一区二区| 国产精品美女一区二区在线观看| 美女一区二区三区| 日韩一区二区精品在线观看| 日韩影院免费视频| 7777精品伊人久久久大香线蕉的| 亚洲成人动漫精品| 制服丝袜亚洲播放| 亚洲午夜激情av| 91精品国产色综合久久久蜜香臀| 香蕉乱码成人久久天堂爱免费| 欧美理论电影在线| 日韩电影在线免费看| 欧美mv和日韩mv的网站| 国产精品一线二线三线| 国产精品色在线观看| 成人福利电影精品一区二区在线观看 | wwwwww.欧美系列| 国产99精品国产| 亚洲卡通动漫在线| 91精品国产综合久久久久久漫画 | 日韩美女天天操| 经典一区二区三区| 国产精品丝袜在线| 在线一区二区视频| 美日韩一区二区| 久久午夜色播影院免费高清| 国产成人啪免费观看软件| 自拍偷拍亚洲综合| 在线播放欧美女士性生活| 蜜桃精品视频在线| 中文字幕精品在线不卡| 91天堂素人约啪| 天使萌一区二区三区免费观看| 精品国产乱子伦一区| 91在线一区二区| 日韩国产欧美三级| 国产精品私人自拍| 7777精品伊人久久久大香线蕉完整版 | eeuss影院一区二区三区| 亚洲美女视频在线观看| 欧美岛国在线观看| 91搞黄在线观看| 国产精品综合视频| 亚洲成av人片在www色猫咪| 国产三级精品三级| 欧美另类变人与禽xxxxx| 成人ar影院免费观看视频| 免费三级欧美电影| 亚洲欧美一区二区三区孕妇| 精品成人一区二区三区| 欧美午夜电影网| 99久久久久久99| 国产在线国偷精品产拍免费yy| 亚洲精品伦理在线| 国产欧美在线观看一区| 精品嫩草影院久久| 欧美精品一级二级| 色播五月激情综合网| 国产99久久精品| 国产在线精品一区二区夜色| 亚洲成人在线免费| 亚洲欧美日韩一区二区 | 精品国产污网站| 欧美绝品在线观看成人午夜影视| youjizz久久| 国产91精品一区二区麻豆亚洲| 日本成人在线网站| 亚洲福中文字幕伊人影院| 国产精品毛片久久久久久| 337p粉嫩大胆噜噜噜噜噜91av| 欧美日本一区二区| 欧美在线影院一区二区| 99久久久无码国产精品| heyzo一本久久综合| 丁香啪啪综合成人亚洲小说| 国产一二精品视频| 国产中文一区二区三区| 精一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 精品无码三级在线观看视频| 久久99国产乱子伦精品免费| 玖玖九九国产精品| 久久99精品久久久久久国产越南| 精品影院一区二区久久久| 国产一区二区三区四区五区美女 | 国产欧美精品一区二区色综合朱莉| 久久综合久色欧美综合狠狠| 精品久久久久久久久久久久包黑料 | 日韩精品成人一区二区在线| 视频一区免费在线观看| 日韩av中文在线观看| 蜜桃精品视频在线观看| 国模一区二区三区白浆| 国产成人在线观看| 97超碰欧美中文字幕| 色视频欧美一区二区三区| 欧美亚洲高清一区二区三区不卡| 欧美在线免费视屏| 欧美日韩免费观看一区三区| 欧美人狂配大交3d怪物一区| 日韩欧美国产一区在线观看| 亚洲精品一线二线三线 | 99精品视频一区| 欧美精品九九99久久| 欧美xfplay| 日韩一区中文字幕| 日韩国产欧美在线观看| 国产成人av一区二区三区在线| 成人av网站在线观看| 欧美无砖专区一中文字| 欧美电影免费观看高清完整版 | 亚洲福利国产精品| 国产在线日韩欧美| 日本久久电影网| 欧美videofree性高清杂交| 久久久99精品免费观看不卡| 亚洲美女免费在线| 蜜臂av日日欢夜夜爽一区| av欧美精品.com| 欧美一区二区美女| 中文字幕亚洲一区二区av在线| 亚洲不卡一区二区三区| 国产精品亚洲成人| 欧美这里有精品| 欧美国产日本视频| 精品一区二区三区蜜桃| 成人国产精品免费观看视频| 777色狠狠一区二区三区|