Loading...
darwin/subsystem.c Libc-1725.40.4 /dev/null
--- Libc/Libc-1725.40.4/darwin/subsystem.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
-* Copyright (c) 2019 Apple Inc. All rights reserved.
-*
-* @APPLE_LICENSE_HEADER_START@
-*
-* This file contains Original Code and/or Modifications of Original Code
-* as defined in and that are subject to the Apple Public Source License
-* Version 2.0 (the 'License'). You may not use this file except in
-* compliance with the License. Please obtain a copy of the License at
-* http://www.opensource.apple.com/apsl/ and read it before using this
-* file.
-*
-* The Original Code and all software distributed under the License are
-* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-* Please see the License for the specific language governing rights and
-* limitations under the License.
-*
-* @APPLE_LICENSE_HEADER_END@
-*/
-
-#include <fcntl.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-#include <subsystem.h>
-#include <sys/errno.h>
-#include <sys/syslimits.h>
-#include <_simple.h>
-
-#define SUBSYSTEM_ROOT_PATH_KEY "subsystem_root_path"
-#define SUBSYSTEM_ROOT_PATH_DELIMETER ':'
-#define MAX_SUBSYSTEM_ROOT_PATHS 8
-
-void _subsystem_init(const char *apple[]);
-
-static const char * subsystem_root_path = NULL;
-static size_t subsystem_root_path_len = 0;
-
-/*
- * Takes the apple array, and initializes subsystem
- * support in Libc.
- */
-void
-_subsystem_init(const char **apple)
-{
-	const char * subsystem_root_path_string = _simple_getenv(apple, SUBSYSTEM_ROOT_PATH_KEY);
-	if (subsystem_root_path_string) {
-		subsystem_root_path = subsystem_root_path_string;
-		subsystem_root_path_len = strnlen(subsystem_root_path, PATH_MAX);
-	}
-}
-
-/*
- * Takes a buffer containing a subsystem root path and a file path, and constructs the
- * subsystem path for the given file path.  Assumes that the subsystem root
- * path will be "/" terminated.
- */
-static bool
-append_path_to_subsystem_root(char * buf, size_t buf_size, const char * file_path)
-{
-	size_t concatenated_length = strlcat(buf, file_path, buf_size);
-
-	if (concatenated_length >= buf_size) {
-		return false;
-	}
-
-	return true;
-}
-
-/*
- * Takes a pointer to a part of the subsystem root path string and extracts
- * the next viable path (from the start point to the NULL terminator or next ':'
- * character). Populates this path into the provided buffer. Returns a pointer to
- * the next root path if there is a following one, NULL if this was the last path.
- *
- * Note: It's not possible to use straight strsep(3) or similar because the subsystem
- *       root path is immutable.
- */
-static const char *
-extract_next_subsystem_root_path(char *buf, size_t buf_size, const char *root_path_begin)
-{
-	bool found_delimeter = false;
-	size_t root_path_len = strlen(root_path_begin);
-
-	if (buf_size == 0) {
-		return root_path_begin;
-	}
-
-	const char *next_delimeter = memchr(root_path_begin, (int)SUBSYSTEM_ROOT_PATH_DELIMETER,
-										root_path_len);
-	if (next_delimeter != NULL) {
-		root_path_len = (size_t)(next_delimeter - root_path_begin);
-		found_delimeter = true;
-	}
-	if (root_path_len > (buf_size - 1)) {
-		// We either found a sub-path that was too long or there was only one
-		// path in the string and that was too long.
-		return NULL;
-	}
-	memcpy(buf, root_path_begin, root_path_len);
-	buf[root_path_len] = '\0';
-
-	// If we found a delimeter, this indicates there is another path
-	// after the one we just extracted. Return a pointer to the beginning
-	// of this path (which is the character after the delimeter). Otherwise
-	// that was the last component in the paths.
-	if (found_delimeter) {
-		return (next_delimeter + 1);
-	} else {
-		return NULL;
-	}
-}
-
-int
-open_with_subsystem(const char * path, int oflag)
-{
-	/* Don't support file creation. */
-	if (oflag & O_CREAT){
-		errno = EINVAL;
-		return -1;
-	}
-
-	int result;
-
-	result = open(path, oflag);
-
-	if ((result < 0) && (errno == ENOENT) && (subsystem_root_path)) {
-		/*
-		 * If the file doesn't exist relative to root, search
-		 * for it relative to the provided subsystem root paths.
-		 */
-		const char *next_subsystem_root_path_begin = subsystem_root_path;
-		do {
-			char constructed_path[PATH_MAX];
-			next_subsystem_root_path_begin = extract_next_subsystem_root_path(constructed_path, sizeof(constructed_path), next_subsystem_root_path_begin);
-
-			if (append_path_to_subsystem_root(constructed_path, sizeof(constructed_path), path)) {
-				result = open(constructed_path, oflag);
-				if (result >= 0) {
-					break;
-				} else if (errno == ENOENT) {
-					continue;
-				}
-			} else {
-				errno = ENAMETOOLONG;
-				break;
-			}
-		} while (next_subsystem_root_path_begin != NULL);
-	}
-
-	return result;
-}
-
-int
-stat_with_subsystem(const char *restrict path, struct stat *restrict buf)
-{
-	int result;
-
-	result = stat(path, buf);
-
-	if ((result < 0) && (errno == ENOENT) && (subsystem_root_path)) {
-		/*
-		 * If the file doesn't exist relative to root, search
-		 * for it relative to the provided subsystem root paths.
-		 */
-		const char *next_subsystem_root_path_begin = subsystem_root_path;
-		do {
-			char constructed_path[PATH_MAX];
-			next_subsystem_root_path_begin = extract_next_subsystem_root_path(constructed_path, sizeof(constructed_path), next_subsystem_root_path_begin);
-
-			if (append_path_to_subsystem_root(constructed_path, sizeof(constructed_path), path)) {
-				result = stat(constructed_path, buf);
-				if (result >= 0) {
-					break;
-				} else if (errno == ENOENT) {
-					continue;
-				}
-			} else {
-				errno = ENAMETOOLONG;
-				break;
-			}
-		} while (next_subsystem_root_path_begin != NULL);
-	}
-
-	return result;
-}
-