/*
 * Copyright 2015, The Chromium OS Authors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above
 *      copyright notice, this list of conditions and the following
 *      disclaimer in the documentation and/or other materials provided
 *      with the distribution.
 *    * Neither the name of Google Inc. nor the names of its
 *      contributors may be used to endorse or promote products derived
 *      from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * scanft() is derived from mosys source,s which were released under the
 * BSD license
 */

#include <dirent.h>
#include <errno.h>
#include <glob.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#include "file.h"
#include "flash.h"

#define FDT_ROOT	"/proc/device-tree"
#define FDT_ALIASES	"/proc/device-tree/aliases"

/* Like strstr(), but allowing NULL bytes within haystack */
static int __find_string(const char *haystack, size_t hlen, const char *needle)
{
	const char *p = haystack;
	const char *end = haystack + hlen;

	while (p < end) {
		if (strstr(p, needle))
			return 1;
		p = memchr(p, '\0', end - p);
		if (!p)
			/* Not found? We're at the end */
			return 0;
		else
			/* Skip past the NULL separator */
			p++;
	}

	return 0;
}

/* returns 1 if string if found, 0 if not, and <0 to indicate error */
static int find_string(const char *path, const char *str)
{
	char contents[4096];
	int fd, ret;
	ssize_t len;

	msg_pdbg("%s: checking path \"%s\" for contents \"%s\"\n",
		 __func__, path, str);

	fd = open(path, O_RDONLY, 0);
	if (fd < 0) {
		msg_gerr("Cannot open file \"%s\"\n", path);
		ret = -1;
		goto find_string_exit_0;
	}

	/* mmap() (or even read() with a file length) would be nice but these
	 * might not be implemented for files in sysfs and procfs.
	 * Let's also leave room for a terminator. */
	len = read(fd, contents, sizeof(contents) - 1);
	if (len == -1) {
		msg_gerr("Cannot read file \"%s\"\n", path);
		ret = -1;
		goto find_string_exit_1;
	}
	/* Terminate the contents, in case they weren't terminated for us */
	contents[len++] = '\0';
	ret = __find_string(contents, len, str);

find_string_exit_1:
	close(fd);
find_string_exit_0:
	return ret;
}

/*
 * scanft - scan filetree for file with option to search for content
 *
 * @root:	Where to begin search
 * @filename:	Name of file to search for
 * @str:	Optional NULL terminated string to search for
 * @symdepth:	Maximum depth of symlinks to follow. A negative value means
 * 		follow indefinitely. Zero means do not follow symlinks.
 *
 * The caller should be specific enough with root and symdepth arguments
 * to avoid finding duplicate information (especially in sysfs).
 *
 * Also, note that we may only scan a bounded portion of the beginning of the
 * file for a match.
 *
 * returns allocated string with path of matching file if successful
 * returns NULL to indicate failure
 */
const char *scanft(const char *root, const char *filename,
		   const char *str, int symdepth)
{
	DIR *dp;
	struct dirent *d;
	struct stat s;
	const char *ret = NULL;

	if (lstat(root, &s) < 0) {
		msg_pdbg("%s: Error stat'ing %s: %s\n",
		        __func__, root, strerror(errno));
		return NULL;
	}

	if (S_ISLNK(s.st_mode)) {
		if (symdepth == 0)	/* Leaf has been reached */
			return NULL;
		else if (symdepth > 0)	/* Follow if not too deep in */
			symdepth--;
	} else if (!S_ISDIR(s.st_mode)) {
		return NULL;
	}

	if ((dp = opendir(root)) == NULL)
		return NULL;

	while (!ret && (d = readdir(dp))) {
		char newpath[PATH_MAX];

		/* Skip "." and ".." */
		if (!(strcmp(d->d_name, ".")) ||
		    !(strcmp(d->d_name, "..")))
			continue;

		snprintf(newpath, sizeof(newpath), "%s/%s", root, d->d_name);

		if (!strcmp(d->d_name, filename)) {
			if (!str || (find_string(newpath, str) == 1))
				ret = strdup(newpath);
		}

		if (!ret)
			ret = scanft(newpath, filename, str, symdepth);
	}

	closedir(dp);
	return ret;
}

/*
 * do_fdt_find_spi_nor_flash - Search FDT via procfs for SPI NOR flash
 *
 * @prefix:	Prefix of alias, for example "spi" will match spi*.
 * @compat:	String to look for in "compatible" node
 *
 * This function attempt to match FDT aliases with devices that have the given
 * compatible string.
 *
 * Example: If prefix is "spi" and compat is "jedec,spi-nor" then this function
 * will read the device descriptors in every alias beginning with "spi" and
 * search their respective devicetree nodes for "compatible" files containing
 * the string "jedec,spi-nor".
 *
 * returns 0 to indicate NOR flash has been found, <0 to indicate error
 */
static int do_fdt_find_spi_nor_flash(const char *prefix,
		const char *compat, unsigned int *bus, uint32_t *cs)
{
	DIR *dp;
	struct dirent *d;
	struct stat s;
	int found = 0;

	if ((dp = opendir(FDT_ALIASES)) == NULL)
		return -1;

	/*
	 * This loop will go thru the aliases sub-directory and kick-off a
	 * recursive search thru matching devicetree nodes.
	 */
	while (!found && (d = readdir(dp))) {
		char node[PATH_MAX];
		char pattern[PATH_MAX];
		char alias[64];
		int fd, len;
		glob_t pglob;

		/* allow partial match */
		if (strncmp(prefix, d->d_name, strlen(prefix)))
			continue;

		sprintf(node, "%s/%s", FDT_ALIASES, d->d_name);
		if (stat(node, &s) < 0) {
			msg_pdbg("%s: Error stat'ing %s: %s\n",
			        __func__, node, strerror(errno));
			continue;
		}

		if (!S_ISREG(s.st_mode))
			continue;

		fd = open(node, O_RDONLY);
		if (fd < 0) {
			msg_perr("Could not open %s\n", d->d_name);
			continue;
		}

		/* devicetree strings and files aren't always terminated */
		len = read(fd, alias, sizeof(alias) - 1);
		if (len < 0) {
			msg_perr("Could not read %s\n", d->d_name);
			close(fd);
			continue;
		}
		alias[len] = '\0';
		close(fd);

		/* We expect something in the form "/<type>@<address>", for
		   example "/spi@ff110000" */
		if (alias[0] != '/')
			continue;

		/*
		 * Descend into this node's directory. According to the DT
		 * specification, the SPI device node will be a subnode of
		 * the bus node. Thus, we need to look for:
		 * <path-to-spi-bus-node>/.../compatible
		 */
		snprintf(pattern, sizeof(pattern), "%s%s/*/compatible",
			 FDT_ROOT, alias);

		msg_pspew("Scanning glob pattern \"%s\"\n", pattern);
		int res = glob(pattern, 0, NULL, &pglob);
		if (res == GLOB_NOSPACE)
			goto err_out;
		else if (res != 0)
			continue;

		/*
		 * For chip-select, look at the "reg" file located in
		 * the same sub-directory as the "compatible" file.
		 */
		for (size_t i = 0; i < pglob.gl_pathc; i++) {
			char *reg_path;

			if (!find_string(pglob.gl_pathv[i], compat))
				continue;

			reg_path = strdup(pglob.gl_pathv[i]);
			if (!reg_path) {
				globfree(&pglob);
				goto err_out;
			}

			sprintf(strstr(reg_path, "compatible"), "reg");
			fd = open(reg_path, O_RDONLY);
			if (fd < 0) {
				msg_gerr("Cannot open \"%s\"\n", reg_path);
				free(reg_path);
				continue;
			}

			/* value is a 32-bit big-endian unsigned in FDT.  */
			if (read(fd, cs, 4) != 4) {
				msg_gerr("Cannot read \"%s\"\n", reg_path);
				free(reg_path);
				close(fd);
				continue;
			}

			*cs = ntohl(*cs);
			found = 1;
			free(reg_path);
			close(fd);
		}

		if (found) {
			/* Extract bus from the alias filename. */
			if (sscanf(d->d_name, "spi%u", bus) != 1) {
				msg_gerr("Unexpected format: \"d->d_name\"\n");
				found = 0;
				globfree(&pglob);
				goto err_out;
			}
		}

		globfree(&pglob);
	}

err_out:
	closedir(dp);
	return found ? 0 : -1;
}

/* Wrapper in case we want to use a list of compat strings or extend
 * this to search for other types of devices */
int fdt_find_spi_nor_flash(unsigned int *bus, unsigned int *cs)
{
	return do_fdt_find_spi_nor_flash("spi", "jedec,spi-nor", bus, cs);
}
