#include #include #include #include #include #include #include #include #include #include struct { char head[6]; long len; } header; int main(int argc, char *argv[]) { int fd; long len; struct stat s; void *p = 0; char outfile[100], *data; if (argc < 2) return 1; if ((fd = open(argv[1], O_RDONLY)) < 0) { fprintf(stderr, "%s: %s: %s\n", argv[0], argv[1], strerror(errno)); return 1; } fstat(fd, &s); if ((p = mmap(0, s.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) { fprintf(stderr, "%s: %s: %s\n", argv[0], argv[1], strerror(errno)); return 1; } data = malloc(s.st_size); sprintf(outfile, "%s.z", argv[1]); compress(data, &len, p, s.st_size); munmap(p, s.st_size); close(fd); fd = open(outfile, O_WRONLY | O_CREAT, 00644); write(fd, "sZIP01", 6); write(fd, &s.st_size, 4); write(fd, data, len); close(fd); return 0; }