]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
sysfs: read runtime byteorder
authorThomas Weißschuh <thomas@t-8ch.de>
Sun, 30 Oct 2022 18:12:21 +0000 (19:12 +0100)
committerThomas Weißschuh <thomas@t-8ch.de>
Fri, 25 Nov 2022 18:20:32 +0000 (19:20 +0100)
include/pathnames.h
include/sysfs.h
lib/sysfs.c

index 0887bd76eba7a8666edf594692d1ffd38fc836c1..afb6af56e881139b4d957b97f38b120e83ebb480 100644 (file)
 #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"
index a10e94899613b5b1ad6ac2ef4b1b3fce37fd758f..a5200141bfa4c185e8883796bf357f4ddf95ac4c 100644 (file)
@@ -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 */
index 219f871d634d6a600ad3f6260dfc20744b066361..ad6b31fb816ef1b2023ae008447206945e763afc 100644 (file)
@@ -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