From: Thomas Weißschuh Date: Sun, 30 Oct 2022 18:12:21 +0000 (+0100) Subject: sysfs: read runtime byteorder X-Git-Tag: v2.39-rc1~367^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3672d2beeedd4d55cb310c47c1adb91adc759cf3;p=thirdparty%2Futil-linux.git sysfs: read runtime byteorder --- diff --git a/include/pathnames.h b/include/pathnames.h index 0887bd76eb..afb6af56e8 100644 --- a/include/pathnames.h +++ b/include/pathnames.h @@ -119,6 +119,7 @@ #define _PATH_SYS_DEVCHAR "/sys/dev/char" #define _PATH_SYS_CLASS "/sys/class" #define _PATH_SYS_SCSI "/sys/bus/scsi" +#define _PATH_SYS_CPU_BYTEORDER "/sys/kernel/cpu_byteorder" #define _PATH_SYS_SELINUX "/sys/fs/selinux" #define _PATH_SYS_APPARMOR "/sys/kernel/security/apparmor" diff --git a/include/sysfs.h b/include/sysfs.h index a10e948996..a5200141bf 100644 --- a/include/sysfs.h +++ b/include/sysfs.h @@ -111,5 +111,11 @@ int sysfs_blkdev_scsi_path_contains(struct path_cxt *pc, const char *pattern); char *sysfs_chrdev_devno_to_devname(dev_t devno, char *buf, size_t bufsiz); +enum sysfs_byteorder { + SYSFS_BYTEORDER_LITTLE, + SYSFS_BYTEORDER_BIG, +}; + +extern enum sysfs_byteorder sysfs_get_byteorder(void); #endif /* UTIL_LINUX_SYSFS_H */ diff --git a/lib/sysfs.c b/lib/sysfs.c index 219f871d63..ad6b31fb81 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -1072,6 +1072,36 @@ char *sysfs_chrdev_devno_to_devname(dev_t devno, char *buf, size_t bufsiz) } +enum sysfs_byteorder sysfs_get_byteorder(void) +{ + int rc; + char buf[BUFSIZ]; + enum sysfs_byteorder ret; + + rc = ul_path_read_buffer(NULL, buf, sizeof(buf), _PATH_SYS_CPU_BYTEORDER); + if (rc < 0) + goto unknown; + + if (strncmp(buf, "little", sizeof(buf)) == 0) { + ret = SYSFS_BYTEORDER_LITTLE; + goto out; + } else if (strncmp(buf, "big", sizeof(buf)) == 0) { + ret = SYSFS_BYTEORDER_BIG; + goto out; + } + +unknown: +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + ret = SYSFS_BYTEORDER_LITTLE; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + ret = SYSFS_BYTEORDER_BIG; +#else +#error Unknown byte order +#endif + +out: + return ret; +} #ifdef TEST_PROGRAM_SYSFS