| /* mkswap(8) without any sanity checks */ |
| |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| |
| 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; |
| } |