
#include "util.h"
#include "sysfs.h"

static const char * const sysfs_known_mountpoints[] = {
	"/sys",
	0,
};

static int sysfs_found;
char sysfs_mountpoint[PATH_MAX + 1];

static int sysfs_valid_mountpoint(const char *sysfs)
{
	struct statfs st_fs;

	if (statfs(sysfs, &st_fs) < 0)
		return -ENOENT;
	else if (st_fs.f_type != (long) SYSFS_MAGIC)
		return -ENOENT;

	return 0;
}

const char *sysfs_find_mountpoint(void)
{
	const char * const *ptr;
	char type[100];
	FILE *fp;

	if (sysfs_found)
		return (const char *) sysfs_mountpoint;

	ptr = sysfs_known_mountpoints;
	while (*ptr) {
		if (sysfs_valid_mountpoint(*ptr) == 0) {
			sysfs_found = 1;
			strcpy(sysfs_mountpoint, *ptr);
			return sysfs_mountpoint;
		}
		ptr++;
	}

	/* give up and parse /proc/mounts */
	fp = fopen("/proc/mounts", "r");
	if (fp == NULL)
		return NULL;

	while (!sysfs_found &&
	       fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
		      sysfs_mountpoint, type) == 2) {

		if (strcmp(type, "sysfs") == 0)
			sysfs_found = 1;
	}

	fclose(fp);

	return sysfs_found ? sysfs_mountpoint : NULL;
}
