mirror of
https://github.com/systemd/systemd.git
synced 2024-12-13 20:23:48 +08:00
basic: add quota-util.[ch] with some helpers for the Linux quotactl() API
This commit is contained in:
parent
3d864658ea
commit
845a7c1fc1
@ -169,6 +169,8 @@ basic_sources = files('''
|
||||
process-util.h
|
||||
procfs-util.c
|
||||
procfs-util.h
|
||||
quota-util.c
|
||||
quota-util.h
|
||||
random-util.c
|
||||
random-util.h
|
||||
ratelimit.c
|
||||
|
41
src/basic/quota-util.c
Normal file
41
src/basic/quota-util.c
Normal file
@ -0,0 +1,41 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#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)
|
||||
return -ENODEV;
|
||||
|
||||
return quotactl_devno(cmd, devno, id, addr);
|
||||
}
|
19
src/basic/quota-util.h
Normal file
19
src/basic/quota-util.h
Normal file
@ -0,0 +1,19 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#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);
|
Loading…
Reference in New Issue
Block a user