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

📄 init.c

📁 嵌入式文件系统 EFSL 0.3.5 / 嵌入式文件系统 EFSL 0.3.5
💻 C
字号:
/*****************************************************************************\*                     EFSL - Embedded Filesystems Library                     **                     -----------------------------------                     **                                                                             ** Filename : init.c                                                           ** Release  : 0.3 - devel                                                      ** Description : This file contains the functions to initialise the library on **               linux and other POSIX systems, usage is in the fsutils        **                                                                             ** 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; version 2                     ** of the License.                                                             **                                                                             ** 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.                                **                                                                             ** As a special exception, if other files instantiate templates or             ** use macros or inline functions from this file, or you compile this          ** file and link it with other works to produce a work based on this file,     ** this file does not by itself cause the resulting work to be covered         ** by the GNU General Public License. However the source code for this         ** file must still be made available in accordance with section (3) of         ** the GNU General Public License.                                             **                                                                             ** This exception does not invalidate any other reasons why a work based       ** on this file might be covered by the GNU General Public License.            **                                                                             **                                                    (c)2006 Lennart Yseboodt **                                                    (c)2006 Michael De Nil   *\*****************************************************************************/#include "include/init.h"void option_init(EFSL_cmd_options *opt){	opt->type=0;		opt->local_opt.filename=NULL;		opt->lfi_opt.imagename=NULL;}euint8 parse_cmd(EFSL_cmd_options *opt,char *cmd){	euint8 *token,*vtoken;	euint8 type=0;	token=strtok(cmd,":");	if(strcmp(token,"local")==0)type=IFTYPE_LOCAL;	if(strcmp(token,"lfi")==0)type=IFTYPE_LFI;	if(strcmp(token,"lnmi")==0)type=IFTYPE_NMI;	if(!type){		printf("Invalid type\n");		return(1);	}		opt->type=type;		switch(type){		case IFTYPE_LOCAL:			while((token=strtok(NULL,"="))!=NULL){				vtoken=strtok(NULL,",");				if(strcmp(token,"file")==0){\					printf("LOCAL::file(%s)\n",vtoken);					opt->local_opt.filename=malloc(strlen(vtoken)+1);					strcpy(opt->local_opt.filename,vtoken);				}else{					printf("LOCAL::unrecognised option %s (%s)\n",token,vtoken);				}			}			break;		case IFTYPE_LFI:			while((token=strtok(NULL,"="))!=NULL){				vtoken=strtok(NULL,",");				if(strcmp(token,"image")==0){					opt->lfi_opt.imagename=malloc(strlen(vtoken)+1);					strcpy(opt->lfi_opt.imagename,vtoken);					printf("LFI::image(%s)\n",opt->lfi_opt.imagename);				}else if(strcmp(token,"file")){					opt->lfi_opt.filename=malloc(strlen(vtoken)+1);					strcpy(opt->lfi_opt.filename,vtoken);					printf("LFI::filename(%s)\n",opt->lfi_opt.filename);				}else{					printf("LFI::unrecognised option %s (%s)\n",token,vtoken);				}			}			break;		case IFTYPE_NMI:			while((token=strtok(NULL,"="))!=NULL){				vtoken=strtok(NULL,",");			}			break;	}	return(0);}euint8 Init_EFSL(efsl_storage    **s_src ,efsl_storage    **s_dst,                 efsl_fs **f_src ,efsl_fs **f_dst,                 File            **ef_src,File            **ef_dst,                 FILE            **lf_src,FILE            **lf_dst,                 int argc, char **argv){	euint8 *arg,do_dest=0;	EFSL_cmd_options *opt_src,*opt_dst;	void *rhwi;		efsl_storage_conf *sconf;	efsl_fs_conf *fconf;	if(argc<=1){		printf("No arguments given\n");		return(1);	}		sconf=malloc(sizeof(*sconf));	fconf=malloc(sizeof(*fconf));		/* Parse source argument	 * from TYPE:opt1=val1,opt2=val2...	 */	printf("Source argument : %s\n",argv[1]);	arg=malloc(strlen(argv[1])+1);	strcpy(arg,argv[1]);	opt_src=malloc(sizeof(*opt_src));	option_init(opt_src);	parse_cmd(opt_src,arg);	free(arg);			if(argc>=3){		printf("Destination argument : %s\n",argv[2]);		arg=malloc(strlen(argv[2]+1));		strcpy(arg,argv[2]);		opt_dst=malloc(sizeof(*opt_dst));		option_init(opt_dst);		parse_cmd(opt_dst,arg);		free(arg);		do_dest=1;	}		/* Options parsed, action time */	/* Start off with source stuff */		switch(opt_src->type){		case IFTYPE_LOCAL:				(*lf_src)=fopen(opt_src->local_opt.filename,"r");				if(*lf_src==NULL){					printf("Unable to open local file : %s\n",opt_src->local_opt.filename);					return(1);				}			break;		case IFTYPE_LFI:				rhwi=malloc(sizeof(linuxFileInterface));				((linuxFileInterface*)rhwi)->fileName=malloc(strlen(opt_src->lfi_opt.imagename)+1);				strcpy(((linuxFileInterface*)rhwi)->fileName,opt_src->lfi_opt.imagename);				(*s_src)=malloc(sizeof(**s_src));				sconf->hwObject = rhwi;				sconf->if_init_fptr = lf_init;				sconf->if_read_fptr = lf_readBuf;				sconf->if_write_fptr = lf_writeBuf;				sconf->if_ioctl_fptr = lf_ioctl;				sconf->ioman_bufmem = malloc(IOMAN_NUMBUFFER*512);				if(efsl_initStorage( (*s_src) ,sconf)){					printf("Unable to initialise source storage layer\n");					return(1);				}				(*f_src)=malloc(sizeof(**f_src));				fconf->storage=(*s_src);				fconf->no_partitions=1; /* Always use full file as partition */				if(efsl_initFs( (*f_src) ,fconf)){					printf("Unable to initialise source filesystem layer\n");					return(1);				}				(*ef_src)=malloc(sizeof(**ef_src));				if( file_fopen(*ef_src,&(*f_src)->filesystem,opt_src->lfi_opt.filename,'r') ){					printf("Unable to open sourcefile in image\n");					return(1);				}			break;	}		if(do_dest){				switch(opt_dst->type){			case IFTYPE_LOCAL:					if(opt_src->type == opt_dst->type &&					(strcmp(opt_src->local_opt.filename,opt_dst->local_opt.filename))==0){						printf("LOCAL:: Destination file is source file\n");						return(1);					}else{						(*lf_dst)=fopen(opt_dst->local_opt.filename,"w");						if((*lf_dst)==NULL){							printf("Unable to open local file : %s\n",opt_dst->local_opt.filename);							return(1);						}					}				break;			case IFTYPE_LFI:					if(opt_src->type == opt_dst->type &&					(strcmp(opt_src->lfi_opt.imagename,opt_dst->lfi_opt.imagename))==0){						printf("LFI:: Source/Dest is the same!\n");						(*s_dst)=(*s_src);						(*f_dst)=(*f_src);					}else{						rhwi=malloc(sizeof(linuxFileInterface));						((linuxFileInterface*)rhwi)->fileName=malloc(strlen(opt_dst->lfi_opt.imagename)+1);						strcpy(((linuxFileInterface*)rhwi)->fileName,opt_dst->lfi_opt.imagename);						(*s_dst)=malloc(sizeof(**s_dst));						sconf->hwObject = rhwi;						sconf->if_init_fptr = lf_init;						sconf->if_read_fptr = lf_readBuf;						sconf->if_write_fptr = lf_writeBuf;						sconf->if_ioctl_fptr = lf_ioctl;						sconf->ioman_bufmem = malloc(IOMAN_NUMBUFFER*512);						if(efsl_initStorage( (*s_dst) ,sconf)){							printf("Unable to initialise source storage layer\n");							return(1);						}						(*f_dst)=malloc(sizeof(**f_src));						fconf->storage=(*s_dst);						fconf->no_partitions=1; /* Always use full file as partition */						if(efsl_initFs( (*f_dst) ,fconf)){							printf("Unable to initialise source filesystem layer\n");							return(1);						}					}					(*ef_dst)=malloc(sizeof(**ef_dst));					if( file_fopen(*ef_dst,&(*f_dst)->filesystem,opt_dst->lfi_opt.filename,'w') ){						printf("Unable to open destinationfile in image\n");						return(1);					}				break;		}	}			return(0);}

⌨️ 快捷键说明

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