void printf_header_info(FILE_HEADER* header) { if(header->typeflag[0] == '5') printf("d"); else if(header->typeflag[0] == '1') printf("l"); else printf("-"); printf("%s", get_rights(header->mode[4])); printf("%s", get_rights(header->mode[5])); printf("%s", get_rights(header->mode[6])); printf(" %s %s ", header->uname, header->gname); printf("%*s ", 7, get_weight(oct2dec(header->size))); // The following expression permits to cut the final '\n' character printf("%.*s%s", 24, get_asc_date(oct2dec(header->mtime)), &get_asc_date(oct2dec(header->mtime))[25]); printf(" %s%s\n", header->prefix, header->name); }
int main(int argc, char *argv[]) { char oct[6]; int i; int dec; i = 0; while((oct[i++] = getchar()) != '\n'); dec = oct2dec(oct); oct[--i] = '\0'; printf("0x%s = %d\n", oct, dec); return 0; }
void create_archive_from_files(int number_of_arguments, char** files) { FILE* archive = NULL; int i = first_argument_position; errno = 0; // If the user wants to create the archive file so the first argument is // the name of the archive. if(MAKE_ARCHIVE_FLAG) { archive = fopen(files[first_argument_position], "w"); if(archive == NULL && errno != 0) goto error; i++; } do { errno = 0; FILE* current_file = fopen(files[i], "r"); if(current_file == NULL && errno != 0) goto error; FILE_HEADER header; build_ustar_header_from_file(&header, files[i]); size_t filesize = oct2dec(header.size); char* buffer = malloc(filesize); memset(buffer, 0, filesize); fread(buffer, filesize, 1, current_file); if(MAKE_ARCHIVE_FLAG) { write_header_to_archive(&header, archive); fwrite(buffer, filesize, 1, archive); unsigned int space_needed = calculate_number_of_block(filesize); space_needed *= BLOCK_SIZE; complete_current_block(filesize, space_needed, archive); if(VERBOSE_FLAG) printf("'%s' a été archivé.\n", files[i]); } else { printf_header(&header); printf("%.*s\n", (int)filesize, buffer); } free(buffer); buffer = NULL; fclose(current_file); current_file = NULL; i++; } while(i < number_of_arguments); // Write an ending null block at the end of the archive if(MAKE_ARCHIVE_FLAG) { write_null_block(archive); fclose(archive); archive = NULL; } // Here is a jump in case of an error during opening the archive error: // Avoid a wrong error display at the end of the function if(i != number_of_arguments) fprintf(stderr, "%s '%s' : %s\n", OPENING_ERR, files[i], strerror(errno)); }