From 29cd838eab01ed7110f3ccb2e8c6a35c8a31dbcc Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 11 Apr 2024 10:21:29 +0200 Subject: Adding upstream version 1:0.1.9998svn3589+dfsg. Signed-off-by: Daniel Baumann --- src/kash/shfile.h | 229 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 src/kash/shfile.h (limited to 'src/kash/shfile.h') diff --git a/src/kash/shfile.h b/src/kash/shfile.h new file mode 100644 index 0000000..0052428 --- /dev/null +++ b/src/kash/shfile.h @@ -0,0 +1,229 @@ +/* $Id: shfile.h 3473 2020-09-16 21:12:58Z bird $ */ +/** @file + * File management. + */ + +/* + * Copyright (c) 2007-2010 knut st. osmundsen + * + * + * This file is part of kBuild. + * + * kBuild is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * kBuild is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with kBuild; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef ___shfile_h +#define ___shfile_h + +#include "shtypes.h" +#include "shthread.h" +#include +#include +#ifdef _MSC_VER +# define _PATH_DEVNULL "nul" +# define _PATH_DEFPATH "." +#else +# if !defined(__sun__) +# include +# endif +# ifndef _PATH_DEVNULL +# define _PATH_DEVNULL "/dev/null" +# endif +# ifndef _PATH_DEFPATH +# define _PATH_DEFPATH "/bin:/usr/bin:/sbin:/usr/sbin" +# endif +#endif +#include /* for PIPE_BUF */ +#ifndef _MSC_VER +# include +# include +# ifndef O_BINARY +# define O_BINARY 0 +# endif +# ifndef O_TEXT +# define O_TEXT 0 +# endif + +#else +# include +# include + +# define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) +# define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) +# define S_ISLNK(m) 0 +# define S_IRWXU (_S_IREAD | _S_IWRITE | _S_IEXEC) +# define S_IXUSR _S_IEXEC +# define S_IWUSR _S_IWRITE +# define S_IRUSR _S_IREAD +# define S_IRWXG 0000070 +# define S_IRGRP 0000040 +# define S_IWGRP 0000020 +# define S_IXGRP 0000010 +# define S_IRWXO 0000007 +# define S_IROTH 0000004 +# define S_IWOTH 0000002 +# define S_IXOTH 0000001 +# define S_ISUID 0004000 +# define S_ISGID 0002000 +# define ALLPERMS 0000777 + +# define F_DUPFD 0 +# define F_GETFD 1 +# define F_SETFD 2 +# define F_GETFL 3 +# define F_SETFL 4 +# define FD_CLOEXEC 1 + +# define F_OK 0 +# define X_OK 1 +# define W_OK 2 +# define R_OK 4 + +# define O_NONBLOCK 0 /** @todo */ + +#endif +#if K_OS == K_OS_WINDOWS +# include "nt/ntstat.h" +#endif + + +/** + * One file. + */ +typedef struct shfile +{ + int fd; /**< The shell file descriptor number. */ + unsigned oflags; /**< Open flags. */ + unsigned shflags; /**< The shell file descriptor flags. */ + intptr_t native; /**< The native file descriptor number. */ +#ifdef DEBUG + char *dbgname; /**< The name of the file, if applicable, debug builds only. */ +# define SHFILE_DBGNAME(a) a +# else +# define SHFILE_DBGNAME(a) NULL +#endif +} shfile; + +/** @name shfile::shflags values. + * @{ + */ +#define SHFILE_FLAGS_CLOSE_ON_EXEC 0x0001 +#define SHFILE_FLAGS_TRACE 0x0002 /**< The 'trace' file, keep open after execve. */ +#define SHFILE_FLAGS_TYPE_MASK 0x00f0 +#define SHFILE_FLAGS_FILE 0x0000 +#define SHFILE_FLAGS_PIPE 0x0010 +#define SHFILE_FLAGS_DIR 0x0020 +#define SHFILE_FLAGS_TTY 0x0030 +#define SHFILE_FLAGS_DIRTY 0x0100 /**< The file has been written to. */ +/** @} */ + +/** + * The file descriptor table for a shell. + */ +typedef struct shfdtab +{ + shmtx mtx; /**< Mutex protecting any operations on the table and it's handles. */ + char *cwd; /**< The current directory for this shell instance. */ + unsigned size; /**< The size of the table (number of entries). */ + shfile *tab; /**< Pointer to the table. */ +} shfdtab; + +int shfile_init(shfdtab *, shfdtab *); +void shfile_uninit(shfdtab *, int); +void shfile_fork_win(shfdtab *pfdtab, int set, intptr_t *hndls); +typedef struct shfdexecwin +{ + int inherithandles; + int startsuspended; + shmtxtmp tmp; + int replacehandles[3]; + intptr_t handles[3]; + void *strtinfo; +} shfdexecwin; +int shfile_exec_win(shfdtab *pfdtab, int prepare, shfdexecwin *info); +int shfile_exec_unix(shfdtab *pfdtab); +#if K_OS == K_OS_WINDOWS && defined(KASH_ASYNC_CLOSE_HANDLE) +void shfile_async_close_sync(void); +#endif + +int shfile_open(shfdtab *, const char *, unsigned, mode_t); +#if K_OS == K_OS_WINDOWS +# define SHFILE_PIPE_SIZE 65536 +#elif defined(PIPE_BUF) +# define SHFILE_PIPE_SIZE PIPE_BUF +#else +# define SHFILE_PIPE_SIZE 4096 +#endif +int shfile_pipe(shfdtab *, int [2]); +int shfile_close(shfdtab *, unsigned); +long shfile_read(shfdtab *, int, void *, size_t); +long shfile_write(shfdtab *, int, const void *, size_t); +long shfile_lseek(shfdtab *, int, long, int); +int shfile_fcntl(shfdtab *, int fd, int cmd, int arg); +int shfile_dup(shfdtab *, int fd); +int shfile_movefd(shfdtab *, int fdfrom, int fdto); +int shfile_movefd_above(shfdtab *, int fdfrom, int fdmin); + +int shfile_stat(shfdtab *, const char *, struct stat *); +int shfile_stat_isreg(shfdtab *, const char *); /**< returns -1, 0 or 1. */ +int shfile_stat_exists(shfdtab *, const char *); /**< same as shfile_stat, but discards the stat data. */ +int shfile_lstat(shfdtab *, const char *, struct stat *); +int shfile_chdir(shfdtab *, const char *); +char *shfile_getcwd(shfdtab *, char *, int); +int shfile_access(shfdtab *, const char *, int); +int shfile_isatty(shfdtab *, int); +int shfile_cloexec(shfdtab *, int, int); +int shfile_set_trace(shfdtab *, int); +int shfile_ioctl(shfdtab *, int, unsigned long, void *); +#if defined(_MSC_VER) || defined(__OS2__) +# define TIOCGWINSZ 0x4201 +typedef struct sh_winsize +{ + unsigned ws_row; /**< Rows, in characters. */ + unsigned ws_col; /**< Columns, in characters. */ + unsigned ws_xpixel; /**< Horizontal size, pixels. */ + unsigned ws_ypixel; /**< Vertical size, pixels. */ +} sh_winsize; +#else +typedef struct winsize sh_winsize; +#endif +mode_t shfile_get_umask(shfdtab *); +void shfile_set_umask(shfdtab *, mode_t); + + +typedef struct sh_dirent +{ + char name[260]; +} shdirent; + +typedef struct shdir +{ + shfdtab *pfdtab; + void *native; + shdirent ent; +#if K_OS == K_OS_WINDOWS + size_t off; + size_t cb; + char buf[32768 - sizeof(void *) * 2 - sizeof(shdirent) * 2]; +#endif +} shdir; + +shdir *shfile_opendir(shfdtab *, const char *); +shdirent *shfile_readdir(struct shdir *); +void shfile_closedir(struct shdir *); + +#endif + -- cgit v1.2.3