4 * The shell instance methods.
6 * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
9 * This file is part of kBuild.
11 * kBuild is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * kBuild is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with kBuild; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 extern char **environ
;
34 #include "shinstance.h"
38 * Creates a root shell instance.
40 * @param inherit The shell to inherit from. If NULL inherit from environment and such.
41 * @param argc The argument count.
42 * @param argv The argument vector.
44 * @returns pointer to root shell on success, NULL on failure.
46 shinstance
*sh_create_root_shell(shinstance
*inherit
, int argc
, char **argv
)
50 psh
= calloc(sizeof(*psh
), 1);
53 /* the special stuff. */
61 psh
->stacknleft
= MINSIZE
;
63 psh
->stackp
= &psh
->stackbase
;
64 psh
->stacknxt
= psh
->stackbase
.space
;
68 psh
->init_editline
= 0;
69 psh
->parsefile
= &psh
->basepf
;
72 psh
->output
.bufsize
= OUTBUFSIZ
;
74 psh
->output
.psh
= psh
;
75 psh
->errout
.bufsize
= 100;
77 psh
->errout
.psh
= psh
;
78 psh
->memout
.fd
= MEM_OUT
;
79 psh
->memout
.psh
= psh
;
80 psh
->out1
= &psh
->output
;
81 psh
->out2
= &psh
->errout
;
95 char *sh_getenv(shinstance
*psh
, const char *var
)
97 #ifdef SH_PURE_STUB_MODE
99 #elif defined(SH_STUB_MODE)
105 char **sh_environ(shinstance
*psh
)
107 #ifdef SH_PURE_STUB_MODE
108 static char *s_null
[2] = {0,0};
110 #elif defined(SH_STUB_MODE)
116 const char *sh_gethomedir(shinstance
*psh
, const char *user
)
118 #ifdef SH_PURE_STUB_MODE
120 #elif defined(SH_STUB_MODE)
124 struct passwd
*pwd
= getpwnam(user
);
125 return pwd
? pwd
->pw_dir
: NULL
;
131 int sh_sigaction(shinstance
*psh
, int signo
, const struct shsigaction
*newp
, struct shsigaction
*oldp
)
133 #ifdef SH_PURE_STUB_MODE
135 #elif defined(SH_STUB_MODE)
139 struct sigaction old
;
142 if (sigaction(signo
, NULL
, &old
))
144 oldp
->sh_flags
= old
.sa_flags
;
145 oldp
->sh_handler
= old
.sa_handler
;
146 oldp
->sh_mask
= old
.sa_mask
;
153 shsig_t
sh_signal(shinstance
*psh
, int signo
, shsig_t handler
)
158 int sh_siginterrupt(shinstance
*psh
, int signo
, int interrupt
)
163 void sh_sigemptyset(shsigset_t
*setp
)
165 memset(setp
, 0, sizeof(*setp
));
168 int sh_sigprocmask(shinstance
*psh
, int operation
, shsigset_t
const *newp
, shsigset_t
*oldp
)
173 void sh_abort(shinstance
*psh
)
175 #ifdef SH_PURE_STUB_MODE
176 #elif defined(SH_STUB_MODE)
182 void sh_raise_sigint(shinstance
*psh
)
184 #ifdef SH_PURE_STUB_MODE
185 #elif defined(SH_STUB_MODE)
191 int sh_kill(shinstance
*psh
, pid_t pid
, int signo
)
193 #ifdef SH_PURE_STUB_MODE
195 #elif defined(SH_STUB_MODE)
199 //fprintf(stderr, "kill(%d, %d)\n", pid, signo);
200 return kill(pid
, signo
);
206 int sh_killpg(shinstance
*psh
, pid_t pgid
, int signo
)
208 #ifdef SH_PURE_STUB_MODE
210 #elif defined(SH_STUB_MODE)
214 //fprintf(stderr, "killpg(%d, %d)\n", pgid, signo);
215 return killpg(pgid
, signo
);
221 clock_t sh_times(shinstance
*psh
, shtms
*tmsp
)
223 #ifdef SH_PURE_STUB_MODE
225 #elif defined(SH_STUB_MODE)
235 int sh_sysconf_clk_tck(void)
237 #ifdef SH_PURE_STUB_MODE
243 return sysconf(_SC_CLK_TCK
);
248 pid_t
sh_fork(shinstance
*psh
)
250 #ifdef SH_PURE_STUB_MODE
252 #elif defined(SH_STUB_MODE)
262 pid_t
sh_waitpid(shinstance
*psh
, pid_t pid
, int *statusp
, int flags
)
265 #ifdef SH_PURE_STUB_MODE
267 #elif defined(SH_STUB_MODE)
271 pid
= waitpid(pid
, statusp
, flags
);
272 //fprintf(stderr, "waitpid -> %d *statusp=%d (rc=%d) flags=%#x\n", pid, *statusp, WEXITSTATUS(*statusp), flags);
279 void sh__exit(shinstance
*psh
, int rc
)
281 #ifdef SH_PURE_STUB_MODE
283 #elif defined(SH_STUB_MODE)
289 int sh_execve(shinstance
*psh
, const char *exe
, const char * const *argv
, const char * const *envp
)
291 #ifdef SH_PURE_STUB_MODE
293 #elif defined(SH_STUB_MODE)
297 return execve(exe
, (char **)argv
, (char **)envp
);
303 uid_t
sh_getuid(shinstance
*psh
)
305 #ifdef SH_PURE_STUB_MODE
307 #elif defined(SH_STUB_MODE)
317 uid_t
sh_geteuid(shinstance
*psh
)
319 #ifdef SH_PURE_STUB_MODE
321 #elif defined(SH_STUB_MODE)
331 gid_t
sh_getgid(shinstance
*psh
)
333 #ifdef SH_PURE_STUB_MODE
335 #elif defined(SH_STUB_MODE)
345 gid_t
sh_getegid(shinstance
*psh
)
347 #ifdef SH_PURE_STUB_MODE
349 #elif defined(SH_STUB_MODE)
359 pid_t
sh_getpid(shinstance
*psh
)
361 #ifdef SH_PURE_STUB_MODE
363 #elif defined(SH_STUB_MODE)
373 pid_t
sh_getpgrp(shinstance
*psh
)
375 #ifdef SH_PURE_STUB_MODE
377 #elif defined(SH_STUB_MODE)
387 pid_t
sh_getpgid(shinstance
*psh
, pid_t pid
)
389 #ifdef SH_PURE_STUB_MODE
391 #elif defined(SH_STUB_MODE)
401 int sh_setpgid(shinstance
*psh
, pid_t pid
, pid_t pgid
)
403 #ifdef SH_PURE_STUB_MODE
405 #elif defined(SH_STUB_MODE)
410 rc
= setpgid(pid
, pgid
);
411 //fprintf(stderr, "setpgid(%d,%d) -> %d\n", pid, pgid, rc);
418 pid_t
sh_tcgetpgrp(shinstance
*psh
, int fd
)
420 #ifdef SH_PURE_STUB_MODE
422 #elif defined(SH_STUB_MODE)
426 return tcgetpgrp(fd
);
432 int sh_tcsetpgrp(shinstance
*psh
, int fd
, pid_t pgrp
)
434 #ifdef SH_PURE_STUB_MODE
436 #elif defined(SH_STUB_MODE)
440 return tcsetpgrp(fd
, pgrp
);
446 int sh_getrlimit(shinstance
*psh
, int resid
, shrlimit
*limp
)
448 #ifdef SH_PURE_STUB_MODE
450 #elif defined(SH_STUB_MODE)
454 return getrlimit(resid
, limp
);
460 int sh_setrlimit(shinstance
*psh
, int resid
, const shrlimit
*limp
)
462 #ifdef SH_PURE_STUB_MODE
464 #elif defined(SH_STUB_MODE)
468 return setrlimit(resid
, limp
);