basic,shared: move quota-util.[ch] to src/shared/

No need for this to in basic/.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2021-06-24 09:47:15 +02:00
parent 65ddc2c5ff
commit 2686114332
4 changed files with 2 additions and 2 deletions
+2
View File
@@ -223,6 +223,8 @@ shared_sources = files('''
pwquality-util.h
qrcode-util.c
qrcode-util.h
quota-util.c
quota-util.h
reboot-util.c
reboot-util.h
resize-fs.c
+41
View File
@@ -0,0 +1,41 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <sys/quota.h>
#include "alloc-util.h"
#include "blockdev-util.h"
#include "quota-util.h"
#include "stat-util.h"
int quotactl_devno(int cmd, dev_t devno, 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 = device_path_make_major_minor(S_IFBLK, devno, &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_devno(cmd, devno, id, addr);
}
+19
View File
@@ -0,0 +1,19 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
#include <inttypes.h>
#include <sys/quota.h>
#include <sys/types.h>
/* Wrapper around the QCMD() macro of linux/quota.h that removes some undefined behaviour. A typical quota
* command such as QCMD(Q_GETQUOTA, USRQUOTA) cannot be resolved on platforms where "int" is 32bit, as it is
* larger than INT_MAX. Yikes, because that are basically all platforms Linux supports. Let's add a wrapper
* that explicitly takes its arguments as unsigned 32bit, and then converts the shift result explicitly to
* int, acknowledging the undefined behaviour of the kernel headers. This doesn't remove the undefined
* behaviour, but it stops ubsan from complaining about it. */
static inline int QCMD_FIXED(uint32_t cmd, uint32_t type) {
return (int) QCMD(cmd, type);
}
int quotactl_devno(int cmd, dev_t devno, int id, void *addr);
int quotactl_path(int cmd, const char *path, int id, void *addr);