📄 pack.c
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <sys/sendfile.h>#include <string.h>struct file { char* name; size_t size; int fd; int optional;};void stat_files(struct file* files,int num_files){ int i; for(i=0; i<num_files;i++) { struct file* f = &files[i]; f->fd = open(f->name, O_RDONLY); if(f->name && *(f->name) && f->fd>=0) { struct stat stat; fstat(f->fd, &stat); f->size = stat.st_size; printf("%s size %d\n", f->name, f->size); } else if(!f->optional) { printf("no file: '%s'\n",f->name); exit(-1); } }}void write_file(FILE* out, struct file* f){ char* d= malloc(f->size); if(f->fd>=0) { printf("sending file %s\n", f->name); if(read(f->fd,d,f->size)!=f->size) { printf("read err\n"); exit(-1); } fwrite(d, f->size,1,out); free(d); close(f->fd); }}int main(int argc, char** argv){ int args_size; int i; char cmdline[256]; int num_pfns = 0x1000; struct file files[] = { { "/root/bin/linux_loader", 0,0,0}, { "/root/vmlinux", 0,0,0}, { "/root/domUinitrd", 0,0,1} }; const int num_files = sizeof(files)/sizeof(struct file); FILE* out = fopen("/tmp/out.img","w"); memset(cmdline,0,sizeof(cmdline)); strcpy(cmdline,"mem=16M init=/linuxrc root=/dev/ram xencons=ttyS0"); printf("%d files\n", num_files); stat_files(files,num_files); fwrite(&files[0].size, sizeof(size_t),1,out); write_file( out, &files[0] ); args_size = sizeof(cmdline) + 3*sizeof(size_t); fwrite(&args_size, sizeof(args_size),1,out); fwrite(&num_pfns, sizeof(num_pfns),1,out); fwrite(cmdline, sizeof(cmdline),1,out); fwrite(&files[1].size, sizeof(size_t),1,out); fwrite(&files[2].size, sizeof(size_t),1,out); for(i=1; i<num_files; i++) write_file( out, &files[i] ); fclose(out); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -