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

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

?? disk.c

?? LInux 下的遠程桌面工具 Rdesktop
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* -*- c-basic-offset: 8 -*-   rdesktop: A Remote Desktop Protocol client.   Disk Redirection   Copyright (C) Jeroen Meijer 2003-2007   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "disk.h"#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>		/* open, close */#include <dirent.h>		/* opendir, closedir, readdir */#include <fnmatch.h>#include <errno.h>		/* errno */#include <stdio.h>#include <utime.h>#include <time.h>		/* ctime */#if (defined(HAVE_DIRFD) || (HAVE_DECL_DIRFD == 1))#define DIRFD(a) (dirfd(a))#else#define DIRFD(a) ((a)->DIR_FD_MEMBER_NAME)#endif/* TODO: Fix mntent-handling for solaris * #include <sys/mntent.h> */#if (defined(HAVE_MNTENT_H) && defined(HAVE_SETMNTENT))#include <mntent.h>#define MNTENT_PATH "/etc/mtab"#define USE_SETMNTENT#endif#ifdef HAVE_SYS_VFS_H#include <sys/vfs.h>#endif#ifdef HAVE_SYS_STATVFS_H#include <sys/statvfs.h>#endif#ifdef HAVE_SYS_STATFS_H#include <sys/statfs.h>#endif#ifdef HAVE_SYS_PARAM_H#include <sys/param.h>#endif#ifdef HAVE_SYS_MOUNT_H#include <sys/mount.h>#endif#include "rdesktop.h"#ifdef STAT_STATFS3_OSF1#define STATFS_FN(path, buf) (statfs(path,buf,sizeof(buf)))#define STATFS_T statfs#define USE_STATFS#endif#ifdef STAT_STATVFS#define STATFS_FN(path, buf) (statvfs(path,buf))#define STATFS_T statvfs#define USE_STATVFS#endif#ifdef STAT_STATVFS64#define STATFS_FN(path, buf) (statvfs64(path,buf))#define STATFS_T statvfs64#define USE_STATVFS#endif#if (defined(STAT_STATFS2_FS_DATA) || defined(STAT_STATFS2_BSIZE) || defined(STAT_STATFS2_FSIZE))#define STATFS_FN(path, buf) (statfs(path,buf))#define STATFS_T statfs#define USE_STATFS#endif#ifdef STAT_STATFS4#define STATFS_FN(path, buf) (statfs(path,buf,sizeof(buf),0))#define STATFS_T statfs#define USE_STATFS#endif#if ((defined(USE_STATFS) && defined(HAVE_STRUCT_STATFS_F_NAMEMAX)) || (defined(USE_STATVFS) && defined(HAVE_STRUCT_STATVFS_F_NAMEMAX)))#define F_NAMELEN(buf) ((buf).f_namemax)#endif#if ((defined(USE_STATFS) && defined(HAVE_STRUCT_STATFS_F_NAMELEN)) || (defined(USE_STATVFS) && defined(HAVE_STRUCT_STATVFS_F_NAMELEN)))#define F_NAMELEN(buf) ((buf).f_namelen)#endif#ifndef F_NAMELEN#define F_NAMELEN(buf) (255)#endif/* Dummy statfs fallback */#ifndef STATFS_Tstruct dummy_statfs_t{	long f_bfree;	long f_bsize;	long f_blocks;	int f_namelen;	int f_namemax;};static intdummy_statfs(struct dummy_statfs_t *buf){	buf->f_blocks = 262144;	buf->f_bfree = 131072;	buf->f_bsize = 512;	buf->f_namelen = 255;	buf->f_namemax = 255;	return 0;}#define STATFS_T dummy_statfs_t#define STATFS_FN(path,buf) (dummy_statfs(buf))#endifextern RDPDR_DEVICE g_rdpdr_device[];FILEINFO g_fileinfo[MAX_OPEN_FILES];RD_BOOL g_notify_stamp = False;typedef struct{	char name[PATH_MAX];	char label[PATH_MAX];	unsigned long serial;	char type[PATH_MAX];} FsInfoType;static RD_NTSTATUS NotifyInfo(RD_NTHANDLE handle, uint32 info_class, NOTIFY * p);static time_tget_create_time(struct stat *filestat){	time_t ret, ret1;	ret = MIN(filestat->st_ctime, filestat->st_mtime);	ret1 = MIN(ret, filestat->st_atime);	if (ret1 != (time_t) 0)		return ret1;	return ret;}/* Convert seconds since 1970 to a filetime */static voidseconds_since_1970_to_filetime(time_t seconds, uint32 * high, uint32 * low){	unsigned long long ticks;	ticks = (seconds + 11644473600LL) * 10000000;	*low = (uint32) ticks;	*high = (uint32) (ticks >> 32);}/* Convert seconds since 1970 back to filetime */static time_tconvert_1970_to_filetime(uint32 high, uint32 low){	unsigned long long ticks;	time_t val;	ticks = low + (((unsigned long long) high) << 32);	ticks /= 10000000;	ticks -= 11644473600LL;	val = (time_t) ticks;	return (val);}/* A wrapper for ftruncate which supports growing files, even if the   native ftruncate doesn't. This is needed on Linux FAT filesystems,   for example. */static intftruncate_growable(int fd, off_t length){	int ret;	off_t pos;	static const char zero = 0;	/* Try the simple method first */	if ((ret = ftruncate(fd, length)) != -1)	{		return ret;	}	/*	 * Some kind of error. Perhaps we were trying to grow. Retry	 * in a safe way.	 */	/* Get current position */	if ((pos = lseek(fd, 0, SEEK_CUR)) == -1)	{		perror("lseek");		return -1;	}	/* Seek to new size */	if (lseek(fd, length, SEEK_SET) == -1)	{		perror("lseek");		return -1;	}	/* Write a zero */	if (write(fd, &zero, 1) == -1)	{		perror("write");		return -1;	}	/* Truncate. This shouldn't fail. */	if (ftruncate(fd, length) == -1)	{		perror("ftruncate");		return -1;	}	/* Restore position */	if (lseek(fd, pos, SEEK_SET) == -1)	{		perror("lseek");		return -1;	}	return 0;}/* Just like open(2), but if a open with O_EXCL fails, retry with   GUARDED semantics. This might be necessary because some filesystems   (such as NFS filesystems mounted from a unfsd server) doesn't   support O_EXCL. GUARDED semantics are subject to race conditions,   but we can live with that.*/static intopen_weak_exclusive(const char *pathname, int flags, mode_t mode){	int ret;	struct stat filestat;	ret = open(pathname, flags, mode);	if (ret != -1 || !(flags & O_EXCL))	{		/* Success, or not using O_EXCL */		return ret;	}	/* An error occured, and we are using O_EXCL. In case the FS	   doesn't support O_EXCL, some kind of error will be	   returned. Unfortunately, we don't know which one. Linux	   2.6.8 seems to return 524, but I cannot find a documented	   #define for this case. So, we'll return only on errors that	   we know aren't related to O_EXCL. */	switch (errno)	{		case EACCES:		case EEXIST:		case EINTR:		case EISDIR:		case ELOOP:		case ENAMETOOLONG:		case ENOENT:		case ENOTDIR:			return ret;	}	/* Retry with GUARDED semantics */	if (stat(pathname, &filestat) != -1)	{		/* File exists */		errno = EEXIST;		return -1;	}	else	{		return open(pathname, flags & ~O_EXCL, mode);	}}/* Enumeration of devices from rdesktop.c        *//* returns numer of units found and initialized. *//* optarg looks like ':h=/mnt/floppy,b=/mnt/usbdevice1' *//* when it arrives to this function.             */intdisk_enum_devices(uint32 * id, char *optarg){	char *pos = optarg;	char *pos2;	int count = 0;	/* skip the first colon */	optarg++;	while ((pos = next_arg(optarg, ',')) && *id < RDPDR_MAX_DEVICES)	{		pos2 = next_arg(optarg, '=');		strncpy(g_rdpdr_device[*id].name, optarg, sizeof(g_rdpdr_device[*id].name) - 1);		if (strlen(optarg) > (sizeof(g_rdpdr_device[*id].name) - 1))			fprintf(stderr, "share name %s truncated to %s\n", optarg,				g_rdpdr_device[*id].name);		g_rdpdr_device[*id].local_path = (char *) xmalloc(strlen(pos2) + 1);		strcpy(g_rdpdr_device[*id].local_path, pos2);		g_rdpdr_device[*id].device_type = DEVICE_TYPE_DISK;		count++;		(*id)++;		optarg = pos;	}	return count;}/* Opens or creates a file or directory */static RD_NTSTATUSdisk_create(uint32 device_id, uint32 accessmask, uint32 sharemode, uint32 create_disposition,	    uint32 flags_and_attributes, char *filename, RD_NTHANDLE * phandle){	RD_NTHANDLE handle;	DIR *dirp;	int flags, mode;	char path[PATH_MAX];	struct stat filestat;	handle = 0;	dirp = NULL;	flags = 0;	mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;	if (*filename && filename[strlen(filename) - 1] == '/')		filename[strlen(filename) - 1] = 0;	sprintf(path, "%s%s", g_rdpdr_device[device_id].local_path, filename);	switch (create_disposition)	{		case CREATE_ALWAYS:			/* Delete existing file/link. */			unlink(path);			flags |= O_CREAT;			break;		case CREATE_NEW:			/* If the file already exists, then fail. */			flags |= O_CREAT | O_EXCL;			break;		case OPEN_ALWAYS:			/* Create if not already exists. */			flags |= O_CREAT;			break;		case OPEN_EXISTING:			/* Default behaviour */			break;		case TRUNCATE_EXISTING:			/* If the file does not exist, then fail. */			flags |= O_TRUNC;			break;	}	/*printf("Open: \"%s\"  flags: %X, accessmask: %X sharemode: %X create disp: %X\n", path, flags_and_attributes, accessmask, sharemode, create_disposition); */	/* Get information about file and set that flag ourselfs */	if ((stat(path, &filestat) == 0) && (S_ISDIR(filestat.st_mode)))	{		if (flags_and_attributes & FILE_NON_DIRECTORY_FILE)			return RD_STATUS_FILE_IS_A_DIRECTORY;		else			flags_and_attributes |= FILE_DIRECTORY_FILE;	}	if (flags_and_attributes & FILE_DIRECTORY_FILE)	{		if (flags & O_CREAT)		{			mkdir(path, mode);		}		dirp = opendir(path);		if (!dirp)		{			switch (errno)			{				case EACCES:					return RD_STATUS_ACCESS_DENIED;				case ENOENT:					return RD_STATUS_NO_SUCH_FILE;				default:					perror("opendir");					return RD_STATUS_NO_SUCH_FILE;			}		}		handle = DIRFD(dirp);	}	else	{		if (accessmask & GENERIC_ALL		    || (accessmask & GENERIC_READ && accessmask & GENERIC_WRITE))		{			flags |= O_RDWR;		}		else if ((accessmask & GENERIC_WRITE) && !(accessmask & GENERIC_READ))		{			flags |= O_WRONLY;		}		else		{			flags |= O_RDONLY;		}		handle = open_weak_exclusive(path, flags, mode);		if (handle == -1)		{			switch (errno)			{				case EISDIR:					return RD_STATUS_FILE_IS_A_DIRECTORY;				case EACCES:					return RD_STATUS_ACCESS_DENIED;				case ENOENT:					return RD_STATUS_NO_SUCH_FILE;				case EEXIST:					return RD_STATUS_OBJECT_NAME_COLLISION;				default:					perror("open");					return RD_STATUS_NO_SUCH_FILE;			}		}		/* all read and writes of files should be non blocking */		if (fcntl(handle, F_SETFL, O_NONBLOCK) == -1)			perror("fcntl");	}	if (handle >= MAX_OPEN_FILES)	{		error("Maximum number of open files (%s) reached. Increase MAX_OPEN_FILES!\n",		      handle);		exit(1);	}	if (dirp)		g_fileinfo[handle].pdir = dirp;	else		g_fileinfo[handle].pdir = NULL;	g_fileinfo[handle].device_id = device_id;	g_fileinfo[handle].flags_and_attributes = flags_and_attributes;	g_fileinfo[handle].accessmask = accessmask;	strncpy(g_fileinfo[handle].path, path, PATH_MAX - 1);	g_fileinfo[handle].delete_on_close = False;	if (accessmask & GENERIC_ALL || accessmask & GENERIC_WRITE)		g_notify_stamp = True;	*phandle = handle;	return RD_STATUS_SUCCESS;}static RD_NTSTATUSdisk_close(RD_NTHANDLE handle){	struct fileinfo *pfinfo;	pfinfo = &(g_fileinfo[handle]);	if (pfinfo->accessmask & GENERIC_ALL || pfinfo->accessmask & GENERIC_WRITE)		g_notify_stamp = True;	rdpdr_abort_io(handle, 0, RD_STATUS_CANCELLED);	if (pfinfo->pdir)	{		if (closedir(pfinfo->pdir) < 0)		{			perror("closedir");			return RD_STATUS_INVALID_HANDLE;		}		if (pfinfo->delete_on_close)			if (rmdir(pfinfo->path) < 0)			{				perror(pfinfo->path);				return RD_STATUS_ACCESS_DENIED;			}		pfinfo->delete_on_close = False;	}	else	{		if (close(handle) < 0)		{			perror("close");			return RD_STATUS_INVALID_HANDLE;		}		if (pfinfo->delete_on_close)			if (unlink(pfinfo->path) < 0)			{				perror(pfinfo->path);				return RD_STATUS_ACCESS_DENIED;			}		pfinfo->delete_on_close = False;	}	return RD_STATUS_SUCCESS;}static RD_NTSTATUSdisk_read(RD_NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result){	int n;#if 0	/* browsing dir ????        */	/* each request is 24 bytes */	if (g_fileinfo[handle].flags_and_attributes & FILE_DIRECTORY_FILE)	{		*result = 0;		return STATUS_SUCCESS;	}#endif	lseek(handle, offset, SEEK_SET);	n = read(handle, data, length);	if (n < 0)	{		*result = 0;		switch (errno)		{			case EISDIR:				/* Implement 24 Byte directory read ??				   with STATUS_NOT_IMPLEMENTED server doesn't read again */				/* return STATUS_FILE_IS_A_DIRECTORY; */				return RD_STATUS_NOT_IMPLEMENTED;			default:				perror("read");				return RD_STATUS_INVALID_PARAMETER;		}	}	*result = n;	return RD_STATUS_SUCCESS;}static RD_NTSTATUSdisk_write(RD_NTHANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result){	int n;	lseek(handle, offset, SEEK_SET);	n = write(handle, data, length);	if (n < 0)	{		perror("write");		*result = 0;		switch (errno)		{			case ENOSPC:				return RD_STATUS_DISK_FULL;			default:				return RD_STATUS_ACCESS_DENIED;		}	}	*result = n;	return RD_STATUS_SUCCESS;}RD_NTSTATUSdisk_query_information(RD_NTHANDLE handle, uint32 info_class, STREAM out){	uint32 file_attributes, ft_high, ft_low;	struct stat filestat;	char *path, *filename;	path = g_fileinfo[handle].path;	/* Get information about file */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
jiyouzz国产精品久久| 精品国产精品网麻豆系列| 777亚洲妇女| 日韩一区日韩二区| 久久精品久久99精品久久| 91影院在线观看| 久久久久99精品一区| 亚洲国产婷婷综合在线精品| 成人一区二区视频| 久久综合五月天婷婷伊人| 亚洲a一区二区| 在线观看亚洲专区| 国产精品少妇自拍| 国产精品正在播放| 欧美一卡在线观看| 日韩经典一区二区| 欧美最新大片在线看| 国产精品视频一区二区三区不卡| 国内精品国产成人国产三级粉色 | 国产成人av电影在线| 欧美精品三级在线观看| 有坂深雪av一区二区精品| 99久久免费精品| 中文字幕成人av| 国产精品77777| 精品国产91亚洲一区二区三区婷婷| 午夜精品一区二区三区电影天堂| 91免费在线播放| 亚洲欧美日韩国产手机在线 | 欧美日韩精品一区二区三区四区 | 国产福利精品一区| 久久精品在线观看| 国产精品18久久久久久久久久久久 | 日韩色在线观看| 亚洲欧美日韩久久| 99国内精品久久| 亚洲人成在线观看一区二区| 色视频欧美一区二区三区| 亚洲免费av网站| 一本到不卡精品视频在线观看| 国产精品青草综合久久久久99| 国产aⅴ精品一区二区三区色成熟| 国产亚洲婷婷免费| gogo大胆日本视频一区| 亚洲天堂福利av| 色av一区二区| 日韩av一级电影| 久久久精品一品道一区| 97精品视频在线观看自产线路二| 亚洲欧美乱综合| 欧美视频一区二区三区四区| 日本美女一区二区三区视频| 26uuu另类欧美亚洲曰本| 国产东北露脸精品视频| 亚洲欧洲中文日韩久久av乱码| 色一情一乱一乱一91av| 美女一区二区三区在线观看| 国产女人aaa级久久久级| 在线一区二区三区做爰视频网站| 奇米色一区二区三区四区| 久久久综合网站| 91久久精品一区二区二区| 人人爽香蕉精品| 中文字幕一区二区三区乱码在线 | 午夜精品一区二区三区三上悠亚 | 亚洲国产精品久久一线不卡| 日韩一二三区视频| 成人一区二区三区| 亚洲1区2区3区视频| 久久久www成人免费毛片麻豆| 一本高清dvd不卡在线观看| 日韩激情一区二区| 成人免费一区二区三区在线观看| 欧美三日本三级三级在线播放| 蜜臀国产一区二区三区在线播放| 国产精品国产三级国产普通话三级 | 亚洲一区在线观看免费| 日韩精品最新网址| 日本道免费精品一区二区三区| 韩国一区二区三区| 亚洲一区二区三区在线播放| 久久久国产精品麻豆| 91精品综合久久久久久| 91污片在线观看| 国产aⅴ综合色| 久久国产精品免费| 香蕉久久夜色精品国产使用方法| 亚洲国产成人在线| 欧美tickling挠脚心丨vk| 在线精品视频免费观看| 成人黄色网址在线观看| 久久精品72免费观看| 一区二区三区.www| 欧美国产97人人爽人人喊| 精品少妇一区二区三区免费观看 | 裸体一区二区三区| 亚洲午夜一区二区| 亚洲色欲色欲www| 日本一区二区三区久久久久久久久不| 91精品国产欧美一区二区18 | 日本成人在线看| 亚洲电影一区二区| |精品福利一区二区三区| 国产午夜精品一区二区| 日韩一区二区视频| 91精品啪在线观看国产60岁| 在线看日本不卡| 色屁屁一区二区| 色综合久久88色综合天天免费| 国产成人精品三级麻豆| 国产精品538一区二区在线| 精品一区二区国语对白| 精品系列免费在线观看| 久久不见久久见免费视频7| 美女视频黄频大全不卡视频在线播放| 无吗不卡中文字幕| 日韩国产欧美在线播放| 日韩精品成人一区二区在线| 日本最新不卡在线| 日本在线不卡视频一二三区| 另类人妖一区二区av| 老司机精品视频导航| 国产精品一区二区在线看| 国产激情一区二区三区| av激情成人网| 91成人免费在线视频| 欧美精品在线一区二区| 日韩一区二区中文字幕| 久久先锋影音av| 国产精品久久久久久久浪潮网站 | 欧美国产精品一区| 亚洲精品日韩一| 免费精品视频在线| 国产精品自拍av| 91老司机福利 在线| 欧美在线综合视频| 日韩视频免费观看高清完整版在线观看 | www国产亚洲精品久久麻豆| 综合av第一页| 亚洲成av人片在www色猫咪| 免费观看日韩电影| 成人国产亚洲欧美成人综合网| 色婷婷激情一区二区三区| 91 com成人网| 亚洲国产精品ⅴa在线观看| 一区二区三区免费网站| 奇米色777欧美一区二区| 国产成人精品亚洲日本在线桃色| 久久久国际精品| 亚洲黄网站在线观看| 精品中文字幕一区二区小辣椒| 波多野结衣在线aⅴ中文字幕不卡| 91成人在线免费观看| 久久久青草青青国产亚洲免观| 亚洲精品日日夜夜| 国产一区欧美一区| 欧美日韩五月天| 国产精品―色哟哟| 青椒成人免费视频| aaa欧美大片| 久久综合狠狠综合久久综合88| 亚洲精品久久久久久国产精华液| 韩国毛片一区二区三区| 在线免费观看成人短视频| 欧美激情一区二区三区不卡 | 日韩精品国产欧美| www.视频一区| 精品少妇一区二区三区在线播放 | 伦理电影国产精品| 91久久精品一区二区三| 国产欧美综合在线观看第十页| 日韩精品成人一区二区三区 | 成人性视频网站| 日韩视频免费直播| 偷偷要91色婷婷| 色狠狠av一区二区三区| 精品欧美黑人一区二区三区| 亚洲综合成人在线| 色综合久久久久| 亚洲欧美日韩中文播放 | 精品污污网站免费看| 中文字幕一区二区不卡| 国产91精品免费| 精品国产91九色蝌蚪| 欧美a级一区二区| 欧美一区二视频| 天堂va蜜桃一区二区三区| 欧美视频中文一区二区三区在线观看| 国产精品毛片无遮挡高清| 成人少妇影院yyyy| 久久久www免费人成精品| 国产在线国偷精品产拍免费yy| 中文字幕免费观看一区| 成人免费黄色大片| 国产精品你懂的| 成人国产精品免费| 中文字幕在线一区免费| 97se亚洲国产综合自在线 | 日本道免费精品一区二区三区| 亚洲另类中文字|