#ifndef VOLGIT_SYSTEM_PART_C #define VOLGIT_SYSTEM_PART_C VOLGIT_SYSTEM_PART_C #include const char *default_header="GIT"; const char *default_footer=""; struct Volgit_Options options; void parse_options(int argc,char **argv) { options.header=default_header; options.footer=default_footer; switch(argc) { case 5: options.header=read_file(argv[3]); options.footer=read_file(argv[4]); /*falltrough*/ case 3: options.input_path=argv[1]; options.output_path=argv[2]; break; default: die("Usage: volgit source destination [ file-containint-header file-containing-footer ]\n"); } options.output_dir_fd=open(options.output_path,O_RDONLY|O_DIRECTORY); if(options.output_dir_fd==-1) { mkdir(options.output_path,0770); options.output_dir_fd=open(options.output_path,O_RDONLY|O_DIRECTORY); if(options.output_dir_fd==-1) die("Could not open output dir\n"); } } char* read_file(const char *filename) { long file_size; int file; char *ret; struct stat file_stats; file=open(filename,O_RDONLY|O_CREAT); if(file==-1) die("Could not open file %s\n",filename); fstat(file,&file_stats); ret=malloc(file_stats.st_size+1); if(ret==NULL) die("Ran out of memory!\n"); read(file,ret,file_stats.st_size); close(file); return ret; } int create_branch_dir(const char *branch_name) { int ret=0; ret=openat(options.output_dir_fd,branch_name,O_DIRECTORY|O_RDONLY); if(ret==-1) { if(mkdirat(options.output_dir_fd,branch_name,0770)==-1) die("Could not create branch directory for %s\n",branch_name); ret=openat(options.output_dir_fd,branch_name,O_DIRECTORY|O_RDONLY); if(ret==-1) die("Could not open newly created directory for branch %s\n",branch_name); } return ret; } FILE* create_file(int branch_dir,const char *filename) { int fd; char *new_filename; size_t old_filename_len; FILE *ret; old_filename_len=strlen(filename); new_filename=calloc(old_filename_len+sizeof(".html"),1); if(new_filename==NULL) die("Ran out of memory!\n"); memcpy(new_filename,filename,old_filename_len); memcpy(new_filename+old_filename_len,".html",sizeof(".html")); unlinkat(branch_dir,new_filename,0); fd=openat(branch_dir,new_filename,O_CREAT|O_RDWR,0660); if(fd==-1) die("Could not open the file '%s' for one of the branches\n",filename); free(new_filename); ret=fdopen(fd,"w"); fprintf(ret,"%s",options.header); return ret; } void close_file(FILE *file) { fprintf(file,"%s",options.footer); fclose(file); } int create_dir(int base_dir,const char *dir_name) { int ret; ret=openat(base_dir,dir_name,O_DIRECTORY|O_RDONLY); if(ret!=-1) return ret; mkdirat(base_dir,dir_name,0770); ret=openat(base_dir,dir_name,O_DIRECTORY|O_RDONLY); if(ret==-1) die("Could not create the 'files' subdirectory of one of the branch dirs\n"); return ret; } void die(const char *format, ...) { va_list args; va_start(args,format); vfprintf(stderr,format,args); exit(1); } void push_html_link_for_blob(FILE *out,const char *filename,const char *oid) { fprintf(out,"%s\n",oid,filename); } void push_html_link_for_tree(FILE *out,const char *filename,const char *oid) { fprintf(out,"%s\n",oid,filename); } #endif