fallocate.c - ubase - suckless linux base utils
 (HTM) git clone git://git.suckless.org/ubase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       fallocate.c (987B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <sys/stat.h>
            3 
            4 #include <fcntl.h>
            5 #include <limits.h>
            6 #include <stdint.h>
            7 #include <stdio.h>
            8 #include <stdlib.h>
            9 #include <unistd.h>
           10 
           11 #include "util.h"
           12 
           13 static void
           14 usage(void)
           15 {
           16         eprintf("usage: %s [-o num] -l num file ...\n", argv0);
           17 }
           18 
           19 int
           20 main(int argc, char *argv[])
           21 {
           22         int fd, ret = 0;
           23         off_t size = 0, offset = 0;
           24 
           25         ARGBEGIN {
           26         case 'l':
           27                 size = estrtonum(EARGF(usage()), 1, MIN(LLONG_MAX, SIZE_MAX));
           28                 break;
           29         case 'o':
           30                 offset = estrtonum(EARGF(usage()), 0, MIN(LLONG_MAX, SIZE_MAX));
           31                 break;
           32         default:
           33                 usage();
           34         } ARGEND;
           35 
           36         if (!argc || !size)
           37                 usage();
           38 
           39         for (; *argv; argc--, argv++) {
           40                 if ((fd = open(*argv, O_RDWR | O_CREAT, 0644)) < 0) {
           41                         weprintf("open %s:", *argv);
           42                         ret = 1;
           43                 } else if (posix_fallocate(fd, offset, size) < 0) {
           44                         weprintf("posix_fallocate %s:", *argv);
           45                         ret = 1;
           46                 }
           47 
           48                 if (fd >= 0 && close(fd) < 0) {
           49                         weprintf("close %s:", *argv);
           50                         ret = 1;
           51                 }
           52         }
           53 
           54         return ret;
           55 }