{\rtf1 \ansi \deff0 {\*\comment generator: html2rtf (AT&T Labs Research) 04/01/97} {\fonttbl {\f0 \froman Times New Roman;} {\f1 \fmodern Line Printer;} {\f2 \froman Symbol;} {\f3 \fswiss Ariel;} } \fs24 {\*\comment generator: troff2html (AT&T Labs Research) 04/01/97 -mm} \par\pard\qc\li0\tx0\tx20000{\b\fs34 A\~Tour\~of\~the\~ast\~Commands\~and\~Libraries}{\b\fs30\line Glenn\~Fowler\line \line AT&T\~Labs\~-\~Research\line \line Murray\~Hill,\~NJ\~07974\line \line }\line \par\pard\fi-560\li840\tx840\tx20000{\brdrt\brdrsh\par}{\b\fs32#{\footnote HTML2RTF.1Introduction} 1\~\~Introduction} \par\pard\li840\tx840\tx20000 The {\i ast }commands and libraries were developed by the Software Engineering Research Department ({\i aka }the Advanced Software [Technology] Department) at AT&T Bell Laboratories, Murray Hill, NJ. The strength of {\i ast }is how its individual components combine to form a cohesive computing environment across UNIX\'ae and non-UNIX platforms. {\uldb FN577}{\v HTML2RTF.FN577}{\*\comment Cohesiveness*}\~[\~Footnote test. \~]\~is maintained by well-defined library interfaces for algorithms upon which the commands are built. In many cases a library implementation was the driving force behind command implementations. \par\pard\fi-560\li840\tx840\tx20000{\brdrt\brdrsh\par}{\b\fs32#{\footnote HTML2RTF.2Motivation} 2\~\~Motivation} \par\pard\li840\tx840\tx20000 Why should you consider using the {\i ast }software? After all, many of the commands look like what's already in {\f1 /bin }and {\f1 /usr/local/gnu/bin}. Although there is some replication, there are also some commands you won't find anywhere else: {\i the }ksh93, nmake, the 3d filesystem, cia, and yeast. \par\pard\fi-560\li840\tx840\tx20000{\brdrt\brdrsh\par}{\b\fs32#{\footnote HTML2RTF.3Installation} 3\~\~Installation} \par\pard\li840\tx840\tx20000 The {\i ast }software installs in a single directory hierarchy, rooted at {\f1 $INSTALLROOT}, usually {\f1 /usr/local/ast }or {\f1 /usr/add-on/ast}. The top level {\f1 $INSTALLROOT }directories are: \line {\f1\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~bin\~\~\~\~\~\~executable\~binaries\~and\~scripts\~\line \~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~fun\~\~\~\~\~\~}{\i ksh93}{\f1\~shell\~functions\~\~\~\line \~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~lib\~\~\~\~\~\~libraries\~\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~\~\~\~\~\~\~\~lib/}{\i command}{\f1\~\~\~\~\~\~related\~files\~for\~}{\i command}{\f1\~\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~\~\~\~\~\~\~\~src/cmd/}{\i xxx}{\f1\~\~\~\~\~\~source\~for\~command\~}{\i xxx}{\f1\~\~\line \~\~\~\~\~\~\~\~\~\~\~\~src/lib/lib}{\i xxx}{\f1\~\~\~\~\~\~source\~for\~library\~}{\i xxx}{\f1\~\~\line }To access the commands and related data files: \line {\f1\~\~\~\~\~\~\~\~export\~PATH=$INSTALLROOT/bin:$PATH\~\~\~\~\~\~\line }For each {\i command }that has a related data file {\i file}, {\i file }is found by searching {\f1 $PATH }for e.g., the magic file for the file command is {\f1 ../lib/file/magic }on {\f1 $PATH}. If {\f1 $HOME/bin }is before {\f1 $INSTALLROOT/bin }in {\f1 $PATH }then you can selectively override standard {\i ast }related files by placing them in the directory This allows executables to be built without hard-coded pathnames and also requires only a change in {\f1 $PATH }when {\f1 $INSTALLROOT }changes. On systems with shared libraries one of \line {\f1\~\~\~\~\~\~\~\~export\~LD_LIBRARY_PATH=$INSTALLROOT/lib:$LD_LIBRARY_PATH\~\~\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~export\~LIBPATH=$INSTALLROOT/lib:$LIBPATH\~\~\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~export\~LPATH=$INSTALLROOT/lib:$LPATH\~\~\~\~\line }is required to locate the {\i ast }shared libraries. \par\pard\li840\tx840\tx20000\par\pard\fi-560\li840\tx840\tx20000{\brdrt\brdrsh\par}{\b\fs32#{\footnote HTML2RTF.4Exploration} 4\~\~Exploration} \par\pard\li840\tx840\tx20000{\i tw }combines {\i find }and {\i xargs}. It provides C style expressions on path names and elements of {\f1 struct stat}. To find suspicious executables: \line {\f1\~\~\~\~\~\~\~\~tw\~-d\~/\~-e\~"uid=='root'\~&&\~(mode&'u+s')\~&&\~parent.uid!=uid"\~\~\~\~\~\line }to change the owner of all of bozo's files: \line {\f1\~\~\~\~\~\~\~\~tw\~-d\~/\~-e\~"uid=='bozo'"\~chown\~clown:circus\~\~\~\~\~\line }{\i tw }collects file pathname arguments up to the exec arg limit before it executes the command. For paranoid users: \line {\f1\~\~\~\~\~\~\~\~tw\~chmod\~go-rwx\~\line }which is equivalent to: \line {\f1\~\~\~\~\~\~\~\~chmod\~-R\~go-rwx\~\line }(Now you don't need to add a {\f1 -R }option to your favorite commands.) To find all source files that include {\f1 foo.h}: \line {\f1\~\~\~\~\~\~\~\~tw\~-e\~"name=='*.[chly]'"\~grep\~-l\~'^#.*include.*["<]foo.h[>"]'\~\~\~\line }{\i libast }handles the magic number matching for the {\i file }command. The magic file, {\f1 $INSTALLROOT/lib/file/magic}, is carefully constructed to give the same output across all architectures: \line {\f1\~\~\~\~\~\~\~\~cd\~$HOME/arch\~\~\~\line \~\~\~\~\~\~\~\~file\~*/bin/cat\~\~\line }might produce: \line {\f1\~\~\~\~\~\~\~\~att.i386/bin/cat:\~\~\~elf\~i386\~executable,\~32-bit,\~little-endian,\~..\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~bsd.i386/bin/cat:\~\~\~bsd\~386\~executable,\~compact,\~paged,\~pure,\~no..\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~hp.pa/bin/cat:\~\~\~\~\~\~hp\~pa-risc\~executable,\~shared,\~dynamically\~l..\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~sgi.mips2/bin/cat:\~\~elf\~mips\~executable,\~32-bit,\~dynamically\~lin..\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~sol.sun4/bin/cat:\~\~\~elf\~sparc\~executable,\~32-bit,\~dynamically\~li..\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~sun4/bin/cat:\~\~\~\~\~\~\~sun\~sparc\~executable,\~paged,\~dynamically\~lin..\~\~\~\~\~\~\line }{\i tw }uses the same interface, making it easy to search for files based on type, name and content. The following searches for executable scripts: \line {\f1\~\~\~\~\~\~\~\~tw\~-e\~"(mode&'+x')\~&&\~type!=DIR\~&&\~magic!='*executable*'"\~\~\~\~\~\~\~\line }The {\i tw }algorithm efficiently detects file system loops, so following symbolic links is not a problem. The same algorithm is used by all {\i ast }commands that traverse directory hierarchies, and the following options to control pathname resolution: {\f1\~\~\~\~\~\~\~\~-L\~(logical)\~\~\~\~\~\~\~\~\~follow\~symbolic\~links\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~-P\~(physical)\~\~\~\~\~\~\~\~don't\~follow\~symbolic\~links\~\~\~\~\~\~\~\~\line \~\~\~\~\~\~\~\~-H\~(metaphysical)\~\~\~\~-L\~for\~command\~line\~files,\~-P\~otherwise\~\~\~\~\line }The {\i ksh93 }{\i getconf }builtin controls the default traversal mode: \line {\f1\~\~\~\~\~\~\~\~getconf\~PATH_RESOLVE\~-\~\{\~logical,\~physical,\~metaphysical\~\}\~\~\~\~\~\~\line } \par\pard\fi-560\li840\tx840\tx20000{\brdrt\brdrsh\par}{\b\fs32#{\footnote HTML2RTF.5Configuration} 5\~\~Configuration} \par\pard\li840\tx840\tx20000\par\pard\fi-560\li840\tx840\tx20000{\brdrt\brdrsh\par}{\b\fs32#{\footnote HTML2RTF.6Compression} 6\~\~Compression} \par\pard\li840\tx840\tx20000\par\pard\fi-560\li840\tx840\tx20000{\brdrt\brdrsh\par}{\b\fs32#{\footnote HTML2RTF.7Conclusion} 7\~\~Conclusion} \par\pard\li840\tx840\tx20000{\brdrt\brdrsh\par}\par\pard\li0\tx0\tx20000 April 18, 1997 }