summaryrefslogtreecommitdiffstats
path: root/src/shared/quota-util.c
blob: 4d014f847ceb1676c258c86938f71880c04344b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/* SPDX-License-Identifier: LGPL-2.1-or-later */

#include <sys/quota.h>
#include <sys/stat.h>

#include "alloc-util.h"
#include "blockdev-util.h"
#include "device-util.h"
#include "quota-util.h"

int quotactl_devnum(int cmd, dev_t devnum, int id, void *addr) {
        _cleanup_free_ char *devnode = NULL;
        int r;

        /* Like quotactl() but takes a dev_t instead of a path to a device node, and fixes caddr_t → void*,
         * like we should, today */

        r = devname_from_devnum(S_IFBLK, devnum, &devnode);
        if (r < 0)
                return r;

        if (quotactl(cmd, devnode, id, addr) < 0)
                return -errno;

        return 0;
}

int quotactl_path(int cmd, const char *path, int id, void *addr) {
        dev_t devno;
        int r;

        /* Like quotactl() but takes a path to some fs object, and changes the backing file system. I.e. the
         * argument shouldn't be a block device but a regular file system object */

        r = get_block_device(path, &devno);
        if (r < 0)
                return r;
        if (devno == 0) /* Doesn't have a block device */
                return -ENODEV;

        return quotactl_devnum(cmd, devno, id, addr);
}