forked from Bananymous/banan-os
				
			
			update main #1
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -23,7 +23,7 @@ add_subdirectory(LibELF)
 | 
			
		|||
add_subdirectory(userspace)
 | 
			
		||||
 | 
			
		||||
add_custom_target(sysroot
 | 
			
		||||
	COMMAND mkdir -p ${BANAN_SYSROOT}
 | 
			
		||||
	COMMAND ${CMAKE_COMMAND} -E make_directory ${BANAN_SYSROOT}
 | 
			
		||||
	COMMAND cd ${BANAN_SYSROOT} && sudo tar xf ${BANAN_BASE_SYSROOT}
 | 
			
		||||
	USES_TERMINAL
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -96,6 +96,8 @@ namespace Kernel
 | 
			
		|||
		BAN::ErrorOr<long> sys_close(int fd);
 | 
			
		||||
		BAN::ErrorOr<long> sys_read(int fd, void* buffer, size_t count);
 | 
			
		||||
		BAN::ErrorOr<long> sys_write(int fd, const void* buffer, size_t count);
 | 
			
		||||
		BAN::ErrorOr<long> sys_create(const char*, mode_t);
 | 
			
		||||
		BAN::ErrorOr<long> sys_create_dir(const char*, mode_t);
 | 
			
		||||
 | 
			
		||||
		BAN::ErrorOr<long> sys_chmod(const char*, mode_t);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -746,6 +746,22 @@ namespace Kernel
 | 
			
		|||
		return TRY(m_open_file_descriptors.write(fd, BAN::ByteSpan((uint8_t*)buffer, count)));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BAN::ErrorOr<long> Process::sys_create(const char* path, mode_t mode)
 | 
			
		||||
	{
 | 
			
		||||
		LockGuard _(m_lock);
 | 
			
		||||
		validate_string_access(path);
 | 
			
		||||
		TRY(create_file_or_dir(path, mode));
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BAN::ErrorOr<long> Process::sys_create_dir(const char* path, mode_t mode)
 | 
			
		||||
	{
 | 
			
		||||
		LockGuard _(m_lock);
 | 
			
		||||
		validate_string_access(path);
 | 
			
		||||
		TRY(create_file_or_dir(path, Inode::Mode::IFDIR | mode));
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BAN::ErrorOr<long> Process::sys_chmod(const char* path, mode_t mode)
 | 
			
		||||
	{
 | 
			
		||||
		if (mode & S_IFMASK)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -202,6 +202,12 @@ namespace Kernel
 | 
			
		|||
		case SYS_CHMOD:
 | 
			
		||||
			ret = Process::current().sys_chmod((const char*)arg1, (mode_t)arg2);
 | 
			
		||||
			break;
 | 
			
		||||
		case SYS_CREATE:
 | 
			
		||||
			ret = Process::current().sys_create((const char*)arg1, (mode_t)arg2);
 | 
			
		||||
			break;
 | 
			
		||||
		case SYS_CREATE_DIR:
 | 
			
		||||
			ret = Process::current().sys_create_dir((const char*)arg1, (mode_t)arg2);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			dwarnln("Unknown syscall {}", syscall);
 | 
			
		||||
			break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,11 @@
 | 
			
		|||
#include <sys/syscall.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
int creat(const char* path, mode_t mode)
 | 
			
		||||
{
 | 
			
		||||
	return syscall(SYS_CREATE, path, S_IFREG | mode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int open(const char* path, int oflag, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list args;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,6 +56,8 @@ __BEGIN_DECLS
 | 
			
		|||
#define SYS_TTY_CTRL 53
 | 
			
		||||
#define SYS_POWEROFF 54
 | 
			
		||||
#define SYS_CHMOD 55
 | 
			
		||||
#define SYS_CREATE 56 // creat, mkfifo
 | 
			
		||||
#define SYS_CREATE_DIR 57 // mkdir
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,3 +28,8 @@ int stat(const char* __restrict path, struct stat* __restrict buf)
 | 
			
		|||
{
 | 
			
		||||
	return syscall(SYS_STAT, path, buf, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mkdir(const char* path, mode_t mode)
 | 
			
		||||
{
 | 
			
		||||
	return syscall(SYS_CREATE_DIR, path, mode);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@ set(USERSPACE_PROJECTS
 | 
			
		|||
	init
 | 
			
		||||
	ls
 | 
			
		||||
	meminfo
 | 
			
		||||
	mkdir
 | 
			
		||||
	mmap-shared-test
 | 
			
		||||
	poweroff
 | 
			
		||||
	Shell
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
cmake_minimum_required(VERSION 3.26)
 | 
			
		||||
 | 
			
		||||
project(mkdir CXX)
 | 
			
		||||
 | 
			
		||||
set(SOURCES
 | 
			
		||||
	main.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_executable(mkdir ${SOURCES})
 | 
			
		||||
target_compile_options(mkdir PUBLIC -O2 -g)
 | 
			
		||||
target_link_libraries(mkdir PUBLIC libc)
 | 
			
		||||
 | 
			
		||||
add_custom_target(mkdir-install
 | 
			
		||||
	COMMAND sudo cp ${CMAKE_CURRENT_BINARY_DIR}/mkdir ${BANAN_BIN}/
 | 
			
		||||
	DEPENDS mkdir
 | 
			
		||||
	USES_TERMINAL
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv)
 | 
			
		||||
{
 | 
			
		||||
	if (argc <= 1)
 | 
			
		||||
	{
 | 
			
		||||
		fprintf(stderr, "Missing operand\n");
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	for (int i = 1; i < argc; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if (mkdir(argv[i], 0755) == -1)
 | 
			
		||||
		{
 | 
			
		||||
			perror("mkdir");
 | 
			
		||||
			ret = 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -4,18 +4,14 @@
 | 
			
		|||
 | 
			
		||||
int main(int argc, char** argv)
 | 
			
		||||
{
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	for (int i = 1; i < argc; i++)
 | 
			
		||||
	{
 | 
			
		||||
		int fd = open(argv[i], O_WRONLY | O_CREAT, 0644);
 | 
			
		||||
		if (fd == -1)
 | 
			
		||||
		if (creat(argv[i], 0644) == -1 && errno != EEXIST)
 | 
			
		||||
		{
 | 
			
		||||
			if (errno != EEXISTS)
 | 
			
		||||
				perror(argv[i]);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			close(fd);
 | 
			
		||||
			perror(argv[i]);
 | 
			
		||||
			ret = 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue