# endif
#endif
+#ifndef DEFAULTPATH_USER
+# define DEFAULTPATH_USER "/usr/local/bin:/bin:/usr/bin"
+#endif
+
+#ifndef DEFAULTPATH_ROOT
+# define DEFAULTPATH_ROOT "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
+#endif
+
+#ifndef SETENVIRONMENT
+# define SETENVIRONMENT "environment"
+#endif
+
#define USERRCFILE "rc"
#define SYSTEMUSERVCONFIGDIR "userv"
#define SHELLLIST "shells"
#define DEFAULTINCLUDELOOKUP ":default"
#define EMPTYINCLUDELOOKUP ":empty"
-#define USERDIRPREFIX USERDIR DIRSEP
+#define USERDIRPREFIX USERDIR "/"
#define USERCONFIGDIRBASE SYSTEMUSERVCONFIGDIR
#define USERCONFIGDIR HIDDENPREFIX USERCONFIGDIRBASE
-#define USERUSERVCONFIGPATH USERDIR DIRSEP USERCONFIGDIR
-#define USERRCFILEPATH USERUSERVCONFIGPATH DIRSEP USERRCFILE
-#define SYSTEMUSERVCONFIGPATH SYSTEMCONFIGDIR DIRSEP SYSTEMUSERVCONFIGDIR
-#define SYSTEMRCFILEDEFAULTPATH SYSTEMUSERVCONFIGPATH DIRSEP SYSTEMRCFILEDEFAULT
-#define SYSTEMRCFILEOVERRIDEPATH SYSTEMUSERVCONFIGPATH DIRSEP SYSTEMRCFILEOVERRIDE
-#define SHELLLISTPATH SYSTEMCONFIGDIR DIRSEP SHELLLIST
+#define USERUSERVCONFIGPATH USERDIR "/" USERCONFIGDIR
+#define USERRCFILEPATH USERUSERVCONFIGPATH "/" USERRCFILE
+#define SYSTEMUSERVCONFIGPATH SYSTEMCONFIGDIR "/" SYSTEMUSERVCONFIGDIR
+#define SYSTEMRCFILEDEFAULTPATH SYSTEMUSERVCONFIGPATH "/" SYSTEMRCFILEDEFAULT
+#define SYSTEMRCFILEOVERRIDEPATH SYSTEMUSERVCONFIGPATH "/" SYSTEMRCFILEOVERRIDE
+#define SHELLLISTPATH SYSTEMCONFIGDIR "/" SHELLLIST
+#define SETENVIRONMENTPATH SYSTEMCONFIGDIR "/" SETENVIRONMENT
#define USERDIR "~"
#define HIDDENPREFIX "."
#define MAX_ERRMSG_LEN 2048
#define ERRMSG_RESERVE_ERRNO 128
-int parse_string(const char *string, const char *descrip);
+int parse_string(const char *string, const char *descrip, int isinternal);
void parseerrprint(const char *fmt, ...) PRINTFFORMAT(1,2);
void ensurelogopen(int wantfacility);
void ensurefdarray(int fd);
pid_t nondebug_fork(void);
const char *nondebug_serviceuserdir(const char *ifnondebug);
+void execservice(const int synchsocket[], int clientfd) NONRETURNING;
+void servicerequest(int sfd) NONRETURNING;
+int synchread(int fd, int ch);
+
struct fdstate {
int iswrite, realfd, holdfd;
int wantstate;
/* tokv_word_read, tokv_word_write */
};
-extern gid_t *gidarray;
extern char **argarray;
extern char *((*defvararray)[2]);
extern struct fdstate *fdarray; /* indexed by nominal fd */
extern char *serviceuser, *service, *logname, *cwd;
extern char *overridedata, *userrcfile;
extern char *serviceuser_dir, *serviceuser_shell, *callinguser_shell;
-extern uid_t serviceuser_uid, callinguser_uid;
-extern gid_t serviceuser_gid;
+extern int service_ngids;
+extern gid_t *calling_gids, *service_gids;
+extern const char **calling_groups, **service_groups;
+extern uid_t serviceuser_uid;
extern char *execpath, **execargs;
extern int execute; /* One of the execution modes tokt_execmode */
extern int setenvironment, suppressargs, disconnecthup;
-extern int ehandling; /* One of the error handling modes tokt_ehandlemode */
-extern int ehlogfacility, ehloglevel, syslogopenfacility, ehfilekeep;
-extern FILE *ehfile;
-extern char *ehfilename;
+extern int syslogopenfacility;
#endif