diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2005-07-20 16:08:12 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2005-07-20 16:08:12 +0000 |
commit | e3c5dd2dd9abc3d9fe1fee4c4054c4c2a7f11395 (patch) | |
tree | 0088cf78f6694d0c7f7fe5c8380298936dac36d3 /Src | |
parent | eb86b42f304ec29a885a047ef5c681ec2ab40d1d (diff) | |
download | zsh-e3c5dd2dd9abc3d9fe1fee4c4054c4c2a7f11395.tar.gz zsh-e3c5dd2dd9abc3d9fe1fee4c4054c4c2a7f11395.tar.xz zsh-e3c5dd2dd9abc3d9fe1fee4c4054c4c2a7f11395.zip |
21498: Add zsh/newuser module
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Modules/newuser.c | 99 | ||||
-rw-r--r-- | Src/Modules/newuser.mdd | 12 | ||||
-rw-r--r-- | Src/init.c | 12 | ||||
-rw-r--r-- | Src/module.c | 107 | ||||
-rw-r--r-- | Src/zsh.mdd | 6 |
5 files changed, 194 insertions, 42 deletions
diff --git a/Src/Modules/newuser.c b/Src/Modules/newuser.c new file mode 100644 index 000000000..cbe09312f --- /dev/null +++ b/Src/Modules/newuser.c @@ -0,0 +1,99 @@ +/* + * newuser.c - handler for easy setup for new zsh users + * + * This file is part of zsh, the Z shell. + * + * Copyright (c) 2005 Peter Stephenson + * All rights reserved. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and to distribute modified versions of this software for any + * purpose, provided that the above copyright notice and the following + * two paragraphs appear in all copies of this software. + * + * In no event shall Peter Stephenson or the Zsh Development Group be liable + * to any party for direct, indirect, special, incidental, or consequential + * damages arising out of the use of this software and its documentation, + * even if Peter Stephenson and the Zsh Development Group have been advised of + * the possibility of such damage. + * + * Peter Stephenson and the Zsh Development Group specifically disclaim any + * warranties, including, but not limited to, the implied warranties of + * merchantability and fitness for a particular purpose. The software + * provided hereunder is on an "as is" basis, and Peter Stephenson and the + * Zsh Development Group have no obligation to provide maintenance, + * support, updates, enhancements, or modifications. + * + */ + +#include "newuser.mdh" +#include "newuser.pro" + +#include "../zshpaths.h" + +/**/ +int +setup_(UNUSED(Module m)) +{ + return 0; +} + +/**/ +static int +check_dotfile(const char *dotdir, const char *fname) +{ + VARARR(char, buf, strlen(dotdir) + strlen(fname) + 2); + sprintf(buf, "%s/%s", dotdir, fname); + + return access(buf, F_OK); +} + +/**/ +int +boot_(UNUSED(Module m)) +{ + const char *dotdir = getsparam("ZDOTDIR"); + const char *spaths[] = { +#ifdef SITESCRIPT_DIR + SITESCRIPT_DIR, +#endif +#ifdef SCRIPT_DIR + SCRIPT_DIR, +#endif + 0 }; + const char **sp; + + if (!dotdir) + dotdir = home; + + if (check_dotfile(dotdir, ".zshenv") == 0 || + check_dotfile(dotdir, ".zprofile") == 0 || + check_dotfile(dotdir, ".zshrc") == 0 || + check_dotfile(dotdir, ".zlogin") == 0) + return 0; + + for (sp = spaths; *sp; sp++) { + VARARR(char, buf, strlen(*sp) + 9); + sprintf(buf, "%s/newuser", *sp); + + if (!source(buf)) + break; + } + + return 0; +} + +/**/ +int +cleanup_(UNUSED(Module m)) +{ + return 0; +} + +/**/ +int +finish_(UNUSED(Module m)) +{ + return 0; +} diff --git a/Src/Modules/newuser.mdd b/Src/Modules/newuser.mdd new file mode 100644 index 000000000..419511dc3 --- /dev/null +++ b/Src/Modules/newuser.mdd @@ -0,0 +1,12 @@ +name=zsh/newuser +link=dynamic +# We will always try to load newuser, but there is +# no error if it fails. +load=no + +objects="newuser.o" + +:<<\Make +newuser.o: ../zshpaths.h + +Make diff --git a/Src/init.c b/Src/init.c index 6ec0370a3..c6fd0e4d9 100644 --- a/Src/init.c +++ b/Src/init.c @@ -948,8 +948,20 @@ run_init_scripts(void) #ifdef GLOBAL_ZSHENV source(GLOBAL_ZSHENV); #endif + if (isset(RCS) && unset(PRIVILEGED)) + { + /* + * Always attempt to load the newuser module to perform + * checks for new zsh users. Don't care if we can't load it. + */ + if (load_module_silence("zsh/newuser", 1)) { + /* Unload it immediately. */ + unload_named_module("zsh/newuser", "zsh", 1); + } + sourcehome(".zshenv"); + } if (islogin) { #ifdef GLOBAL_ZPROFILE if (isset(RCS) && isset(GLOBALRCS)) diff --git a/Src/module.c b/Src/module.c index c50e032b6..7a0fcf811 100644 --- a/Src/module.c +++ b/Src/module.c @@ -434,12 +434,12 @@ try_load_module(char const *name) /**/ static void * -do_load_module(char const *name) +do_load_module(char const *name, int silent) { void *ret; ret = try_load_module(name); - if (!ret) { + if (!ret && !silent) { int waserr = errflag; zerr("failed to load module: %s", name, 0); errflag = waserr; @@ -452,11 +452,12 @@ do_load_module(char const *name) /**/ static void * -do_load_module(char const *name) +do_load_module(char const *name, int silent) { int waserr = errflag; - zerr("failed to load module: %s", name, 0); + if (!silent) + zerr("failed to load module: %s", name, 0); errflag = waserr; return NULL; @@ -748,6 +749,13 @@ modname_ok(char const *p) mod_export int load_module(char const *name) { + return load_module_silence(name, 0); +} + +/**/ +mod_export int +load_module_silence(char const *name, int silent) +{ Module m; void *handle = NULL; Linkedmod linked; @@ -755,7 +763,8 @@ load_module(char const *name) int set; if (!modname_ok(name)) { - zerr("invalid module name `%s'", name, 0); + if (!silent) + zerr("invalid module name `%s'", name, 0); return 0; } /* @@ -766,7 +775,7 @@ load_module(char const *name) queue_signals(); if (!(node = find_module(name, 1, &name))) { if (!(linked = module_linked(name)) && - !(handle = do_load_module(name))) { + !(handle = do_load_module(name, silent))) { unqueue_signals(); return 0; } @@ -811,7 +820,7 @@ load_module(char const *name) m->flags |= MOD_BUSY; if (m->deps) for (n = firstnode(m->deps); n; incnode(n)) - if (!load_module((char *) getdata(n))) { + if (!load_module_silence((char *) getdata(n), silent)) { m->flags &= ~MOD_BUSY; unqueue_signals(); return 0; @@ -820,7 +829,7 @@ load_module(char const *name) if (!m->u.handle) { handle = NULL; if (!(linked = module_linked(name)) && - !(handle = do_load_module(name))) { + !(handle = do_load_module(name, silent))) { unqueue_signals(); return 0; } @@ -886,7 +895,7 @@ require_module(char *nam, const char *module, UNUSED(int res), int test) return 0; } } else - ret = load_module(module); + ret = load_module_silence(module, 0); unqueue_signals(); return ret; @@ -1549,6 +1558,50 @@ unload_module(Module m, LinkNode node) return 0; } + +/**/ +int +unload_named_module(char *modname, char *nam, int silent) +{ + const char *mname; + LinkNode node; + Module m; + int ret = 0; + + node = find_module(modname, 1, &mname); + if (node) { + LinkNode mn, dn; + int del = 0; + + for (mn = firstnode(modules); mn; incnode(mn)) { + m = (Module) getdata(mn); + if (m->deps && m->u.handle) + for (dn = firstnode(m->deps); dn; incnode(dn)) + if (!strcmp((char *) getdata(dn), mname)) { + if (m->flags & MOD_UNLOAD) + del = 1; + else { + zwarnnam(nam, "module %s is in use by another module and cannot be unloaded", mname, 0); + return 1; + } + } + } + m = (Module) getdata(node); + if (del) + m->wrapper++; + if (unload_module(m, node)) + ret = 1; + if (del) + m->wrapper--; + } else if (!silent) { + zwarnnam(nam, "no such module %s", modname, 0); + ret = 1; + } + + return ret; +} + + /**/ static int bin_zmodload_load(char *nam, char **args, Options ops) @@ -1558,39 +1611,9 @@ bin_zmodload_load(char *nam, char **args, Options ops) int ret = 0; if(OPT_ISSET(ops,'u')) { /* unload modules */ - const char *mname = *args; for(; *args; args++) { - node = find_module(*args, 1, &mname); - if (node) { - LinkNode mn, dn; - int del = 0; - - for (mn = firstnode(modules); mn; incnode(mn)) { - m = (Module) getdata(mn); - if (m->deps && m->u.handle) - for (dn = firstnode(m->deps); dn; incnode(dn)) - if (!strcmp((char *) getdata(dn), mname)) { - if (m->flags & MOD_UNLOAD) - del = 1; - else { - zwarnnam(nam, "module %s is in use by another module and cannot be unloaded", mname, 0); - ret = 1; - goto cont; - } - } - } - m = (Module) getdata(node); - if (del) - m->wrapper++; - if (unload_module(m, node)) - ret = 1; - if (del) - m->wrapper--; - } else if (!OPT_ISSET(ops,'i')) { - zwarnnam(nam, "no such module %s", *args, 0); + if (unload_named_module(*args, nam, OPT_ISSET(ops,'i'))) ret = 1; - } - cont: ; } return ret; } else if(!*args) { @@ -1645,7 +1668,7 @@ getconddef(int inf, char *name, int autol) /* This is a definition for an autoloaded condition, load the * * module if we haven't tried that already. */ if (f) { - load_module(p->module); + load_module_silence(p->module, 0); f = 0; p = NULL; } else { @@ -2086,7 +2109,7 @@ getmathfunc(char *name, int autol) removemathfunc(q, p); - load_module(n); + load_module_silence(n, 0); return getmathfunc(name, 0); } diff --git a/Src/zsh.mdd b/Src/zsh.mdd index e4dae2a2d..3109e6b38 100644 --- a/Src/zsh.mdd +++ b/Src/zsh.mdd @@ -38,6 +38,12 @@ version.h: $(sdir_top)/Config/version.mk zshpaths.h: Makemod $(CONFIG_INCS) @echo '#define MODULE_DIR "'$(MODDIR)'"' > zshpaths.h.tmp + @if test x$(sitescriptdir) != xno; then \ + echo '#define SITESCRIPT_DIR "'$(sitescriptdir)'"' >> zshpaths.h.tmp; \ + fi + @if test x$(scriptdir) != xno; then \ + echo '#define SCRIPT_DIR "'$(scriptdir)'"' >> zshpaths.h.tmp; \ + fi @if test x$(sitefndir) != xno; then \ echo '#define SITEFPATH_DIR "'$(sitefndir)'"' >> zshpaths.h.tmp; \ fi |