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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? backup-files.c

?? linux下各種patch的管理工具
?? C
字號(hào):
/*  File: backup-files.c  Copyright (C) 2003, 2004, 2005, 2006  Andreas Gruenbacher <agruen@suse.de>, SuSE Labs  This program is free software; you can redistribute it and/or  modify it under the terms of the GNU Library 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  Library General Public License for more details.  You should have received a copy of the GNU Library General Public  License along with this library; if not, write to the Free Software  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*//* * Create backup files of a list of files similar to GNU patch. A path * name prefix and suffix for the backup file can be specified with the * -B and -z options. */#define _GNU_SOURCE 1#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <sys/types.h>#include <sys/stat.h>#include <utime.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <dirent.h>#if !defined(HAVE_MKSTEMP) && defined(HAVE_MKTEMP)# define mkstemp(x) creat(mktemp(x), 0600)#endif#ifndef PATH_MAX# define PATH_MAX 4096#endif#ifdef __MINGW32__#define mkdir(x,y) mkdir(x)/* Symlinks are not supported */#define lstat statstatic int link(const char *oldpath, const char *newpath){	errno = ENOSYS;	return -1;}#endifconst char *progname;enum { what_noop, what_backup, what_restore, what_remove };const char *opt_prefix="", *opt_suffix="", *opt_file;int opt_silent, opt_what=what_noop;int opt_nolinks, opt_touch;#define LINE_LENGTH 1024static voidusage(void){	printf("Usage: %s [-B prefix] [-z suffix] [-f {file|-}] [-s] [-b|-r|-x] [-t] [-L] {file|-} ...\n"	       "\n"	       "\tCreate hard linked backup copies of a list of files\n"	       "\tread from standard input.\n"	       "\n"	       "\t-b\tCreate backup\n"	       "\t-r\tRestore the backup\n"	       "\t-x\tRemove backup files and empty parent directories\n"	       "\t-B\tPath name prefix for backup files\n"	       "\t-z\tPath name suffix for backup files\n"	       "\t-s\tSilent operation; only print error messages\n"	       "\t-f\tRead the filenames to process from file (- = standard input)\n"	       "\t-t\tTouch original files after restore (update their mtimes)\n\n"	       "\t-L\tEnsure that when finished, the source file has a link count of 1\n\n",	       progname);}static void *malloc_nofail(size_t size){	void *p = malloc(size);	if (!p) {		perror(progname);		exit(1);	}	return p;}static voidcreate_parents(const char *filename){	struct stat st;	int rv = -1;	char *fn = malloc_nofail(strlen(filename) + 1), *f;	strcpy(fn, filename);	f = strrchr(fn, '/');	if (f == NULL)		goto out;	*f = '\0';	if (stat(fn, &st) == 0)		goto out;	*f = '/';	f = strchr(fn, '/');	while (f != NULL) {		*f = '\0';		if (!rv || (rv = stat(fn, &st)) != 0) {			mkdir(fn, 0777);		}		*f = '/';		f = strchr(f+1, '/');	}out:	free(fn);}static voidremove_parents(const char *filename){	char *fn = malloc_nofail(strlen(filename) + 1), *f;	strcpy(fn, filename);	f = strrchr(fn, '/');	if (f == NULL)		goto out;	do {		*f = '\0';		if (rmdir(fn) == -1)			goto out;	} while ((f = strrchr(fn, '/')) != NULL);	rmdir(fn);out:	free(fn);}static intcopy_fd(int from_fd, int to_fd){	char buffer[16384];	char *wbuf;	ssize_t len, l;	for ( ;; ) {		len = read(from_fd, buffer, sizeof(buffer));		if (len == 0)			return 0;		if (len < 0) {			if (errno == EINTR || errno == EAGAIN)				continue;			return 1;		}		for (wbuf = buffer; len != 0; ) {			l = write(to_fd, wbuf, len);			if (l < 0) {				if (errno == EINTR || errno == EAGAIN)					continue;				return 1;			}			wbuf += l;			len -= l;		}	}}static intcopy_file(const char *from, const struct stat *st, const char *to){	int from_fd, to_fd, error = 1;	if ((from_fd = open(from, O_RDONLY)) == -1) {		perror(from);		return 1;	}	unlink(to);  /* make sure we don't inherit this file's mode. */	if ((to_fd = creat(to, st->st_mode)) < 0) {		perror(to);		close(from_fd);		return 1;	}#if defined(HAVE_FCHMOD)	(void) fchmod(to_fd, st->st_mode);#elif defined(HAVE_CHMOD)	(void) chmod(to, st->st_mode);#endif	if (copy_fd(from_fd, to_fd)) {		fprintf(stderr, "%s -> %s: %s\n", from, to, strerror(errno));		unlink(to);		goto out;	}	error = 0;out:	close(from_fd);	close(to_fd);	return error;}static intlink_or_copy_file(const char *from, const struct stat *st, const char *to){	if (link(from, to) == 0)		return 0;	if (errno != EXDEV && errno != EPERM &&	    errno != EMLINK && errno != ENOSYS) {		fprintf(stderr, "Could not link file `%s' to `%s': %s\n",		       from, to, strerror(errno));		return 1;	}	return copy_file(from, st, to);}static intensure_nolinks(const char *filename){	struct stat st;	if (stat(filename, &st) != 0) {		perror(filename);		return 1;	}	if (st.st_nlink > 1) {		char *tmpname = malloc(1 + strlen(filename) + 7 + 1), *c;		int from_fd = -1, to_fd = -1;		int error = 1;		if (!tmpname)			goto fail;		from_fd = open(filename, O_RDONLY);		if (from_fd == -1)			goto fail;		/* Temp file name is "path/to/.file.XXXXXX" */		strcpy(tmpname, filename);		strcat(tmpname, ".XXXXXX");		c = strrchr(tmpname, '/');		if (c == NULL)			c = tmpname;		else			c++;		memmove(c + 1, c, strlen(c) + 1);		*c = '.';		to_fd = mkstemp(tmpname);		if (to_fd == -1)			goto fail;		if (copy_fd(from_fd, to_fd))			goto fail;#if defined(HAVE_FCHMOD)		(void) fchmod(to_fd, st.st_mode);#elif defined(HAVE_CHMOD)		(void) chmod(tmpname, st.st_mode);#endif		close(from_fd);		from_fd = -1;		close(to_fd);		to_fd = -1;		if (rename(tmpname, filename))			goto fail;		error = 0;	fail:		if (error)			perror(filename);		if (from_fd != -1)			close(from_fd);		if (to_fd != -1)			close(to_fd);		free(tmpname);		return error;	} else		return 0;}static intprocess_file(const char *file){	char *backup = malloc_nofail(		strlen(opt_prefix) + strlen(file) + strlen(opt_suffix) + 1);	sprintf(backup, "%s%s%s", opt_prefix, file, opt_suffix);	if (opt_what == what_backup) {		struct stat st;		int missing_file = (stat(file, &st) == -1 && errno == ENOENT);		unlink(backup);		create_parents(backup);		if (missing_file) {			int fd;			if (!opt_silent)				printf("New file %s\n", file);			/* GNU patch creates new files with mode==0. */			if ((fd = creat(backup, 0)) == -1) {				perror(backup);				goto fail;			}			close(fd);		} else {			if (!opt_silent)				printf("Copying %s\n", file);			if (link_or_copy_file(file, &st, backup))				goto fail;			if (opt_nolinks) {				if (ensure_nolinks(file))					goto fail;			}			if (opt_touch)				(void) utime(backup, NULL);			else {				struct utimbuf ut;				ut.actime = ut.modtime = st.st_mtime;				(void) utime(backup, &ut);			}		}	} else if (opt_what == what_restore) {		struct stat st;		create_parents(file);		if (stat(backup, &st) != 0) {			perror(backup);			goto fail;		}		if (st.st_size == 0) {			if (unlink(file) == 0 || errno == ENOENT) {				if (!opt_silent)					printf("Removing %s\n", file);			} else {				perror(file);				goto fail;			}			unlink(backup);			remove_parents(backup);		} else {			if (!opt_silent)				printf("Restoring %s\n", file);			unlink(file);			if (link_or_copy_file(backup, &st, file))				goto fail;			unlink(backup);			remove_parents(backup);			if (opt_nolinks) {				if (ensure_nolinks(file))					goto fail;			}			if (opt_touch)				(void) utime(file, NULL);			else {				struct utimbuf ut;				ut.actime = ut.modtime = st.st_mtime;				(void) utime(file, &ut);			}		}	} else if (opt_what == what_remove) {		unlink(backup);		remove_parents(backup);	} else if (opt_what == what_noop) {		struct stat st;		int missing_file = (stat(file, &st) == -1 && errno == ENOENT);		if (!missing_file && opt_nolinks) {			if (ensure_nolinks(file))				goto fail;		}	} else		goto fail;	free(backup);	return 0;fail:	free(backup);	return 1;}static intforeachdir_rec(const char *path, struct stat *st,	       int (*walk)(const char *, const struct stat *)){	DIR *dir;	struct dirent *dp;	int failed = 0;	char *p = malloc_nofail(PATH_MAX);	if (access(path, R_OK|X_OK) || !(dir = opendir(path)))		return walk(path, NULL);	while ((dp = readdir(dir))) {		if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))			continue;		if (strlen(path) + 1 + strlen(dp->d_name) + 1 > PATH_MAX) {			fprintf(stderr, "%s/%s: name too long\n", path,				dp->d_name);			failed = -1;			goto out;		}		sprintf(p, "%s/%s", path, dp->d_name);				if (lstat(p, st))			continue;  /* file has disappeared meanwhile */		if (S_ISDIR(st->st_mode)) {			failed = foreachdir_rec(p, st, walk);			if (failed)				goto out;		} else {			failed = walk(p, st);			if (failed)				goto out;		}	}	if (closedir(dir) != 0)		failed = -1;out:	free(p);	return failed;}static intforeachdir(const char *path,	   int (*walk)(const char *, const struct stat *)){	struct stat st;	if (lstat(path, &st))		return walk(path, NULL);	return foreachdir_rec(path, &st, walk);}static intwalk(const char *path, const struct stat *st){	size_t prefix_len=strlen(opt_prefix), suffix_len=strlen(opt_suffix);	size_t len = strlen(path);	char *p;	int ret;	if (!st) {		perror(path);		return 1;	}	if (!S_ISREG(st->st_mode))		return 0;	if (strncmp(opt_prefix, path, prefix_len))		return 0;  /* prefix does not match */	if (len < suffix_len || strcmp(opt_suffix, path + len - suffix_len))		return 0;  /* suffix does not match */	p = malloc_nofail(len - prefix_len - suffix_len + 1);	memcpy(p, path + prefix_len, len - prefix_len - suffix_len);	p[len - prefix_len - suffix_len] = '\0';	ret = process_file(p);	free(p);	return ret;}intmain(int argc, char *argv[]){	int opt, status = 0;	progname = argv[0];	while ((opt = getopt(argc, argv, "brxB:z:f:shLt")) != -1) {		switch(opt) {			case 'b':				opt_what = what_backup;				break;			case 'r':				opt_what = what_restore;				break;			case 'x':				opt_what = what_remove;				break;			case 'B':				opt_prefix = optarg;				break;			case 'f':				opt_file = optarg;				break;			case 'z':				opt_suffix = optarg;				break;			case 's':				opt_silent = 1;				break;			case 'L':				opt_nolinks = 1;				break;			case 't':				opt_touch = 1;				break;			case 'h':			default:				usage();				return 0;		}	}	if ((*opt_prefix == '\0' && *opt_suffix == '\0') ||	    (opt_file == NULL && optind == argc)) {		usage();		return 1;	}	if (opt_file != NULL) {		FILE *file;		char line[LINE_LENGTH];		if (!strcmp(opt_file, "-")) {			file = stdin;		} else {			if ((file = fopen(opt_file, "r")) == NULL) {				perror(opt_file);				return 1;			}		}		while (fgets(line, sizeof(line), file)) {			char *l = strchr(line, '\0');			if (l > line && *(l-1) == '\n')				*(l-1) = '\0';			if (*line == '\0')				continue;			if ((status = process_file(line)) != 0)				return status;		}		if (file != stdin) {			fclose(file);		}	}	for (; optind < argc; optind++) {		if (strcmp(argv[optind], "-") == 0) {			struct stat st;			char *dir = strdup(opt_prefix), *d = strrchr(dir, '/');			if (d)				*d = '\0';			else				d = ".";			if (stat(dir, &st) == 0) {				status = foreachdir(dir, walk);				if (status == -1)					perror(dir);			}			free(dir);		} else			status = process_file(argv[optind]);		if (status)			return status;	}	return status;}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文一区二区完整视频在线观看| 日韩一级成人av| 日韩一区精品字幕| 欧美国产综合一区二区| 欧美久久久久久蜜桃| 成人国产精品视频| 男人的天堂久久精品| 亚洲欧美日韩国产成人精品影院| 日韩亚洲国产中文字幕欧美| 91天堂素人约啪| 国产乱码字幕精品高清av| 亚洲永久免费av| 国产精品区一区二区三区| 欧美一级国产精品| 欧美在线综合视频| gogogo免费视频观看亚洲一| 麻豆成人在线观看| 亚洲chinese男男1069| 中文字幕亚洲成人| 国产日韩av一区二区| 欧美一区二区三区成人| 欧洲另类一二三四区| 9人人澡人人爽人人精品| 国产毛片一区二区| 久久99国产精品免费网站| 亚洲 欧美综合在线网络| 亚洲黄色小说网站| 亚洲天堂网中文字| 国产精品青草久久| 欧美国产丝袜视频| 久久亚洲一区二区三区明星换脸| 欧美日韩不卡在线| 亚洲国产电影在线观看| 国产色婷婷亚洲99精品小说| 日韩精品一区二区在线| 欧美一区二区精品| 日韩一区二区在线看| 欧美巨大另类极品videosbest | 日本v片在线高清不卡在线观看| 亚洲女同一区二区| 亚洲色图欧洲色图| 成人欧美一区二区三区黑人麻豆| 中文幕一区二区三区久久蜜桃| 国产三级欧美三级| 国产日韩视频一区二区三区| 久久女同精品一区二区| 久久视频一区二区| 中文字幕欧美日韩一区| 欧美国产精品一区二区三区| 国产精品午夜在线观看| 国产精品久久久久精k8| 亚洲女性喷水在线观看一区| 亚洲精品成人在线| 午夜精品123| 日本麻豆一区二区三区视频| 麻豆一区二区三区| 国产精品911| 99在线精品视频| 欧洲精品在线观看| 在线播放视频一区| 精品国产露脸精彩对白| 日本一区二区成人| 亚洲男人的天堂在线观看| 亚洲夂夂婷婷色拍ww47| 日韩中文字幕91| 国产一区二区91| 99久久综合色| 在线播放欧美女士性生活| 精品久久久久久综合日本欧美 | 欧美日韩一区高清| 欧美精品乱人伦久久久久久| 欧美不卡123| 国产精品拍天天在线| 亚洲另类在线制服丝袜| 青青草视频一区| 成人一区二区三区在线观看| 色婷婷av一区二区三区软件| 日韩一区二区免费在线观看| 国产欧美精品区一区二区三区| 亚洲精品欧美激情| 精品一区二区三区免费视频| av不卡一区二区三区| 欧美丰满少妇xxxbbb| 久久精品视频一区二区| 亚洲第一主播视频| 国产成人日日夜夜| 欧美日韩一区二区不卡| 久久久无码精品亚洲日韩按摩| 亚洲欧美另类小说视频| 久久99在线观看| 色先锋资源久久综合| 日韩一二三区不卡| 综合亚洲深深色噜噜狠狠网站| 午夜精品福利一区二区三区av| 国产不卡免费视频| 欧美裸体bbwbbwbbw| 亚洲国产电影在线观看| 奇米777欧美一区二区| 99精品国产91久久久久久 | 91精品国产色综合久久| 亚洲国产精品成人久久综合一区| 午夜精品一区二区三区电影天堂| 成人综合激情网| 日韩亚洲欧美中文三级| 一二三四社区欧美黄| 成人a免费在线看| 精品第一国产综合精品aⅴ| 亚洲成精国产精品女| caoporen国产精品视频| 久久一区二区三区国产精品| 日韩黄色在线观看| 欧美综合色免费| 1区2区3区国产精品| 国产黄色91视频| 日韩精品一区二区三区在线观看| 亚洲一线二线三线久久久| 成人黄色在线看| 国产亚洲一区二区三区在线观看 | 亚洲精品一区二区三区在线观看| 亚洲亚洲精品在线观看| a4yy欧美一区二区三区| 国产欧美日韩在线视频| 欧美日韩一区二区三区在线| 国产农村妇女毛片精品久久麻豆| 美女视频黄 久久| 91精品国产综合久久久久久| 一级中文字幕一区二区| 色综合激情久久| 亚洲人妖av一区二区| 福利电影一区二区| 国产日韩欧美精品综合| 国产在线日韩欧美| 久久综合给合久久狠狠狠97色69| 日韩成人精品在线| 91精品国产综合久久精品性色 | 欧美国产欧美亚州国产日韩mv天天看完整| 日本亚洲一区二区| 欧美一区永久视频免费观看| 午夜久久久久久久久久一区二区| 欧美亚洲综合一区| 亚洲高清免费视频| 欧美男人的天堂一二区| 日日噜噜夜夜狠狠视频欧美人| 欧美人伦禁忌dvd放荡欲情| 午夜一区二区三区在线观看| 欧美在线影院一区二区| 亚洲第一狼人社区| 5566中文字幕一区二区电影 | 成人福利视频网站| 中文字幕一区二区三区在线播放| 99久久国产综合精品麻豆| 亚洲欧洲成人精品av97| 色美美综合视频| 亚洲一区二区影院| 7777精品伊人久久久大香线蕉最新版| 午夜精彩视频在线观看不卡| 日韩三级视频中文字幕| 国产在线日韩欧美| 亚洲欧洲精品一区二区三区 | 欧美伦理视频网站| 另类调教123区| 国产欧美一区二区三区在线看蜜臀| 国产一区二区三区免费播放| 国产精品无人区| 欧美三区在线观看| 久久99热这里只有精品| 国产精品天干天干在线综合| 欧美在线观看一区二区| 欧美美女喷水视频| 精品在线亚洲视频| 中文字幕字幕中文在线中不卡视频| 精品视频色一区| 国内欧美视频一区二区| 综合久久一区二区三区| 欧美一区二区在线看| 国产成人精品aa毛片| 亚洲一区日韩精品中文字幕| 精品国产91洋老外米糕| 91亚洲国产成人精品一区二区三 | 久久一区二区三区四区| 色婷婷香蕉在线一区二区| 热久久久久久久| 中文字幕日韩一区二区| 欧美一区中文字幕| 成人网在线播放| 日韩精品一卡二卡三卡四卡无卡| 国产日韩欧美在线一区| 欧美三级欧美一级| 成人一级片网址| 日韩高清欧美激情| 亚洲色图丝袜美腿| 日韩欧美高清dvd碟片| 色偷偷成人一区二区三区91| 久久se精品一区二区| 亚洲精品中文在线| 国产三级一区二区| 91精品国产综合久久香蕉的特点| 99热精品一区二区| 国产一区欧美一区| 天天av天天翘天天综合网|