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

📄 options.c

📁 linux下的DVD格式udf文件读取库
💻 C
字号:
/* * options.c * * Copyright (c) 2001-2002  Ben Fennema <bfennema@falcon.csc.calpoly.edu> * All rights reserved. * * 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 <stdio.h>#include <stdlib.h>#include <getopt.h>#include <malloc.h>#include "mkudffs.h"#include "defaults.h"#include "options.h"struct option long_options[] = {	{ "help", no_argument, NULL, OPT_HELP },	{ "blocksize", required_argument, NULL, OPT_BLK_SIZE },	{ "udfrev", required_argument, NULL, OPT_UDF_REV },	{ "lvid", required_argument, NULL, OPT_LVID },	{ "vid", required_argument, NULL, OPT_VID },	{ "vsid", required_argument, NULL, OPT_VSID },	{ "fsid", required_argument, NULL, OPT_FSID },	{ "strategy", required_argument, NULL, OPT_STRATEGY },	{ "spartable", required_argument, NULL, OPT_SPARTABLE },	{ "packetlen", required_argument, NULL, OPT_PACKETLEN },	{ "media-type", required_argument, NULL, OPT_MEDIA_TYPE },	{ "space", required_argument, NULL, OPT_SPACE },	{ "ad", required_argument, NULL, OPT_AD },	{ "noefe", no_argument, NULL, OPT_NO_EFE },	{ "u8", no_argument, NULL, OPT_UNICODE8 },	{ "u16", no_argument, NULL, OPT_UNICODE16 },	{ "utf8", no_argument, NULL, OPT_UTF8 },	{ "bridge", no_argument, NULL, OPT_BRIDGE },	{ "closed", no_argument, NULL, OPT_CLOSED },	{ 0, 0, NULL, 0 },};void usage(void){	fprintf(stderr, "mkudffs %s for UDF FS %s, %s\n"		"Usage:\n"		"\tmkudffs [options] device [blocks-count]\n"		"Switches:\n"		"\t--help\n"		"\t--blocksize=, -b\n"		"\t--udfrev=, -r\n"		"\t--lvid=\n"		"\t--vid=\n"		"\t--vsid=\n"		"\t--fsid=\n"		"\t--strategy=\n"		"\t--spartable=\n"		"\t--packetlen=\n"		"\t--media-type=\n"		"\t--space=\n"		"\t--ad=\n"		"\t--noefe\n"		"\t--u8\n"		"\t--u16\n"		"\t--utf8\n"		"\t--bridge\n"		"\t--closed\n",		MKUDFFS_VERSION, UDFFS_VERSION, UDFFS_DATE	);	exit(1);}void parse_args(int argc, char *argv[], struct udf_disc *disc, char *device){	int retval;	int i;	int media = DEFAULT_HD;	uint16_t packetlen = 0;	while ((retval = getopt_long(argc, argv, "b:r:h", long_options, NULL)) != EOF)	{		switch (retval)		{			case OPT_HELP:			case 'h':				usage();				break;			case OPT_BLK_SIZE:			case 'b':			{				uint16_t bs;				disc->blocksize = strtoul(optarg, NULL, 0);				for (bs=512,disc->blocksize_bits=9;					disc->blocksize_bits<13;					disc->blocksize_bits++,bs<<=1)				{					if (disc->blocksize == bs)						break;				}				if (disc->blocksize_bits == 13)				{					fprintf(stderr, "mkudffs: invalid blocksize\n");					exit(1);				}				disc->udf_lvd[0]->logicalBlockSize = cpu_to_le32(disc->blocksize);				break;			}			case OPT_UDF_REV:			case 'r':			{				if (udf_set_version(disc, strtoul(optarg, NULL, 16)))				{					fprintf(stderr, "mkudffs: invalid udf revision\n");					exit(1);				}				break;			}			case OPT_NO_EFE:			{				disc->flags &= ~FLAG_EFE;				break;			}			case OPT_UNICODE8:			{				disc->flags &= ~FLAG_CHARSET;				disc->flags |= FLAG_UNICODE8;				break;			}			case OPT_UNICODE16:			{				disc->flags &= ~FLAG_CHARSET;				disc->flags |= FLAG_UNICODE16;				break;			}			case OPT_UTF8:			{				disc->flags &= ~FLAG_CHARSET;				disc->flags |= FLAG_UTF8;				break;			}			case OPT_BRIDGE:			{				disc->flags |= FLAG_BRIDGE;				break;			}			case OPT_CLOSED:			{				disc->flags |= FLAG_CLOSED;				break;			}			case OPT_LVID:			{				disc->udf_lvd[0]->logicalVolIdent[127] = encode_string(disc, disc->udf_lvd[0]->logicalVolIdent, "", optarg, 128);				((struct impUseVolDescImpUse *)disc->udf_iuvd[0]->impUse)->logicalVolIdent[127] = encode_string(disc, ((struct impUseVolDescImpUse *)disc->udf_iuvd[0]->impUse)->logicalVolIdent, "", optarg, 128);				disc->udf_fsd->logicalVolIdent[127] = encode_string(disc, disc->udf_fsd->logicalVolIdent, "", optarg, 128);				break;			}			case OPT_VID:			{				disc->udf_pvd[0]->volIdent[31] = encode_string(disc, disc->udf_pvd[0]->volIdent, "", optarg, 32);				break;			}			case OPT_VSID:			{				char ts[9];				strncpy(ts, &disc->udf_pvd[0]->volSetIdent[1], 8);				disc->udf_pvd[0]->volSetIdent[127] = encode_string(disc, disc->udf_pvd[0]->volSetIdent, ts, optarg, 128);				break;			}			case OPT_FSID:			{				disc->udf_fsd->fileSetIdent[31] = encode_string(disc, disc->udf_fsd->fileSetIdent, "", optarg, 32);				break;			}			case OPT_STRATEGY:			{				uint16_t strategy;				strategy = strtoul(optarg, NULL, 0);				if (strategy == 4096)					disc->flags |= FLAG_STRATEGY4096;				else if (strategy != 4)				{					fprintf(stderr, "mkudffs: invalid strategy type\n");					exit(1);				}				break;			}			case OPT_SPARTABLE:			{				uint8_t spartable;				spartable = strtoul(optarg, NULL, 0);				if (spartable > 4)				{					fprintf(stderr, "mkudffs: invalid spartable count\n");					exit(1);				}				add_type2_sparable_partition(disc, 0, spartable, packetlen);				media = DEFAULT_CDRW;				break;			}			case OPT_PACKETLEN:			{				struct sparablePartitionMap *spm;				packetlen = strtoul(optarg, NULL, 0);				if ((spm = find_type2_sparable_partition(disc, 0)))					spm->packetLength = cpu_to_le16(packetlen);				break;			}			case OPT_MEDIA_TYPE:			{				if (!strncmp(optarg, "hd", 2))					media = DEFAULT_HD;				else if (!strcmp(optarg, "dvd"))				{					disc->udf_pd[0]->accessType = cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY);					media = DEFAULT_DVD;				}				else if (!strncmp(optarg, "dvdram", 6))				{					disc->udf_pd[0]->accessType = cpu_to_le32(PD_ACCESS_TYPE_OVERWRITABLE);					media = DEFAULT_DVDRAM;				}				else if (!strncmp(optarg, "dvdrw", 5))				{					disc->udf_pd[0]->accessType = cpu_to_le32(PD_ACCESS_TYPE_OVERWRITABLE);					media = DEFAULT_DVDRW;					packetlen = 16;				}				else if (!strncmp(optarg, "worm", 4))				{					disc->udf_pd[0]->accessType = cpu_to_le32(PD_ACCESS_TYPE_WRITE_ONCE);					media = DEFAULT_WORM;					disc->flags |= (FLAG_STRATEGY4096 | FLAG_BLANK_TERMINAL);				}				else if (!strncmp(optarg, "mo", 2))				{					disc->udf_pd[0]->accessType = cpu_to_le32(PD_ACCESS_TYPE_REWRITABLE);					media = DEFAULT_MO;					disc->flags |= (FLAG_STRATEGY4096 | FLAG_BLANK_TERMINAL);				}				else if (!strncmp(optarg, "cdrw", 4))				{					disc->udf_pd[0]->accessType = cpu_to_le32(PD_ACCESS_TYPE_REWRITABLE);					media = DEFAULT_CDRW;				}				else if (!strncmp(optarg, "cdr", 3))				{					disc->udf_pd[0]->accessType = cpu_to_le32(PD_ACCESS_TYPE_WRITE_ONCE);					media = DEFAULT_CDR;					disc->flags |= FLAG_VAT;					disc->flags &= ~FLAG_CLOSED;				}				else				{					fprintf(stderr, "mkudffs: invalid media type\n");					exit(1);				}				break;			}			case OPT_SPACE:			{				if (!strncmp(optarg, "freedbitmap", 11))					disc->flags |= FLAG_FREED_BITMAP;				else if (!strncmp(optarg, "freedtable", 10))					disc->flags |= FLAG_FREED_TABLE;				else if (!strncmp(optarg, "unallocbitmap", 13))					disc->flags |= FLAG_UNALLOC_BITMAP;				else if (!strncmp(optarg, "unalloctable", 12))					disc->flags |= FLAG_UNALLOC_TABLE;				else				{					fprintf(stderr, "mkudffs: invalid space type\n");					exit(1);				}				break;			}			case OPT_AD:			{				if (!strncmp(optarg, "inicb", 5))				{					default_fe.icbTag.flags = cpu_to_le16(ICBTAG_FLAG_AD_IN_ICB);					default_efe.icbTag.flags = cpu_to_le16(ICBTAG_FLAG_AD_IN_ICB);				}				else if (!strncmp(optarg, "short", 5))				{					default_fe.icbTag.flags = cpu_to_le16(ICBTAG_FLAG_AD_SHORT);					default_efe.icbTag.flags = cpu_to_le16(ICBTAG_FLAG_AD_SHORT);				}				else if (!strncmp(optarg, "long", 4))				{					default_fe.icbTag.flags = cpu_to_le16(ICBTAG_FLAG_AD_LONG);					default_efe.icbTag.flags = cpu_to_le16(ICBTAG_FLAG_AD_LONG);				}				else				{					fprintf(stderr, "mkudffs: invalid allocation descriptor\n");					exit(1);				}				break;			}			default:				exit(1);		}	}	if (optind == argc)		usage();	strcpy(device, argv[optind]);	optind ++;	if (optind < argc)		disc->head->blocks = strtoul(argv[optind++], NULL, 0);	else		disc->head->blocks = 0;	if (optind < argc)		usage();	if (le32_to_cpu(disc->udf_lvd[0]->numPartitionMaps) == 0)	{		if (media == DEFAULT_CDRW || media == DEFAULT_DVDRW)			add_type2_sparable_partition(disc, 0, 2, packetlen);		else if (media == DEFAULT_CDR)		{			add_type1_partition(disc, 0);			add_type2_virtual_partition(disc, 0);		}		else			add_type1_partition(disc, 0);	}	if (!(disc->flags & FLAG_SPACE))		disc->flags |= FLAG_UNALLOC_BITMAP;	if (media == DEFAULT_CDR)		disc->flags &= ~FLAG_SPACE;	for (i=0; i<UDF_ALLOC_TYPE_SIZE; i++)	{		if (disc->sizing[i].denomSize == 0)			memcpy(&disc->sizing[i], &default_sizing[media][i], sizeof(default_sizing[media][i]));	}}

⌨️ 快捷键说明

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