#include #include #include #include // creat() and co. #include // S_IRUSR #include #include #include #define USAGE "Usage: %s output input\n", argv[0] #define PERMS S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH const uint64_t magic = 0x25524573; // sER% off_t getfilesize(const char* filename); int fileexists(const char* filename); int main(int argc, char** argv) { switch(argc) { case 1: printf("Missing output file\n"); case 2: printf("Missing input file/s\n\n"); goto usage; break; } int i, namesize; int outfd, infd; uint32_t nfiles = (uint32_t)argc - 2; for(namesize = 0; i < nfiles; i++) { // Make sure file exists before writing. if(!fileexists(argv[i+2])) { printf("File %s does not exist!\n", argv[i+2]); goto failure; } namesize += strlen(argv[i+2]); } // Create the output file. outfd = creat(argv[1], PERMS); if(outfd == -1) goto failure; // Magic number. write(outfd, &magic, sizeof(magic)); close(outfd); exit(EXIT_SUCCESS); usage: printf(USAGE); failure: exit(EXIT_FAILURE); } // Grab file size. off_t getfilesize(const char* filename) { struct stat file; if(!stat(filename, &file)) return file.st_size; printf("Unable to get filesize of %s\n", filename); return 0; } // Does the file exist? int fileexists(const char* filename) { struct stat file; if(!stat(filename, &file)) return 1; return 0; }