1 /* $Id: shfile.h 2546 2011-10-01 19:49:54Z bird $ */
2 /** @file
3  * File management.
4  */
5 
6 /*
7  * Copyright (c) 2007-2010 knut st. osmundsen <bird-kBuild-spamx@anduin.net>
8  *
9  *
10  * This file is part of kBuild.
11  *
12  * kBuild is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * kBuild is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with kBuild; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25  *
26  */
27 
28 #ifndef ___shfile_h
29 #define ___shfile_h
30 
31 #include "shtypes.h"
32 #include "shthread.h"
33 #include <fcntl.h>
34 #include <sys/stat.h>
35 #ifdef _MSC_VER
36 # define _PATH_DEVNULL  "nul"
37 # define _PATH_DEFPATH  "."
38 #else
39 # if !defined(__sun__)
40 #  include <paths.h>
41 # endif
42 # ifndef _PATH_DEVNULL
43 #  define _PATH_DEVNULL "/dev/null"
44 # endif
45 # ifndef _PATH_DEFPATH
46 #  define _PATH_DEFPATH "/bin:/usr/bin:/sbin:/usr/sbin"
47 # endif
48 #endif
49 #ifndef _MSC_VER
50 # include <fcntl.h>
51 # include <unistd.h>
52 # ifndef O_BINARY
53 #  define O_BINARY  0
54 # endif
55 # ifndef O_TEXT
56 #  define O_TEXT    0
57 # endif
58 
59 #else
60 # include <io.h>
61 # include <direct.h>
62 
63 # define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR)
64 # define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG)
65 # define S_ISLNK(m) 0
66 # define S_IRWXU    (_S_IREAD | _S_IWRITE | _S_IEXEC)
67 # define S_IXUSR    _S_IEXEC
68 # define S_IWUSR    _S_IWRITE
69 # define S_IRUSR    _S_IREAD
70 # define S_IRWXG    0000070
71 # define S_IRGRP    0000040
72 # define S_IWGRP    0000020
73 # define S_IXGRP    0000010
74 # define S_IRWXO    0000007
75 # define S_IROTH    0000004
76 # define S_IWOTH    0000002
77 # define S_IXOTH    0000001
78 # define S_ISUID    0004000
79 # define S_ISGID    0002000
80 # define ALLPERMS   0000777
81 
82 # define F_DUPFD    0
83 # define F_GETFD    1
84 # define F_SETFD    2
85 # define F_GETFL    3
86 # define F_SETFL    4
87 # define FD_CLOEXEC 1
88 
89 # define F_OK       0
90 # define X_OK       1
91 # define W_OK       2
92 # define R_OK       4
93 
94 # define O_NONBLOCK 0 /** @todo */
95 
96 #endif
97 
98 
99 /**
100  * One file.
101  */
102 typedef struct shfile
103 {
104     int                 fd;             /**< The shell file descriptor number. */
105     unsigned            oflags;         /**< Open flags. */
106     unsigned            shflags;        /**< The shell file descriptor flags. */
107     intptr_t            native;         /**< The native file descriptor number. */
108 } shfile;
109 
110 /** @name shfile::shflags values.
111  * @{
112  */
113 #define SHFILE_FLAGS_CLOSE_ON_EXEC      0x0001
114 #define SHFILE_FLAGS_TYPE_MASK          0x00f0
115 #define SHFILE_FLAGS_FILE               0x0000
116 #define SHFILE_FLAGS_PIPE               0x0010
117 #define SHFILE_FLAGS_DIR                0x0020
118 #define SHFILE_FLAGS_TTY                0x0030
119 /** @} */
120 
121 /**
122  * The file descriptor table for a shell.
123  */
124 typedef struct shfdtab
125 {
126     shmtx               mtx;            /**< Mutex protecting any operations on the table and it's handles. */
127     char               *cwd;            /**< The current directory for this shell instance. */
128     unsigned            size;           /**< The size of the table (number of entries). */
129     shfile             *tab;            /**< Pointer to the table. */
130 } shfdtab;
131 
132 int shfile_init(shfdtab *, shfdtab *);
133 void shfile_fork_win(shfdtab *pfdtab, int set, intptr_t *hndls);
134 void *shfile_exec_win(shfdtab *pfdtab, int prepare, unsigned short *sizep, intptr_t *hndls);
135 int shfile_exec_unix(shfdtab *pfdtab);
136 
137 int shfile_open(shfdtab *, const char *, unsigned, mode_t);
138 int shfile_pipe(shfdtab *, int [2]);
139 int shfile_close(shfdtab *, unsigned);
140 long shfile_read(shfdtab *, int, void *, size_t);
141 long shfile_write(shfdtab *, int, const void *, size_t);
142 long shfile_lseek(shfdtab *, int, long, int);
143 int shfile_fcntl(shfdtab *, int fd, int cmd, int arg);
144 int shfile_dup(shfdtab *, int fd);
145 int shfile_movefd(shfdtab *, int fdfrom, int fdto);
146 int shfile_movefd_above(shfdtab *, int fdfrom, int fdmin);
147 
148 int shfile_stat(shfdtab *, const char *, struct stat *);
149 int shfile_lstat(shfdtab *, const char *, struct stat *);
150 int shfile_chdir(shfdtab *, const char *);
151 char *shfile_getcwd(shfdtab *, char *, int);
152 int shfile_access(shfdtab *, const char *, int);
153 int shfile_isatty(shfdtab *, int);
154 int shfile_cloexec(shfdtab *, int, int);
155 int shfile_ioctl(shfdtab *, int, unsigned long, void *);
156 #if defined(_MSC_VER) || defined(__OS2__)
157 # define TIOCGWINSZ         0x4201
158 typedef struct sh_winsize
159 {
160     unsigned ws_row;        /**< Rows, in characters. */
161     unsigned ws_col;        /**< Columns, in characters. */
162     unsigned ws_xpixel;     /**< Horizontal size, pixels. */
163     unsigned ws_ypixel;     /**< Vertical size, pixels. */
164 } sh_winsize;
165 #else
166 typedef struct winsize sh_winsize;
167 #endif
168 mode_t shfile_get_umask(shfdtab *);
169 void   shfile_set_umask(shfdtab *, mode_t);
170 
171 
172 typedef struct sh_dirent
173 {
174     char name[260];
175 } shdirent;
176 
177 typedef struct shdir
178 {
179     shfdtab    *pfdtab;
180     void       *native;
181     shdirent    ent;
182 #if K_OS == K_OS_WINDOWS
183     size_t      off;
184     size_t      cb;
185     char        buf[32768 - sizeof(void *) * 2 - sizeof(shdirent) * 2];
186 #endif
187 } shdir;
188 
189 shdir *shfile_opendir(shfdtab *, const char *);
190 shdirent *shfile_readdir(struct shdir *);
191 void shfile_closedir(struct shdir *);
192 
193 #endif
194 
195