mod_export int dosetopt(int optno, int value, int force) { if(!optno) return -1; if(optno < 0) { optno = -optno; value = !value; } if (optno == RESTRICTED) { if (isset(RESTRICTED)) return value ? 0 : -1; if (value) { char **s; for (s = rparams; *s; s++) restrictparam(*s); } } else if(!force && optno == EXECOPT && !value && interact) { /* cannot set noexec when interactive */ return -1; } else if(!force && (optno == INTERACTIVE || optno == SHINSTDIN || optno == SINGLECOMMAND)) { if (opts[optno] == value) return 0; /* it is not permitted to change the value of these options */ return -1; } else if(!force && optno == USEZLE && value) { /* we require a terminal in order to use ZLE */ if(!interact || SHTTY == -1 || !shout) return -1; } else if(optno == PRIVILEGED && !value) { /* unsetting PRIVILEGED causes the shell to make itself unprivileged */ #ifdef HAVE_SETUID setuid(getuid()); setgid(getgid()); #endif /* HAVE_SETUID */ #ifndef JOB_CONTROL } else if(optno == MONITOR && value) { return -1; #endif /* not JOB_CONTROL */ #ifdef GETPWNAM_FAKED } else if(optno == CDABLEVARS && value) { return -1; #endif /* GETPWNAM_FAKED */ } else if ((optno == EMACSMODE || optno == VIMODE) && value) { (*zlesetkeymapptr)(optno); opts[(optno == EMACSMODE) ? VIMODE : EMACSMODE] = 0; } opts[optno] = value; if (optno == BANGHIST || optno == SHINSTDIN) inittyptab(); return 0; }
mod_export int dosetopt(int optno, int value, int force, char *new_opts) { if(!optno) return -1; if(optno < 0) { optno = -optno; value = !value; } if (optno == RESTRICTED) { if (isset(RESTRICTED)) return value ? 0 : -1; if (value) { char **s; for (s = rparams; *s; s++) restrictparam(*s); } } else if(!force && optno == EXECOPT && !value && interact) { /* cannot set noexec when interactive */ return -1; } else if(!force && (optno == INTERACTIVE || optno == SHINSTDIN || optno == SINGLECOMMAND)) { if (new_opts[optno] == value) return 0; /* it is not permitted to change the value of these options */ return -1; } else if(!force && optno == USEZLE && value) { /* we require a terminal in order to use ZLE */ if(!interact || SHTTY == -1 || !shout) return -1; } else if(optno == PRIVILEGED && !value) { /* unsetting PRIVILEGED causes the shell to make itself unprivileged */ #ifdef HAVE_SETUID setuid(getuid()); setgid(getgid()); if (setuid(getuid())) { zwarn("failed to change user ID: %e", errno); return -1; } else if (setgid(getgid())) { zwarn("failed to change group ID: %e", errno); return -1; } #else zwarn("setuid not available"); return -1; #endif /* not HAVE_SETUID */ #ifdef JOB_CONTROL } else if (!force && optno == MONITOR && value) { if (new_opts[optno] == value) return 0; if (SHTTY != -1) { origpgrp = GETPGRP(); acquire_pgrp(); } else return -1; #else } else if(optno == MONITOR && value) { return -1; #endif /* not JOB_CONTROL */ #ifdef GETPWNAM_FAKED } else if(optno == CDABLEVARS && value) { return -1; #endif /* GETPWNAM_FAKED */ } else if ((optno == EMACSMODE || optno == VIMODE) && value) { if (sticky && sticky->emulation) return -1; zleentry(ZLE_CMD_SET_KEYMAP, optno); new_opts[(optno == EMACSMODE) ? VIMODE : EMACSMODE] = 0; } else if (optno == SUNKEYBOARDHACK) { /* for backward compatibility */ keyboardhackchar = (value ? '`' : '\0'); } new_opts[optno] = value; if (optno == BANGHIST || optno == SHINSTDIN) inittyptab(); return 0; }