/* mkswap(8) without any sanity checks */ #include #include #include #include #include #include #include struct swap_header { char bootbits[1024]; uint32_t version; uint32_t last_page; uint32_t nr_badpages; unsigned char sws_uuid[16]; unsigned char sws_volume[16]; uint32_t padding[117]; uint32_t badpages[1]; }; int main(int argc, char **argv) { struct swap_header *hdr; FILE *file; struct stat st; long page_size; int ret; if (argc != 2) { fprintf(stderr, "usage: %s PATH\n", argv[0]); return EXIT_FAILURE; } page_size = sysconf(_SC_PAGESIZE); if (page_size == -1) { perror("sysconf"); return EXIT_FAILURE; } hdr = calloc(1, page_size); if (!hdr) { perror("calloc"); return EXIT_FAILURE; } file = fopen(argv[1], "r+"); if (!file) { perror("fopen"); free(hdr); return EXIT_FAILURE; } ret = fstat(fileno(file), &st); if (ret) { perror("fstat"); free(hdr); fclose(file); return EXIT_FAILURE; } hdr->version = 1; hdr->last_page = st.st_size / page_size - 1; memset(&hdr->sws_uuid, 0x99, sizeof(hdr->sws_uuid)); memcpy((char *)hdr + page_size - 10, "SWAPSPACE2", 10); if (fwrite(hdr, page_size, 1, file) != 1) { perror("fwrite"); free(hdr); fclose(file); return EXIT_FAILURE; } if (fclose(file) == EOF) { perror("fwrite"); free(hdr); return EXIT_FAILURE; } free(hdr); return EXIT_SUCCESS; }