--- 00TODO 2002/01/31 10:11:43 1.14
+++ 00TODO 2002/01/31 21:14:10 1.15
@@ -1,18 +1,12 @@
00TODO: Tasks left to accomplish before rc is complete
-Spec fehlt
- Command interpreter (probably goes in rc.usecase.pod)
- Beispiel
- Default
- Error
+Unfinished business
+ What when multiple command interpreters and one --print or --eval given?
+ File rc.func totally undocumented, but logic should be clear.
Control flow
- Errors during execution
- Multiple sections given
- Wildcard 'all' given
- Both wildcard and multiple sections
- Avoid a silent failure when giving non-existent run commands (Marcus.)
- Use case - give 'restart' command in place of 'start' to stopped prog
- User assumes stop implicitly dropped if program not running
+ Explain logical ordering of multiple section spanning multiple rcfiles.
+ Give example semantics of a common scenario.
+ No error semantics in pseudocode.
Consider
Removing the OSSP_RC_DEACT deactivation feature (thl.)
@@ -20,17 +14,50 @@
Offer include directive in config file.
Dynamic handling of command interpreter option.
Environment of manpage has redundant text.
+ Interpreter option irgendwo dass hat global scope.
+ Als variable in %config Section?
Must do
- Strip local popt code, and move in OSSP popt library.
+ Strip local getopt and popt code, and use OSSP popt library.
Translate rc bourne shell script to ANSI C.
Finish man page. Start latex or Docbook guide.
If a variable is defined for which no default exists, warn user (Scholli.)
+Detailed ;-) project plan
+-------------------------
+Release v0.8
+ Milestone 1, Drop in replacement for OpenPKG.
+Release v0.9
+ Milestone 2, Additional features in build.
+Release v1.0
+ Milestone 3, Cleanup and bugfix.
+Release v1.2
+ Milestone 4, Krasse L2 Logging und eigene Sprache
+
+Dreams
+ Log to an L2 channel
+ Channel specification could go in rc.conf
+ Processing language
+ !if !else (conditional processing can cross-reference local config vars)
+ !print <var> (print something to stdout)
+ !logit <var> (log something, mstone1-3 to syslog, mstone4 to L2)
+ !lineno [LAST] (the current line number or last successful command)
+ !rcfile [EXISTS|ABSOLUTE] (info about an rcfile)
+
+ # Is there a way to merge rcfile and rc processor contexts?
+ !envarpush <string> (push an environment variable on the rc stack)
+ !envarpop (pop an environment variable from the rc stack)
+
+ !throw [var] (returns var to rc processor and ask rc to return -1)
+ !exit [var] (returns var to the rc processor and asks rc to abort execution)
+ !return <var> (signals end of section and returns var to rc processor)
+ ...
+
+
/-------------------OSSP rc Inhalt------------------\
| Manpage |
| rc.1 Section 1 oder 8-Konflict? |
- | rc-sample.5 Vielleicht umnennen rc.usecases.5 |
+ | rc-sample.5 Vielleicht umnennen rc.samples.5 |
| rc.conf.5 Beschreibung aber kein Beispiel |
| |
| Geliefert |
@@ -38,7 +65,7 @@
| rc.conf Ausgekommentet Beispiel |
| |
| Beispiele |
- | rc.example Soll rc.fooboar umgenannt werden |
+ | rc.example Soll rc.foo umgenannt werden |
\---------------------------------------------------/
Pseudocode
@@ -46,64 +73,80 @@
* psoudocode implementation of rc *
***********************************
-parse options
-read and merge all "rc.conf" files
-
-parse "Locate"
-
- Locate /cw/etc/rc.d/rc.%{RCFILE:s/^all$/*/}
- Locate /cw/local/etc/rc.d/rc.%{RCFILE:s/^all$/*/}
- Locate %{RCFILE}/.duerc
- Locate ${HOME}/.duerc:m/^<dir path="%{RCFILE}">(.*)<\/dir>/i
- Locate ${HOME}/.duerc.%{RCFILE:s/^\///:s/[\/]/-/g}
- Locate path/file/regex:regex_inside_file
-
-foreach locate {
- for each (locate all possible rcfiles after variable expansion and shell globbing) {
- continue if (absolute path seen previously) //avoid duplicates
- if (filename matches given rcfile && securitycheck(RequireUmask, RequireOwner, RequireGroup))
- load file and grab only a part of the file according to info after colon given in "locate"
+parse command line
+merge all 'rc.conf' files
+read environment variables
+build option table
+
+parse 'Locate'
+ Locate /cw/etc/rc.d/rc.%{RCFILE:s/^all$/*/}
+ Locate /cw/local/etc/rc.d/rc.%{RCFILE:s/^all$/*/}
+ Locate %{RCFILE}/.duerc
+ Locate ${HOME}/.duerc:m/^<dir path="%{RCFILE}">(.*)<\/dir>/i
+ Locate ${HOME}/.duerc.%{RCFILE:s/^\///:s/[\/]/-/g}
+ Locate path/file/regex:regex_inside_file
+
+for each 'Locate' {
+ for each (all rcfiles after variable expansion and shell globbing) {
+ apply path conversion to rcfilename
+ continue if (absolute path seen previously) // avoid duplicates
+ if (filename matches given rcfile)
+ if (securitycheck(RequireUmask, RequireOwner, RequireGroup))
+ read and strip file ('Locate' regex, after colon)
}
}
-foreach located_rcfile_fraction {
- parse rcfile into blocks according to --ParseSectionDef
- take out %config section according to --NameConfig
- take out %common section according to --NameCommon
- take out any sections given on command line
+for each rcfile_fraction {
+ parse into blocks according to --ParseSectionDef
+ take out %config section according to --NameConfig
+ take out %common section according to --NameCommon
+ take out %error section according to --NameError
+ take out %default section according to --NameDefault
+ app.mapSections; // create the section map
}
-foreach section {
+mapSections () // Map nonexisting %sections to %default
+{ // from now on, 'section' implies 'section->lookupMapval'
+ while (tempSection := ParsedCLI->nextSection) // CLI = command line iface
+ if (rcfile_fraction->has(tempSection))
+ rcfile_fraction->sectionNames += tempSection;
+ else if (rcfile_fraction->has(%default))
+ rcfile_fraction->sectionNames += %default;
+ else handle error
+}
+
+for each section on command line {
if (multiple rcfiles, i.e. all)
- sort rcfiles by section priority.
- foreach rcfile {
+ sort rcfiles by section priority (%defaults are last)
+ for each rcfile {
script = "";
script += %config from rcfile
- script += rc.env and override it
- create_script_for_rcfile(script, section, parent=no)
- expand our internal variables
- execute, print or printeval script with user & group priveleges
+ script += rc.env (overriding any duplicate values)
+ create_rcfile_script(script, section, recurse=no)
+ expand internal variables
+ execute, print, or printeval script with user & group priveleges
and command interpreter according to options or section header
}
}
EXIT
-
-create_script_for_rcfile(script, section, parent)
+create_rcfile_script(script, section, recurse)
{
- script += "${body}" //start with a pseudo value
+ script += "${body}" // start with a pseudo value
- if (!parent) { //only one rc.func!?
- replace ${body} with %common from rc.func
- if no ${body} assume prepend
+ if (!recurse) { // only one rc.func is possible
+ if no ${body} in rc.func->%common prepend ${body} to rc.func->%common
+ replace script->${body} with rc.func->%common
}
- replace ${body} with %common from rcfile
- if no ${body} assume prepend
- if (!parent) { //only one rc.func!?
- replace ${body} with %section from rc.func
- if no ${body} assume prepend
+
+ if no ${body} in rcfile->%common prepend ${body} to rcfile->%common
+ replace script->${body} with rcfile->%common
+ if (!recurse) { // only one rc.func is possible
+ if no ${body} in rc.func->%section prepend ${body} to rc.func->%section
+ replace script->${body} with rc.func->%section
}
- replace ${body} with %section from rcfile
+ replace script->${body} with rcfile->%section
- expand references using --ParseSectionRef and calling create_script_for_rcfile(section, parent=yes);
+ while (ref := ParseSectionRef(script))
+ ref->create_rcfile_script(recurse=yes);
}
|