murderuus wiki
This commit is contained in:
commit
cab8833a3d
7
wiki/css/stylesheet.css
Normal file
7
wiki/css/stylesheet.css
Normal file
@ -0,0 +1,7 @@
|
||||
a{ color: #ABCDEF; }
|
||||
a:hover{ color: #FF0000; }
|
||||
body{
|
||||
background-color: #000;
|
||||
color: #EFECFC;
|
||||
}
|
||||
h1, h2, h3{ font-style: italic; }
|
19
wiki/index.html
Normal file
19
wiki/index.html
Normal file
@ -0,0 +1,19 @@
|
||||
<!DOCTYPE html>
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META CHARSET="US-ASCII" />
|
||||
<META CONTENT="murderu.us wiki" NAME="description" />
|
||||
<META CONTENT="noindex" NAME="googlebot" /> <!-- FUCK GOOGLE -->
|
||||
<META CONTENT="interest-cohort=()" HTTP-EQUIV="Permissions-Policy" /> <!-- FUCK GOOGLE -->
|
||||
<META CONTENT="width=device-width, initial-scale=1" NAME="viewport" />
|
||||
<LINK HREF="https://wiki.murderu.us/" REL="canonical" />
|
||||
<LINK HREF="css/stylesheet.css" REL="stylesheet" />
|
||||
<TITLE>murderu.us</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<H1>WIKI.<A HREF="https://murderu.us">MURDERU.US</A></H1>
|
||||
<UL><B>
|
||||
<LI><A HREF="unix/">UNIX</A></LI>
|
||||
</B></UL>
|
||||
</BODY>
|
||||
</HTML>
|
112
wiki/unix/C.m4
Normal file
112
wiki/unix/C.m4
Normal file
@ -0,0 +1,112 @@
|
||||
_header(`C')
|
||||
<P>
|
||||
For compilation, _man(`tcc(1)'), _man(`gcc(1)'), and _man(`clang(1)') are all reasonable choices depending on your needs.
|
||||
</P>
|
||||
<P>
|
||||
On Alpine Linux, the standard library headers are in the _code(`musl-dev') package.
|
||||
</P>
|
||||
<P>
|
||||
In most system package managers, standard library documentation can be found in the _code(`man-pages') and _code(`man-pages-posix') packages.
|
||||
</P>
|
||||
<P>
|
||||
Many Linux software distributions' system package managers have meta-packages that pull all necessities for C development as dependencies.
|
||||
Alpine has _code(`build-base') and Debian has _code(`build-essential').
|
||||
</P>
|
||||
<P>
|
||||
For linking to libraries, see _ref(`#pkg-config').
|
||||
</P>
|
||||
|
||||
_subheader(`Prototypical C (1978)')
|
||||
<UL>
|
||||
<LI><A HREF="https://archive.org/details/TheCProgrammingLanguageFirstEdition">The C Programming Language, 1st ed.</A> (The Internet Archive)</LI>
|
||||
<LI><A HREF="https://www.bell-labs.com/usr/dmr/www/cman.pdf">C Reference Manual</A> (this paper bears striking similarity to and was also written by the author of Appendix A of <I>The C Programming Language, 1st ed.</I> - the chronology of these writings' release is unknown)</LI>
|
||||
<LI><A HREF="https://arstechnica.com/features/2020/12/a-damn-stupid-thing-to-do-the-origins-of-c/">"A damn stupid thing to do" - the origins of C</A></LI>
|
||||
<LI><A HREF="https://www.bell-labs.com/usr/dmr/www/chist.html">The Development of the C Language</A></LI>
|
||||
<LI><A HREF="http://pdp11.aiju.de/">PDP-11 Emulator</A></LI>
|
||||
</UL>
|
||||
<P>
|
||||
The C programming language was first described to the public in <I>The C Programming Language</I> by Brian W. Kernighan and Dennis M. Ritchie, published by Prentice Hall in 1978.
|
||||
The language evolved out of the former B programming language, which was a product of Ken Thompson:
|
||||
</P>
|
||||
<FIGURE>
|
||||
<BLOCKQUOTE>
|
||||
<P>Challenged by McIlroy's feat in reproducing TMG, Thompson decided that Unix—possibly it had not even been named yet—needed a system programming language. After a rapidly scuttled attempt at Fortran, he created instead a language of his own, which he called B. B can be thought of as C without types; more accurately, it is BCPL squeezed into 8K bytes of memory and filtered through Thompson's brain. Its name most probably represents a contraction of BCPL, though an alternate theory holds that it derives from Bon [Thompson 69], an unrelated language created by Thompson during the Multics days. Bon in turn was named either after his wife Bonnie, or (according to an encyclopedia quotation in its manual), after a religion whose rituals involve the murmuring of magic formulas.</P>
|
||||
</BLOCKQUOTE>
|
||||
<FIGCAPTION>(<CITE>The Development of the C Language</CITE>)</FIGCAPTION>
|
||||
</FIGURE>
|
||||
<P>[Thompson 69] references <CODE>K. Thompson, `Bon—an Interactive Language,' undated AT&T Bell Laboratories internal memorandum (ca. 1969)</CODE>. This is possibly <A HREF="http://people.csail.mit.edu/saltzer/Multics/MHP-Saltzer-060508/filedrawers/180.btl-misc/Scan%204.PDF">Bon User's Manual</A>.
|
||||
Please get in touch if you have a hyperlink for this document as I can't find it indexed on any search engines.</P>
|
||||
<P>
|
||||
This language described in <I>The C Programming Language</I> isn't the C programming language known by most.
|
||||
It was a pre-standardization, relatively prototypical C, and rather than being codified in ANSI its primary documentation was the book by Kernighan and Ritchie (this book would later be known colloquially as <I>K&R</I>).
|
||||
This was known as "pre-ANSI C" or "K&R C" and dubbed "C78" for the purposes of naming this page, in the same style as the later "C89", described in ANSI X3.159-1989, or "C11", described in ISO/IEC 9899:2011.
|
||||
"C78" was also the name given to historical C by the <CODE>c78(7)</CODE> manual page on FreeBSD 9.0.
|
||||
</P>
|
||||
<P>
|
||||
"C78" is incompatible with "C89" and later standards.
|
||||
This page documents those incompatibilities and relative oddities.
|
||||
</P>
|
||||
<P>
|
||||
I have never done (and probably never will do) extensive programming in pre-ANSI C.
|
||||
These incompatibilities were discovered out of Appendix C in <I>The C Programming Language, 2nd ed.</I> but are described further.
|
||||
</P>
|
||||
<H4 ID="octal89"><CODE>8</CODE> and <CODE>9</CODE> as valid octal digits</H4>
|
||||
<UL>
|
||||
<LI><A HREF="https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/c">UNIX V6 C compiler source directory</A></LI>
|
||||
</UL>
|
||||
<PRE>
|
||||
main()
|
||||
{
|
||||
printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",
|
||||
00, 01, 02, 03, 04, 05, 06, 07, 08, 09
|
||||
);
|
||||
}
|
||||
</PRE>
|
||||
<P>
|
||||
On my machine, the GNU C compiler emits the following errors (this omits warnings) for the preceding piece of code:
|
||||
</P>
|
||||
<PRE>
|
||||
snippet.c:4:49: error: invalid digit "8" in octal constant
|
||||
4 | 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
|
||||
| ^~
|
||||
snippet.c:4:53: error: invalid digit "9" in octal constant
|
||||
4 | 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
|
||||
| ^~
|
||||
</PRE>
|
||||
<P>
|
||||
This is because in C (both pre-standardization and post-ANSI) integer constants with leading zeroes are parsed as octal (base 8) numbers.
|
||||
In pre-ANSI C, <CODE>8</CODE> and <CODE>9</CODE> were valid octal digits corresponding to <CODE>010</CODE>(b8) and <CODE>011</CODE>(b8).
|
||||
This is documented in <I>The C Programming Language</I>, Appendix A, subsection 2.4.1, and evidenced by the preceding code block.
|
||||
The following is output of the compiled program in UNIX V6 on an emulated PDP-11:
|
||||
</P>
|
||||
<PRE>
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
</PRE>
|
||||
<P>
|
||||
This behavior exists within <CODE>/usr/source/c/c0t.s</CODE>, which is a PDP-11 assembler file that parses integer constants (as far as I can tell).
|
||||
This file provides <CODE>getnum</CODE>, a function used in <CODE>/usr/source/c/c00.c</CODE>.
|
||||
My theory is that this behavior is a side-effect of a very efficient but imperfect method of parsing integer constants from a file stream.
|
||||
</P>
|
||||
<P>
|
||||
This wouldn't be a significant or even noticeable error; most programmers wouldn't use <CODE>8</CODE> or <CODE>9</CODE> as octal digits anyway.
|
||||
If not for its documentation within <I>The C Programming Language</I> it would probably be an obscure bug.
|
||||
This is also mentioned in <I>The C Programming Language, 2nd ed.</I> in Appendix C.
|
||||
</P>
|
||||
_subheader(`C1989')
|
||||
_subheader(`C1999')
|
||||
<UL>
|
||||
<LI>_link(`C99', `https://en.wikipedia.org/wiki/C99') (Wikipedia)</LI>
|
||||
<LI>_link(`c99(1p)', `https://www.man7.org/linux/man-pages/man1/c99.1p.html')</LI>
|
||||
</UL>
|
||||
_subheader(`C2011')
|
||||
_subheader(`C2017')
|
||||
_subheader(`C202x')
|
33
wiki/unix/Makefile
Normal file
33
wiki/unix/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
SOURCES = \
|
||||
../wiki.m4 \
|
||||
macros.m4 \
|
||||
foreword.m4 \
|
||||
unix.m4 \
|
||||
posix.m4 \
|
||||
acpi.m4 \
|
||||
C.m4 \
|
||||
culture.m4 \
|
||||
doas.m4 \
|
||||
editing.m4 \
|
||||
fonts.m4 \
|
||||
fstab.m4 \
|
||||
linux.m4 \
|
||||
m4.m4 \
|
||||
netbsd.m4 \
|
||||
manual.m4 \
|
||||
multitasking.m4 \
|
||||
pci.m4 \
|
||||
telepathy.m4 \
|
||||
wifi.m4 \
|
||||
volumes.m4 \
|
||||
X.m4
|
||||
|
||||
RM = rm -rf
|
||||
|
||||
index.html: index.m4 $(SOURCES)
|
||||
m4 index.m4 >index.html
|
||||
|
||||
clean:
|
||||
$(RM) index.html
|
||||
|
||||
.PHONY: clean
|
71
wiki/unix/X.m4
Normal file
71
wiki/unix/X.m4
Normal file
@ -0,0 +1,71 @@
|
||||
<H2>X</H2>
|
||||
<UL>
|
||||
<LI><A HREF="http://cyber.dabamos.de/unix/x11/">Cool, but obscure X11 tools</A></LI>
|
||||
<LI><A HREF="https://wiki.archlinux.org/title/Xorg">Xorg</A> (Arch Wiki)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
X is a graphical windowing system that can be used on Linux, FreeBSD, OpenBSD, NetBSD, and some proprietary operating systems as well.
|
||||
X is not the only windowing system; <CODE>twin(1)</CODE> exists for windowed multitasking within a framebuffer and Wayland is another windowing system intended to replace X.
|
||||
</P>
|
||||
<P>
|
||||
Some Linux software distributions have included scripts to automatically fetch and install an X server.
|
||||
Alpine has <CODE>setup-xorg-base</CODE>, which adds the packages <CODE>xorg-server</CODE>, <CODE>xf86-input-libinput</CODE>, <CODE>eudev</CODE>, and <CODE>mesa</CODE>, and then enables the OpenRC services for udev.
|
||||
</P>
|
||||
|
||||
<H3>Mail</H3>
|
||||
<P>
|
||||
The (formerly Mozilla) Thunderbird mail suite is a popular though maximal choice.
|
||||
Claws Mail is a nice mail reader with a somewhat similar interface to Thunderbird but, in my experience, easier to use.
|
||||
</P>
|
||||
|
||||
<H3>Media</H3>
|
||||
<P>
|
||||
<CODE>mpv(1)</CODE> and <CODE>vlc(1)</CODE> are good options.
|
||||
</P>
|
||||
|
||||
<H3>Server</H3>
|
||||
|
||||
<H4>X.org</H4>
|
||||
<UL>
|
||||
<LI><A HREF="X.org">https://www.x.org/</A></LI>
|
||||
<LI><A HREF="X.Org Server">https://en.wikipedia.org/wiki/X.Org_Server</A> (Wikipedia)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
The de-facto standard X server is X.org (available on the web at _literal_link(https://www.X.org)).
|
||||
NetBSD uses X.org as the default system X server.
|
||||
</P>
|
||||
<P>
|
||||
Arch Linux's package repositories have <CODE><A HREF="xorg">https://archlinux.org/groups/x86_64/xorg/</A></CODE>,
|
||||
<CODE><A HREF="xorg-apps">https://archlinux.org/groups/x86_64/xorg-apps/</A></CODE>,
|
||||
and <CODE><A HREF="xorg-drivers">https://archlinux.org/groups/x86_64/xorg-drivers/</A></CODE> package groups.
|
||||
<A HREF="pkgsrc">#pkgsrc</A> has _code(`meta-pkgs/modular-xorg').
|
||||
</P>
|
||||
<H5><CODE>Failed to open /dev/input/event[<I>number</I>] (Permission denied)</CODE></H6>
|
||||
<P>You need to be a part of the <CODE>input</CODE> group to use X.org.</P>
|
||||
<H5><CODE>Failed to open /dev/tty[<I>number</I>] (Permission denied)</CODE></H6>
|
||||
<P>You need to be a part of the <CODE>video</CODE> group to use X.org.</P>
|
||||
|
||||
<H3>Window Management</H3>
|
||||
<P>
|
||||
It's possible to make X <CODE>exec(3)</CODE> a window manager at the end of initialization to ease the creation, deletion, and manipulation of windows.
|
||||
Contrary to what is now popular belief, window managers are not necessary (thought they're extremely convenient compared to the lack of them).
|
||||
</P>
|
||||
<H4>ctwm</H4>
|
||||
<UL>
|
||||
<LI><A HREF="https://datagubbe.se/twm/">Configurations for ctwm (and twm)</A></LI>
|
||||
</UL>
|
||||
|
||||
<H3>Web Browsing</H3>
|
||||
<H4>TOR Browser</H4>
|
||||
<P>
|
||||
TOR Browser is available through pkgsrc at <CODE>security/tor-browser</CODE>.
|
||||
</P>
|
||||
|
||||
<H3>xinit(1)</H3>
|
||||
<P>
|
||||
<CODE>startx(1)</CODE> is usually included with <CODE>xinit(1)</CODE>.
|
||||
</P>
|
||||
<P>
|
||||
On Alpine Linux, <CODE>xinit(1)</CODE> is provided by the <CODE>xinit</CODE> package.
|
||||
On Arch Linux, <CODE>xinit(1)</CODE> is provided by <CODE><A HREF="xorg-xinit">https://archlinux.org/packages/extra/x86_64/xorg-xinit/</A></CODE>.
|
||||
</P>
|
13
wiki/unix/acpi.m4
Normal file
13
wiki/unix/acpi.m4
Normal file
@ -0,0 +1,13 @@
|
||||
_header(`ACPI')
|
||||
<P><I>Advanced Configuration and Power Interface</I></P>
|
||||
_bibliography(`
|
||||
_bentr(`_link(`Advanced Configuration and Power Interface', `https://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface') (Wikipedia)')
|
||||
')
|
||||
<P>
|
||||
The Advanced Configuration and Power Interface, or ACPI, is the interface through which the operating system and client programs can control features in your computer's firmware.
|
||||
Usually this is used with an ACPI client or opaquely controlled by the operating environment.
|
||||
</P>
|
||||
<P>
|
||||
On Linux, see _ref(`#Linux#ACPI').
|
||||
On NetBSD, see _man(`acpi(4)').
|
||||
</P>
|
5
wiki/unix/culture.m4
Normal file
5
wiki/unix/culture.m4
Normal file
@ -0,0 +1,5 @@
|
||||
_header(`Culture')
|
||||
_subheader(`Pronunciation')
|
||||
_bibliography(`
|
||||
_bentry(`_link(`Common pronunciations of Linux directories, commands, etc', `https://www.linux.org/threads/common-pronunciations-of-linux-directories-commands-etc.4445/')')
|
||||
')
|
24
wiki/unix/doas.m4
Normal file
24
wiki/unix/doas.m4
Normal file
@ -0,0 +1,24 @@
|
||||
_header(`doas(1)')
|
||||
_bibliography(`
|
||||
_bentr(`_link(`doas(1)', `http://man.openbsd.org/doas.1') (OpenBSD)')
|
||||
_bentr(`_link(`doas.conf(5)', `http://man.openbsd.org/doas.conf.5') (OpenBSD)')
|
||||
_bentr(`_link(`doas mastery', `https://flak.tedunangst.com/post/doas-mastery')')
|
||||
')
|
||||
<P>
|
||||
<CITE>doas(1)</CITE> is a systems administration tool that performs a command as a different user.
|
||||
<CITE>doas(1)</CITE> is configured in <CITE>doas.conf(5)</CITE>.
|
||||
</P>
|
||||
<P>
|
||||
For a pretty typical configuration, where users in the <I>wheel</I> group are meant to be administrating the system, the set-up session usually looks something like this:
|
||||
</P>
|
||||
<PRE>
|
||||
$ su
|
||||
# ed /etc/doas.conf
|
||||
/etc/doas.conf: No such file or directory
|
||||
a
|
||||
permit :wheel
|
||||
.
|
||||
w
|
||||
14
|
||||
q
|
||||
</PRE>
|
13
wiki/unix/editing.m4
Normal file
13
wiki/unix/editing.m4
Normal file
@ -0,0 +1,13 @@
|
||||
_header(`Editing')
|
||||
_subheader(`emacs')
|
||||
<P>
|
||||
Emacs ("editor macros") is a text editor with a very powerful Lisp interpreter included.
|
||||
</P>
|
||||
_subheader(`nano(1)')
|
||||
<P>
|
||||
_man(`nano(1)') is a text editor that's usually recommended for beginners because of its lack of edit <I>modes</I> and its similar controls to popular editors from outside of UNIX.
|
||||
</P>
|
||||
_subheader(`ne(1)')
|
||||
<P>
|
||||
_man(`ne(1)') is similar to _man(`nano(1)') but has a different featureset.
|
||||
</P>
|
1
wiki/unix/fonts.m4
Normal file
1
wiki/unix/fonts.m4
Normal file
@ -0,0 +1 @@
|
||||
_header(`Fonts')
|
5
wiki/unix/foreword.m4
Normal file
5
wiki/unix/foreword.m4
Normal file
@ -0,0 +1,5 @@
|
||||
<H2>Foreword</H2>
|
||||
<P>
|
||||
This wiki page is the work of many Anonymous authors.
|
||||
Please support our type of Internet denizen by getting into trouble.
|
||||
</P>
|
4
wiki/unix/fstab.m4
Normal file
4
wiki/unix/fstab.m4
Normal file
@ -0,0 +1,4 @@
|
||||
_header(`fstab')
|
||||
<P>See _man(`fstab(5)').</P>
|
||||
<P>postmarketOS requires that the _code(`localmount') OpenRC service be enabled for the system to read _man(`fstab(5)').
|
||||
<P>Arch and Artix have fstab generators at _man(`genfstab(8)') and _man(`fstabgen(8)') respectively in their installation scripts.</P>
|
59
wiki/unix/index.m4
Normal file
59
wiki/unix/index.m4
Normal file
@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<HTML LANG="en">
|
||||
<HEAD>
|
||||
<META CHARSET="UTF-8" />
|
||||
<META CONTENT="Unix is a multitasking operating system designed with simplicity in mind." NAME="description" />
|
||||
<META CONTENT="noindex" NAME="googlebot" /> <!-- FUCK GOOGLE -->
|
||||
<META CONTENT="interest-cohort=()" HTTP-EQUIV="Permissions-Policy" /> <!-- FUCK GOOGLE -->
|
||||
<META CONTENT="width=device-width, initial-scale=1" NAME="viewport" />
|
||||
<LINK HREF="https://wiki.murderu.us/unix" REL="canonical" />
|
||||
<LINK HREF="../css/stylesheet.css" REL="stylesheet" />
|
||||
<TITLE>UNIX - wiki.murderu.us</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
include(`../wiki.m4')
|
||||
include(`macros.m4')
|
||||
<H1><A HREF="https://wiki.murderu.us/">wiki.murderu.us</A>/unix</H1>
|
||||
|
||||
include(`foreword.m4')
|
||||
|
||||
include(`unix.m4')
|
||||
|
||||
include(`posix.m4')
|
||||
|
||||
include(`acpi.m4')
|
||||
|
||||
include(`C.m4')
|
||||
|
||||
include(`culture.m4')
|
||||
|
||||
include(`doas.m4')
|
||||
|
||||
include(`editing.m4')
|
||||
|
||||
include(`fonts.m4')
|
||||
|
||||
include(`fstab.m4')
|
||||
|
||||
include(`linux.m4')
|
||||
|
||||
include(`m4.m4')
|
||||
|
||||
include(`netbsd.m4')
|
||||
|
||||
include(`manual.m4')
|
||||
|
||||
include(`multitasking.m4')
|
||||
|
||||
include(`pci.m4')
|
||||
|
||||
include(`telepathy.m4')
|
||||
|
||||
include(`wifi.m4')
|
||||
|
||||
include(`volumes.m4')
|
||||
|
||||
include(`X.m4')
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
229
wiki/unix/linux.m4
Normal file
229
wiki/unix/linux.m4
Normal file
@ -0,0 +1,229 @@
|
||||
_header(`Linux')
|
||||
<UL>
|
||||
<LI>_link(`How to Linux', `http://tldp.yolinux.com/HOWTO/subdir/HOWTO-INDEX.html')</LI>
|
||||
<LI>_link(`How to Use User Mode Linux', `https://christine.website/blog/howto-usermode-linux-2019-07-07')</LI>
|
||||
<LI><A HREF="https://www.cs.cmu.edu/~awb/linux.history.html">LINUX's History</A></LI>
|
||||
<LI>_link(`The Linux Kernel documentation', `https://www.kernel.org/doc/html/v4.17/index.html')</LI>
|
||||
<LI>_link(`LINUX is obsolete', `https://groups.google.com/g/comp.os.minix/c/wlhw16QWltI')</LI>
|
||||
<LI>_link(`Linux From Scratch', `http://www.linuxfromscratch.org/')</LI>
|
||||
<LI>_link(`Move your Linux from BIOS to UEFI in place', `https://www.redhat.com/sysadmin/bios-uefi')</LI>
|
||||
<LI><A HREF="https://www.collabora.com/news-and-blog/blog/2020/08/27/using-the-linux-kernel-case-insensitive-feature-in-ext4/">Using the Linux kernel's Case-insensitive feature in Ext4</A></LI>
|
||||
</UL>
|
||||
|
||||
<H3 ID="#Linux#ACPI">ACPI</H3>
|
||||
_bibliography(`
|
||||
_bentr(`_ref(`#ACPI')')
|
||||
')
|
||||
<P>
|
||||
logind (as part of SystemD), elogind, acpid, and many desktop environments can manage ACPI events automatically, and sometimes this is configured by default as part of a Linux software distribution.
|
||||
</P>
|
||||
_subsubheader(`acpid(8)')
|
||||
_bibliography(`
|
||||
_bentr(`_link(`acpid', `https://sourceforge.net/projects/acpid2/')')
|
||||
')
|
||||
<P>
|
||||
_man(`acpid(8)') is a daemon that can automatically manage ACPI events on Linux.
|
||||
</P>
|
||||
|
||||
_subheader(`Audio')
|
||||
<P>
|
||||
Most audio servers recommend that they be run in userspace with user privileges, with PulseAudio going so far as to exiting when run as root without additional configuration.
|
||||
The Alpine wiki currently recommends _man(`pipewire(1)'), with postmarketOS, which is based on Alpine, coming pre-configured with PipeWire.
|
||||
PipeWire is relatively new and the typical audio server used is PulseAudio; Debian and many popular Debian-based distributions come pre-configured with PulseAudio.
|
||||
</P>
|
||||
_subsubheader(`ALSA')
|
||||
<UL>
|
||||
<LI><A HREF="https://wiki.alpinelinux.org/wiki/Main_Page/Adding_sound">Adding sound</A> (Alpine Linux Wiki)</LI>
|
||||
<LI><A HREF="https://bbs.archlinux.org/viewtopic.php?id=256857">ALSA lib conf Evaluate error</A></LI>
|
||||
<LI><A HREF="https://dev.to/setevoy/linux-alsa-lib-pcmdmixc1108sndpcmdmixopen-unable-to-open-slave-38on">ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave</A></LI>
|
||||
</UL>
|
||||
<P>
|
||||
The Alpine wiki ("Adding sound") says to install _code(`alsa-conf'), _code(`alsa-lib'), and _code(`alsa-utils'),
|
||||
add yourself to the _code(`audio') group, and then do some more configuration that I've never needed to do:
|
||||
Use _man(`alsamixer(1)') to find a working sound card (press _code(`F6') from the first screen ALSAMixer presents)
|
||||
and edit _code(`/usr/share/alsa/alsa.conf') and change _code(`defaults.ctl.card') and _code(`defaults.pcm.card') to the sound card that works.
|
||||
</P>
|
||||
<P>
|
||||
The Alpine wiki doesn't mention this but you'll need to enable the _code(`alsa') OpenRC service and either start it or reboot.
|
||||
I also installed _code(`gstreamer') but I don't know why.
|
||||
</P>
|
||||
<P>
|
||||
ALSA is clunky, many people prefer to use a frontend such as Pipewire or PulseAudio that exposes its own interface while remaining compatible with ALSA.
|
||||
</P>
|
||||
<H4>OSS</H4>
|
||||
<P>
|
||||
Deprecated, unfortunately.
|
||||
</P>
|
||||
<H4>PipeWire</H4>
|
||||
<UL>
|
||||
<LI><A HREF="https://wiki.alpinelinux.org/wiki/PipeWire">PipeWire</A> (Alpine Linux Wiki)</LI>
|
||||
<LI><A HREF="https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home">PipeWire</A> (FreeDesktop Wiki)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
Provided by the _code(`pipewire') package on Alpine.
|
||||
</P>
|
||||
<PRE>
|
||||
RTKit error: org.freedesktop.DBus.Error.ServiceUnknown
|
||||
</PRE>
|
||||
<P>
|
||||
This means you need _code(`rtkit') installed and running through your initialization system.
|
||||
</P>
|
||||
<H4>PulseAudio</H4>
|
||||
<P>
|
||||
On Alpine you'll need the _code(`pulseaudio'), _code(`pulseaudio-alsa'), and _code(`alsa-plugins-pulse') packages for PulseAudio with ALSA compatibility.
|
||||
Start _man(`pulseaudio(1)') when you want audio, ideally in your _code(`.xinitrc').
|
||||
</P>
|
||||
|
||||
_subheader(`Distributions')
|
||||
<P>
|
||||
Linux is usually obtained as part of a software distribution put together to form a useable operating system.
|
||||
</P>
|
||||
<H4>Alpine</H4>
|
||||
<UL>
|
||||
<LI><A HREF="https://pkgs.alpinelinux.org/contents">Alpine repositories content search</A></LI>
|
||||
</UL>
|
||||
<H5>Always install manual pages</H5>
|
||||
<P>
|
||||
Alpine doesn't include man pages in program packages to save on space, instead keeping them in _code(`[<I>package</I>]-doc') sibling packages.
|
||||
To always install doc packages with program packages, _code(`apk add docs').
|
||||
</P>
|
||||
<H4>Arch</H4>
|
||||
<P>
|
||||
Arch is known for using the latest versions of programs, which has given it an undeserved reputation of instability.
|
||||
</P>
|
||||
<H5>Bootstrapping</H5>
|
||||
<P>
|
||||
Use _man(`pacstrap(8)').
|
||||
</P>
|
||||
<P>
|
||||
At a minimum you need the _code(`base') package.
|
||||
Select a kernel and install the corresponding package; _code(`linux'), _code(`linux-lts'), or another Linux configuration or fork.
|
||||
The Arch wiki says you need to install _code(`linux-firmware'), this isn't strictly necessary but it is recommended.
|
||||
Install _code(`base-devel') if you plan on using the AUR or if you don't know what the AUR is yet.
|
||||
</P>
|
||||
<P>
|
||||
It's also a good idea to install any utilities you'll need on the bootstrapped system.
|
||||
Text editors, network managers or utilities, and other administration tools, for example.
|
||||
Manual utilities such as _code(`man-db') and others would also be useful.
|
||||
</P>
|
||||
<H5>Ubiquitous packages missing</H5>
|
||||
<P>From the annals of my notes, 2021-06-04:</P>
|
||||
<PRE>
|
||||
Had an issue with pacman missing some ubiquitous packages (esr's 'ascii', xorg-xev, etc).
|
||||
This fixed it. I don't really know why - maybe some issues with my repos?
|
||||
This was cleanly installed artix-openrc.
|
||||
|
||||
[5:46 PM] Bassman Leyla: So what I did is I went into /etc/pacman.d/mirrorlist-arch and uncommented a local mirror
|
||||
[5:46 PM] Bassman Leyla: Then I appended a config block a package maintainer gave me onto /etc/pacman.conf
|
||||
[5:46 PM] Bassman Leyla: I'll paste it in
|
||||
[5:47 PM] Bassman Leyla:
|
||||
'''
|
||||
#
|
||||
# ARCHLINUX
|
||||
#
|
||||
|
||||
#[testing]
|
||||
#Include = /etc/pacman.d/mirrorlist-arch
|
||||
|
||||
[extra]
|
||||
Include = /etc/pacman.d/mirrorlist-arch
|
||||
|
||||
#[community-testing]
|
||||
#Include = /etc/pacman.d/mirrorlist-arch
|
||||
|
||||
[community]
|
||||
Include = /etc/pacman.d/mirrorlist-arch
|
||||
|
||||
#[multilib-testing]
|
||||
#Include = /etc/pacman.d/mirrorlist-arch
|
||||
|
||||
#[multilib]
|
||||
#Include = /etc/pacman.d/mirrorlist-arch
|
||||
'''
|
||||
</PRE>
|
||||
<H4>Artix</H4>
|
||||
<UL>
|
||||
<LI><A HREF="https://artixlinux.org/">Artix Linux</A></LI>
|
||||
<LI><A HREF="https://en.wikipedia.org/wiki/Artix_Linux">Artix Linux</A> (Wikipedia)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
Artix is a Linux software distribution based on Arch that doesn't mandate SystemD as its initialization system.
|
||||
</P>
|
||||
<H5>Bootstrapping</H5>
|
||||
<P>
|
||||
This process differs from Arch's bootstrapping process.
|
||||
Artix uses _man(`basestrap(8)') rather than _man(`pacstrap(8)');
|
||||
you need to select the initialization you want to use: _code(`66'), _code(`dinit'), _code(`openrc'), _code(`runit'), or _code(`s6-base'), as a package separate from _code(`base');
|
||||
and Artix's official wiki says you need to install the appropriate _link(`#logind', `_code(`elogind')') package (_code(`elogind-[<I>initialization system</I>]') e.g. _code(`elogind-66')) but like _code(`linux-firmware') though it is helpful it isn't strictly necessary.
|
||||
</P>
|
||||
|
||||
<H4>Debian</H4>
|
||||
<UL>
|
||||
<LI><A HREF="https://www.debian.org/">Debian</A></LI>
|
||||
<LI><A HREF="https://en.wikipedia.org/wiki/Debian">Debian</A> (Wikipedia)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
Debian is known for its stability and longevity.
|
||||
Debian uses SystemD as its initialization system, the GNU core utilities, and dpkg and apt for package management.
|
||||
</P>
|
||||
<P>
|
||||
While it's possible to use non-Linux kernels within Debian, it's uncommon and the only non-Linux option currently maintained is the GNU HURD microkernel.
|
||||
</P>
|
||||
|
||||
<H4>postmarketOS</H4>
|
||||
<P>
|
||||
postmarketOS is an Alpine-based Linux software distribution that makes configuring and using Linux easy on mobile devices.
|
||||
</P>
|
||||
<H5>Random MAC address generation on Wifi</H5>
|
||||
<P>
|
||||
By default, postmarketOS will generate a random software MAC address when connecting to a new WLAN network.
|
||||
You can disable this by adding a NetworkManager rule.
|
||||
In _code(`/etc/NetworkManager/conf.d/') you can make a file with any name that has the following:
|
||||
</P>
|
||||
<PRE>
|
||||
[device]
|
||||
wifi.scan-rand-mac-address=no
|
||||
</PRE>
|
||||
<P>
|
||||
On a live system you can then _code(`rc-service networkmanager restart') to restart NetworkManager and have it load the new configuration.
|
||||
</P>
|
||||
|
||||
<H4>Ubuntu</H4>
|
||||
<UL>
|
||||
<LI><A HREF="https://securitylab.github.com/research/Ubuntu-gdm3-accountsservice-LPE/">How to get root on Ubuntu 20.04 by pretending nobody's /home</A></LI>
|
||||
</UL>
|
||||
<P>
|
||||
Ubuntu is a derivative of Debian.
|
||||
</P>
|
||||
|
||||
_subheader(`logind')
|
||||
<UL>
|
||||
<LI><A HREF="https://github.com/elogind/elogind">elogind</A></LI>
|
||||
<LI><A HREF="https://wiki.gentoo.org/wiki/Elogind">elogind</A> (Gentoo Wiki)</LI>
|
||||
<LI><A HREF="https://www.freedesktop.org/software/systemd/man/org.freedesktop.login1.html">org.freedesktop.login1</A></LI>
|
||||
<LI><A HREF="https://nixos.wiki/wiki/Logind">logind</A> (NixOS Wiki)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
logind (_code(`systemd-logind.service(8)')) is a component of SystemD that exposes information about active users on the system via the org.freedesktop.login1 D-Bus interface which is used by the popular desktop environments GNOME and KDE.
|
||||
It also handles _ref(`#ACPI') events.
|
||||
It can be configured in _code(`logind.conf(5)').
|
||||
</P>
|
||||
<P>
|
||||
On systems without SystemD and with conflicting software, _code(`elogind(8)') may be used.
|
||||
</P>
|
||||
|
||||
_subheader(`util-linux')
|
||||
<UL>
|
||||
<LI>_link(`util-linux', `https://en.wikipedia.org/wiki/Util-linux') (Wikipedia)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
_code(`util-linux') is distributed on all popular Linux distributions and contains utilities users may expect to be already present on their systems, like _man(`more(1)') or _man(`hexdump(1)').
|
||||
</P>
|
||||
|
||||
_subheader(`Xenia')
|
||||
_bibliography(`
|
||||
_bentr(`_link(`A hacker fox!', `http://yerf.metafur.org/date/1996-07-14')')
|
||||
')
|
||||
<P>
|
||||
Xenia was an entry for the Linux logo competition which Tux eventually won.
|
||||
</P>
|
4
wiki/unix/m4.m4
Normal file
4
wiki/unix/m4.m4
Normal file
@ -0,0 +1,4 @@
|
||||
<H2 ID="m4">m4</H2>
|
||||
<UL>
|
||||
<LI><A HREF="Notes on the M4 Macro Language">https://mbreen.com/m4.html</A></LI>
|
||||
</UL>
|
1
wiki/unix/macros.m4
Normal file
1
wiki/unix/macros.m4
Normal file
@ -0,0 +1 @@
|
||||
define(`_man', `_cite($1)')dnl
|
11
wiki/unix/manual.m4
Normal file
11
wiki/unix/manual.m4
Normal file
@ -0,0 +1,11 @@
|
||||
<H2>On-line manual</H2>
|
||||
<UL>
|
||||
<LI><A HREF="UNIX Programmers Manual - November 1971">http://www.bitsavers.org/pdf/bellLabs/unix/UNIX_ProgrammersManual_Nov71.pdf</A></LI>
|
||||
</UL>
|
||||
<P>
|
||||
In the context of POSIX and UNIX-like systems, an "on-line" manual is a manual that is accessible via the computer system it documents.
|
||||
Particularly, the <CODE>man(1)</CODE> utility and the manual "pages" it references.
|
||||
</P>
|
||||
<P>
|
||||
Alpine by default uses <CODE>mandoc</CODE>.
|
||||
</P>
|
14
wiki/unix/multitasking.m4
Normal file
14
wiki/unix/multitasking.m4
Normal file
@ -0,0 +1,14 @@
|
||||
_header(`Multitasking')
|
||||
_subheader(`Task management')
|
||||
_subsubheader(`htop(1)')
|
||||
_bibliography(`
|
||||
_bentry(`_link(`htop', `https://en.wikipedia.org/wiki/Htop') (Wikipedia)')
|
||||
_bentry(`_link(`htop - an interactive process viewer', `https://htop.dev/')')
|
||||
')
|
||||
<P>
|
||||
_man(`htop(1)') is a featureful alternative to _man(`top(1)').
|
||||
</P>
|
||||
_subsubheader(`top(1)')
|
||||
<P>
|
||||
Busybox and NetBSD provide implementations of _code(`top(1)'), an interactive in-terminal task manager.
|
||||
</P>
|
66
wiki/unix/netbsd.m4
Normal file
66
wiki/unix/netbsd.m4
Normal file
@ -0,0 +1,66 @@
|
||||
_header(`NetBSD')
|
||||
<UL>
|
||||
<LI><A HREF="http://netbsd.org/">netbsd.org</A></LI>
|
||||
<LI><A HREF="https://www.netbsd.org/docs/guide/en/">NetBSD Guide</A></LI>
|
||||
<LI><A HREF="https://www.netbsd.org/docs/pkgsrc/">pkgsrc Guide</A></LI>
|
||||
</UL>
|
||||
<H3>Battery</H3>
|
||||
<P><CODE>envstat(1)</CODE> can show the current battery status.</P>
|
||||
<H3>Mounting filesystems</H3>
|
||||
<OL>
|
||||
<LI>Connect the drive with the filesystem you want to access.</LI>
|
||||
<LI>Use <CODE>dmesg(8)</CODE> to determine the location in <CODE>/dev/</CODE> of the disk.</LI>
|
||||
<LI><CODE>disklabel(8)</CODE> the drive to determine which partition on the disk you want to access (<CODE>disklabel /dev/<I>disk</I></CODE>)</LI>
|
||||
<LI><CODE>mount(8)</CODE> the filesystem.</LI>
|
||||
<LI><CODE>umount(8)</CODE> the filesystem when done using it.</LI>
|
||||
</OL>
|
||||
<H4>ext4</H4>
|
||||
<P>
|
||||
Install <CODE>filesystems/fuse</CODE> and <CODE>filesystems/fuse-ext2</CODE>.
|
||||
<CODE>disklabel(8)</CODE> will list ext4 filesystems as of type "Linux Ext2".
|
||||
Use <CODE>fuse-ext2(1)</CODE> to mount the filesystem.
|
||||
</P>
|
||||
<P>
|
||||
<CODE>fuse-ext2(1)</CODE> is spotty in places and may not work correctly.
|
||||
</P>
|
||||
<H4>exFAT</H4>
|
||||
<P>
|
||||
Install <CODE>filesystems/fuse</CODE> and <CODE>filesystems/fuse-exfat</CODE>.
|
||||
Use <CODE>mount.exfat</CODE> to mount the filesystem (the manual page for which is <CODE>mount.exfat-fuse(8)</CODE>).
|
||||
</P>
|
||||
<H3>Fix <CODE>SSL certificate problem: unable to get local issuer certificate</CODE></H3>
|
||||
<UL>
|
||||
<LI><A HREF="http://mail-index.netbsd.org/pkgsrc-users/2021/07/19/msg034147.html">Depending on security/ca-certificates?</A></LI>
|
||||
<LI><A HREF="https://www.cambus.net/installing-ca-certificates-on-netbsd/">Installing CA certificates on NetBSD</A></LI>
|
||||
<LI><A HREF="https://github.com/ohmyzsh/ohmyzsh/issues/8321#issuecomment-863493503">SSL Certificate Problem</A> (ohmyzsh/ohmyzsh#8321)</LI>
|
||||
</UL>
|
||||
<P>Install <CODE>security/mozilla-rootcerts-openssl</CODE>.</P>
|
||||
<P>
|
||||
<I>Do not</I> use SSL workarounds like (in the case of git) <CODE>GIT_SSL_NO_VERIFY</CODE>.
|
||||
These leave your system open to man-in-the-middle attacks.
|
||||
</P>
|
||||
<H3>OpenVPN</H3>
|
||||
<UL>
|
||||
<LI><A HREF="Mullvad via openvpn - up could not execute external program">https://forums.freebsd.org/threads/mullvad-via-openvpn-up-could-not-execute-external-program.79968/</A> (FreeBSD Forums)</LI>
|
||||
<LI><A HREF="Platform Notes">https://community.openvpn.net/openvpn/wiki/PlatformNotes</A> (OpenVPN Community Wiki)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
If using Mullvad, you have to change the shebang on <CODE>update-resolv-conf(8)</CODE>
|
||||
(a standalone Bash script included in the OpenVPN configurations from Mullvad, intended to be placed in <CODE>/etc/openvpn/</CODE>)
|
||||
from <CODE>#!/bin/bash</CODE> to _code(`#!/usr/pkg/bin/bash') if using Bash from pkgsrc or another appropriate location if using a different package manager.
|
||||
</P>
|
||||
<H3>rc.d</H3>
|
||||
<UL>
|
||||
<LI><A HREF="http://www.mewburn.net/luke/papers/rc.d.pdf">The Design and Implementation of the NetBSD rc.d system</A></LI>
|
||||
</UL>
|
||||
<H3>System logging</H3>
|
||||
<UL>
|
||||
<LI><A HREF="https://www.unitedbsd.com/d/548-system-instability-on-unstable-version-how-do-i-get-logs/7">System instability on unstable version - how do I get logs?</A></LI>
|
||||
</UL>
|
||||
<P>See <CODE>syslogd(8)</CODE> and <CODE>syslog.conf(5)</CODE>, which pertain to system logging.</P>
|
||||
<P>Setting <CODE>DDB_ONPANIC</CODE> (see <CODE>options(4)</CODE> and <CODE>sysctl(8)</CODE>) will save a crash dump at <CODE>/var/crash</CODE> on kernel panic.
|
||||
<H3>Upgrading</H3>
|
||||
<UL>
|
||||
<LI>The NetBSD Guide - <A HREF="https://www.netbsd.org/docs/guide/en/chap-upgrading.html">Chapter 4: Upgrading NetBSD</A></LI>
|
||||
<LI><A HREF="https://www.unitedbsd.com/d/110-upgrading-netbsd-using-sysinst">Upgrading NetBSD using sysinst</A></LI>
|
||||
</UL>
|
15
wiki/unix/pci.m4
Normal file
15
wiki/unix/pci.m4
Normal file
@ -0,0 +1,15 @@
|
||||
<H2>PCI Utilities</H2>
|
||||
<UL>
|
||||
<LI><A HREF="https://github.com/pciutils/pciutils">pciutils/pciutils</A> (GitHub)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
Available as <CODE>sysutils/pciutils</CODE> from pkgsrc.
|
||||
Supplies <CODE>lspci(8)</CODE>, <CODE>setpci(8)</CODE>, and <CODE>update-pciids(8)</CODE>.
|
||||
</P>
|
||||
<P>
|
||||
<CODE>update-pciids(8)</CODE> is not part of the <CODE>pciutils</CODE> package in Alpine Linux repositories.
|
||||
</P>
|
||||
<P>
|
||||
NetBSD includes <CODE>pcictl(8)</CODE> which offers similar functionality.
|
||||
<CODE>pcictl pci0 list</CODE> outputs roughly the same information as <CODE>lspci(8)</CODE>, though <CODE>lspci(8)</CODE> may offer slightly more detailed information.
|
||||
</P>
|
10
wiki/unix/pkg-config.m4
Normal file
10
wiki/unix/pkg-config.m4
Normal file
@ -0,0 +1,10 @@
|
||||
<H2 ID="pkg-config">pkg-config</H2>
|
||||
<UL>
|
||||
<LI><A HREF="pkg-config">https://en.wikipedia.org/wiki/Pkg-config</A> (Wikipedia)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
pkg-config provides a way to link to libraries independent of a particular system's directory heirarchy.
|
||||
</P>
|
||||
<P>
|
||||
The relevant manual pages on NetBSD are <CODE>pkgconf(1)</CODE>, <CODE>pc(5)</CODE>, and <CODE>pkg.m4(7)</CODE>.
|
||||
</P>
|
17
wiki/unix/pkgsrc.m4
Normal file
17
wiki/unix/pkgsrc.m4
Normal file
@ -0,0 +1,17 @@
|
||||
<H2 ID="pkgsrc">pkgsrc</H2>
|
||||
<UL>
|
||||
<LI><A HREF="http://www.netbsd.org/docs/pkgsrc/"</A>the pkgsrc user's guide</A></LI>
|
||||
</UL>
|
||||
<H3><CODE>pkg_add: Conflicting PLIST</CODE></H3>
|
||||
<UL>
|
||||
<LI><A HREF="Re: conflicting PLIST during install">https://mail-index.netbsd.org/pkgsrc-users/2013/06/07/msg018151.html</A> (pkgsrc-Users Mailing List)</LI>
|
||||
</UL>
|
||||
<P>Try <CODE>pkg_admin(1)</CODE>.</P>
|
||||
<H3>Upgrading packages</H3>
|
||||
<UL>
|
||||
<LI><A HREF="http://www.netbsd.org/docs/pkgsrc/using.html">Using pkgsrc</A> (the pkgsrc user's guide)</LI>
|
||||
<LI><A HREF="https://wiki.netbsd.org/cgi-bin/cvsweb/wikisrc/pkgsrc/how_to_upgrade_packages.mdwn?rev=1.9;content-type=text%2Fx-cvsweb-markup">how to upgrade packages</A> (NetBSD Developer Wiki <B>snapshot; 2020-09-09</B>)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
See <CODE>pkgtools/pkg_rolling_replace</CODE>.
|
||||
</P>
|
239
wiki/unix/posix.m4
Normal file
239
wiki/unix/posix.m4
Normal file
@ -0,0 +1,239 @@
|
||||
_header(`POSIX')
|
||||
<UL>
|
||||
<LI>_link(`POSIX', `https://en.wikipedia.org/wiki/POSIX') (Wikipedia)</LI>
|
||||
</UL>
|
||||
|
||||
_header(`as(1)')
|
||||
<UL>
|
||||
<LI>_link(`as', `https://en.wikipedia.org/wiki/As_(Unix)') (Wikipedia)</LI>
|
||||
<LI>_link(`UNIX Assembler Reference Manual', `https://www.tom-yam.or.jp/2238/ref/as.pdf')</LI>
|
||||
<LI>_link(`UNIX Operating System Porting Experiences', `https://www.bell-labs.com/usr/dmr/www/otherports/newp.pdf')</LI>
|
||||
</UL>
|
||||
<H4>GAS</H4>
|
||||
<UL>
|
||||
<LI>_link(`What I Dislike About GAS', `http://x86asm.net/articles/what-i-dislike-about-gas/')</LI>
|
||||
</UL>
|
||||
|
||||
_header(`cat(1)')
|
||||
<UL>
|
||||
<LI>_link(`4.4BSD-Lite2', `https://en.wikipedia.org/wiki/Berkeley_Software_Distribution')/_link(`usr/src/bin/cat/cat.c', `https://github.com/sergev/4.4BSD-Lite2/blob/master/usr/src/bin/cat/cat.c')</LI>
|
||||
<LI>_link(`busybox', `https://git.busybox.net/busybox/')/_link(`coreutils/cat.c', `https://git.busybox.net/busybox/tree/coreutils/cat.c')</LI>
|
||||
<LI>_link(`cat(1)', `http://man.cat-v.org/unix-1st/1/cat') (UNIX v1)</LI>
|
||||
<LI>_link(`cat(1p)', `https://www.unix.com/man-page/posix/1posix/cat/')</LI>
|
||||
<LI>_link(`UNIX Style, or cat -v Considered Harmful', `http://harmful.cat-v.org/cat-v/')</LI>
|
||||
<LI>_link(`dd(1p)', `https://www.unix.com/man-page/posix/1posix/dd/')</LI>
|
||||
<LI>_link(`FreeBSD', `https://www.freebsd.org/')/_link(`bin/cat/cat.c', `https://github.com/freebsd/freebsd-src/blob/main/bin/cat/cat.c')</LI>
|
||||
<LI>_link(`GNU coreutils', `https://www.gnu.org/software/coreutils/')/_link(`src/cat.c', `https://git.savannah.gnu.org/cgit/coreutils.git/tree/src/cat.c')</LI>
|
||||
<LI>_link(`The history of why cat -v is considered harmful', `https://lyngvaer.no/log/cat-v-history')</LI>
|
||||
<LI>_link(`NetBSD', `https://www.netbsd.org/')/_link(`bin/cat/cat.c', `https://github.com/NetBSD/src/blob/trunk/bin/cat/cat.c')</LI>
|
||||
<LI>_link(`Plan 9 from Bell Labs Fourth Edition', `https://9p.io/plan9/')/_link(`sys/src/cmd/cat.c', `https://github.com/plan9foundation/plan9/blob/main/sys/src/cmd/cat.c')</LI>
|
||||
<LI>_link(`Program Design in the UNIX Environment', `https://harmful.cat-v.org/cat-v/unix_prog_design.pdf')</LI>
|
||||
<LI>_link(`A Research Unix Reader', `https://www.cs.dartmouth.edu/~doug/reader.pdf')</LI>
|
||||
<LI>_link(`UNIX v7', `https://en.wikipedia.org/wiki/Unix')/_link(`usr/src/cmd/cat.c', `https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/cat.c')</LI>
|
||||
<LI>Thanks to Miles and WeedSmokingJew for help with content.</LI>
|
||||
<LI>Thanks to adamz01h and wiresToGround for help with the JavaScript that used to accompany this article (to facilitate syntax highlighting in code samples using _link(`highlight.js', `https://highlightjs.org/')).</LI>
|
||||
<LI>Thanks to Ando_Bando, Miles, u/oh5nxo, and WeedSmokingJew for help with the accompanying code samples.</LI>
|
||||
</UL>
|
||||
<P>
|
||||
_man(`cat(1)') is a program that exists to catenate files; to "join" one file at its end to another at its start.
|
||||
</P>
|
||||
<P>
|
||||
_man(`cat(1)') was introduced in UNIX's first edition to succeed _man(`pr(1)'), which prints the contents of a single file to the screen.
|
||||
Most use of _man(`cat(1)') is similar; it's often introduced to beginners as a means to print the contents of a file to the screen, which is why many implementations include options that modify output to make it easier to read on a display.
|
||||
POSIX requires only _code(`-u') to be implemented, which guarantees output is unbuffered - on some systems output is buffered in 512-byte blocks, which is also the default of _man(`dd(1)'), though most current implementations (busybox, GNU coreutils) don't buffer output regardless.
|
||||
Various implementations include _code(`-s') to strip duplicate blank lines (<CODE>cat "$@" | sed '/^\s*$/d'</CODE> would also work),
|
||||
_code(`-n') to number lines (to which Pike and Kernighan offered <CODE>awk '{ print NR "\t" $0 }' "$@"</CODE> as a replacement)
|
||||
and _code(`-b') to number non-blank lines (both cases for which _man(`nl(1)') was later made),
|
||||
and _code(`-v') to mark invisible characters.
|
||||
</P>
|
||||
<P>
|
||||
Additions to _code(`man(1)') are controversial; Rob Pike and Brian Kernighan explain this in _italic(`Program Design in the UNIX Environment'), the paper that accompanied Rob Pike's presentation _italic(`UNIX Style, or cat -v Considered Harmful') at the 1983 USENIX Summer Conference.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The following shell script is a POSIX-compliant implementation of _man(`cat(1)'):
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
DD=dd
|
||||
|
||||
# usage with 0 arguments - print standard input to standard output
|
||||
if test -z "$1"; then
|
||||
dd 2>/dev/null
|
||||
exit $?
|
||||
fi
|
||||
|
||||
while test -n "$1"; do
|
||||
# Parse options
|
||||
|
||||
if test -z "$DONT_PARSE_ARGS"
|
||||
then case "$1" in
|
||||
--)
|
||||
DONT_PARSE_ARGS=1
|
||||
shift; continue; ;;
|
||||
-u)
|
||||
DD="dd bs=1"
|
||||
shift; continue; ;;
|
||||
-)
|
||||
$DD </dev/stdin 2>/dev/null
|
||||
shift; continue; ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Print input to output.
|
||||
$DD <"$1" 2>/dev/null
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
exit 0
|
||||
</PRE>
|
||||
|
||||
_subheader(`echo(1)')
|
||||
<UL>
|
||||
<LI>_link(`echo', `https://en.wikipedia.org/wiki/Echo_(command)') (Wikipedia)</LI>
|
||||
<LI>_link(`echo(1p)', `https://man7.org/linux/man-pages/man1/echo.1p.html') (man7)</LI>
|
||||
<LI>_link(`NetBSD', `https://www.netbsd.org/')/_link(`bin/echo/echo.sh', `https://github.com/NetBSD/src/blob/trunk/bin/echo/echo.c')</LI>
|
||||
<LI>_link(`UNIX v5', `#UNIX')/_link(`usr/source/s1/echo.c', `https://www.tuhs.org/cgi-bin/utree.pl?file=V5/usr/source/s1/echo.c')</LI>
|
||||
<LI>_link(`Variations in echo implementations', `https://www.in-ulm.de/~mascheck/various/echo+printf/')</LI>
|
||||
</UL>
|
||||
<P>
|
||||
Don't use _man(`echo(1)'), use _man(`printf(1)').
|
||||
_man(`printf(1)') simulates the _man(`printf(3)') function in the C standard I/O library which has no significant variations, whereas the functionality of _man(`echo(1)') can vary between vendors.
|
||||
</P>
|
||||
<P>
|
||||
_code(`printf "%s" "$*"') does not work as _man(`echo(1)') though it's been said to do so (including by this page).
|
||||
</P>
|
||||
<P>
|
||||
The following is an implementation of _man(`echo(1)') in the C programming language, using the standard library.
|
||||
</P>
|
||||
<PRE>
|
||||
#include <stdio.h>
|
||||
int main(int argc, char *argv[]) {
|
||||
int i;
|
||||
for(i = 1; ; ) {
|
||||
if(i >= argc)
|
||||
break;
|
||||
printf("%s", argv[i]);
|
||||
++i;
|
||||
if(i == argc)
|
||||
putchar('\n');
|
||||
else
|
||||
putchar(' ');
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
</PRE>
|
||||
<P>
|
||||
The following is an implementation of _man(`echo(1)') in shell.
|
||||
</P>
|
||||
<PRE>
|
||||
while :; do
|
||||
if test -z "$1"
|
||||
then break
|
||||
fi
|
||||
printf "%s" "$1"
|
||||
`shift'
|
||||
if test -z "$1"; then
|
||||
printf "\n"
|
||||
break
|
||||
else
|
||||
printf " "
|
||||
fi
|
||||
done
|
||||
</PRE>
|
||||
|
||||
_subheader(`find(1)')
|
||||
<UL>
|
||||
<LI><A HREF="https://en.wikipedia.org/wiki/Find_(Unix)">find</A> (Wikipedia)</LI>
|
||||
</UL>
|
||||
|
||||
_subheader(`echo(1)')
|
||||
<UL>
|
||||
<LI><A HREF="https://catonmat.net/ftp/ed.text.editor.cheat.sheet.txt">Ed Cheat Sheet</A></LI>
|
||||
</UL>
|
||||
<P>
|
||||
A particularly shoddy attempt at _man(`ed(1)') is provided by _code(`busybox').
|
||||
A traditional _man(`ed(1)') implementation is in plan9ports.
|
||||
I'm pretty sure some later UNIX-based OSes doubled the _man(`ed(1)') buffers, there's pretty much no downside to doing so in the modern era but it should be very easy to do yourself if it hasn't already been done (just double some of the array sizes in the beginning of _code(`ed.c')).
|
||||
</P>
|
||||
|
||||
_subheader(`make(1)')
|
||||
<P>
|
||||
_man(`make(1)') in modern times is fragmented into the GNU version <I>gmake</I> and the BSD version <I>bmake</I>.
|
||||
Complex Makefiles may not be useable in both.
|
||||
Usually Linux systems have GNU Make as _command(`make') and BSD Make as _command(`bmake'),
|
||||
and BSD systems to have BSD Make as _command(`make') and GNU Make as _command(`gmake');
|
||||
the native Make is simply _command(`make') and the external Make gets a name designating its source.
|
||||
</P>
|
||||
|
||||
_subheader(`mkfifo(1)')
|
||||
<UL>
|
||||
<LI>_link(`mkfifo(1)', `https://man.netbsd.org/mkfifo.1') (NetBSD)</LI>
|
||||
<LI>_link(`mkfifo(2)', `https://man.netbsd.org/mkfifo.2') (NetBSD)</LI>
|
||||
<LI>_link(`Use mkfifo to create named pipe', `https://dev.to/0xbf/use-mkfifo-to-create-named-pipe-linux-tips-5bbk')</LI>
|
||||
<LI>_link(`What is the purpose of using a FIFO vs a temporary file or a pipe?', `https://unix.stackexchange.com/questions/433488/what-is-the-purpose-of-using-a-fifo-vs-a-temporary-file-or-a-pipe')</LI>
|
||||
</UL>
|
||||
|
||||
_subheader(`true(1)')
|
||||
<UL>
|
||||
<LI><A HREF="http://trillian.mit.edu/~jc/;-)/ATT_Copyright_true.html">CHAMBERS John - The /bin/true Command and Copyright</A></LI>
|
||||
<LI><A HREF="https://twitter.com/rob_pike/status/966896123548872705">PIKE Rob - "/bin/true used to be an empty file."</A></LI>
|
||||
<LI><A HREF="https://www.muppetlabs.com/~breadbox/software/tiny/teensy.html">RAITER Brian - A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux</A></LI>
|
||||
<LI><A HREF="https://www.unix.com/man-page/posix/1p/true/">true(1p)</A> (The Open Group, 2003)</LI>
|
||||
<LI><A HREF="https://www.gnu.org/">GNU</A>/<A HREF="https://www.gnu.org/software/coreutils/">coreutils</A>/<A HREF="https://git.savannah.gnu.org/cgit/coreutils.git/tree/src/true.c">src/true.c</A></LI>
|
||||
<LI><A HREF="https://www.netbsd.org/">NetBSD</A>/<A HREF="https://github.com/NetBSD/src/blob/trunk/usr.bin/true/true.sh">usr.bin/true/true.sh</A></LI>
|
||||
</UL>
|
||||
<P>
|
||||
_man(`true(1)') is a tool that <I>only</I> quits silently with an exit status of 0.
|
||||
Similarly, _man(`false(1)') is a tool that <I>only</I> quits silently with an exit status of 1.
|
||||
Recognizing arguments, printing to standard output, reading from standard input, or otherwise exiting with any other status of 0, is a violation of the POSIX specification for _man(`true(1)').
|
||||
These utilities find use in shell scripting, which, though extremely relevant to these utilities, is beyond the scope of this article.
|
||||
</P>
|
||||
<P>
|
||||
Because _man(`true(1)')'s required functionality is so simple a POSIX-compliant implementation is a one-liner in most languages, so long as you're willing to make an exception in your code styling.
|
||||
For example, in C:
|
||||
</P>
|
||||
<PRE>
|
||||
int main(void) { return 0; }
|
||||
</PRE>
|
||||
<P>
|
||||
Because executing an empty shellscript file will in most shells do nothing and return an exit status of 0, technically an empty shellscript file is a POSIX-compliant _man(`true(1)') implementation in 0 bytes.
|
||||
This was the _man(`true(1)') implementation on early versions of UNIX, including Research UNIX, System V, and Sun's Solaris, according to both Rob Pike and John Chambers.
|
||||
A more explicit implementation also exists in POSIX shell:
|
||||
</P>
|
||||
<PRE>
|
||||
#!/bin/sh
|
||||
exit 0
|
||||
</PRE>
|
||||
<P>
|
||||
This happens to be nearly identical in source to the implementation used by NetBSD.
|
||||
</P>
|
||||
<P>
|
||||
Python has the same 0 byte _man(`true(1)') implementation feature as most shells.
|
||||
Here's _man(`false(1)') in Python rather than _man(`true(1)') to demonstrate how exiting with an arbitrary exit status can be done:
|
||||
</P>
|
||||
<PRE>
|
||||
import sys
|
||||
sys.exit(1)
|
||||
</PRE>
|
||||
<P>
|
||||
In some shells, _man(`true(1)') is a shell built-in command, so running _program(`true') will run the shell author's implementation of _man(`true(1)') rather than the system implementation.
|
||||
</P>
|
||||
<P>
|
||||
GNU _man(`true(1)'), from the GNU coreutils, is well known for being a maximalist implementation - it's eighty lines long and directly includes four C header files.
|
||||
Their _code(`true.c') is 2.3 kilobytes and parses the arguments _code(`--help') and _code(`--version') (only if either are the first argument to the program).
|
||||
The GNU coreutils implementation of _man(`true(1)') is not POSIX compliant.
|
||||
</P>
|
||||
|
||||
_subheader(`vi(1)')
|
||||
<UL>
|
||||
<LI>_link(`vi(1p)', `https://man7.org/linux/man-pages/man1/vi.1p.html') (man7)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
Unlike _code(`busybox')'s _man(`ed(1)') implementation, its _man(`vi(1)') is very useable.
|
||||
_man(`vim(1)') is a popular re-implementation of _man(`vi(1)').
|
||||
</P>
|
16
wiki/unix/telepathy.m4
Normal file
16
wiki/unix/telepathy.m4
Normal file
@ -0,0 +1,16 @@
|
||||
_header(`Telepathy')
|
||||
_subheader(`SSH')
|
||||
<P><I>Secure SHell</I></P>
|
||||
_subsubheader(`Keys')
|
||||
<UL>
|
||||
<LI><A HREF="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account">Adding a new SSH key to your GitHub account</A> (GitHub Docs)</LI>
|
||||
<LI><A HREF="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/checking-for-existing-ssh-keys">Checking for existing SSH keys</A> (GitHub Docs)</LI>
|
||||
<LI><A HREF="Generating a new SSH key and adding it to the ssh-agent">Generating a new SSH key and adding it to the ssh-agent</A> (GitHub Docs)</LI>
|
||||
</UL>
|
||||
<P>SSH keys are typically stored in <CODE>$HOME/.ssh</CODE>.</P>
|
||||
<P>Typically, the public key's filename will be suffixed with <CODE>.pub</CODE>, while the private key will not.</P>
|
||||
<P>You can generate an SSH key with <CODE>ssh-keygen(1)</CODE>. Currently the preferred implementation is <CODE>openssh-keygen</CODE>, part of the OpenSSH suite.</P>
|
||||
<P>
|
||||
Microsoft GitHub documentation suggests a user create a key with <CODE>ssh-keygen -t ed25519 -C "[<I>e-mail address</I>]"</CODE>.
|
||||
This generates an <A HREF="https://en.wikipedia.org/wiki/EdDSA#Ed25519">Ed25519</A> SSH key with an e-mail address in the key comment.
|
||||
</P>
|
5
wiki/unix/unix.m4
Normal file
5
wiki/unix/unix.m4
Normal file
@ -0,0 +1,5 @@
|
||||
<H2 ID="unix">UNIX</H2>
|
||||
<UL>
|
||||
_bentr(`_link(`Unix', `https://en.wikipedia.org/wiki/Unix') (Wikipedia)')
|
||||
<LI>_link(`unix-history-repo', `https://github.com/dspinellis/unix-history-repo') (GitHub)</LI>
|
||||
</UL>
|
84
wiki/unix/volumes.m4
Normal file
84
wiki/unix/volumes.m4
Normal file
@ -0,0 +1,84 @@
|
||||
<H2 ID="partitioning">Partitions and filesystems</H2>
|
||||
<UL>
|
||||
<LI><A HREF="https://wiki.archlinux.org/title/EFI_system_partition">EFI system partition (Arch Wiki)</A></LI>
|
||||
<LI><A HREF="https://wiki.artixlinux.org/Main/Installation#Partition_your_disk_.28BIOS.29">Installation#Partition your disk - Artix wiki</A></LI>
|
||||
<LI><A HREF="https://wiki.archlinux.org/title/Installation_guide#Partition_the_disks">Installation guide#Partition the disks - Arch wiki</A></LI>
|
||||
</UL>
|
||||
<P>
|
||||
Don't use partitioners included with OS media where the same job can be done by <A HREF="https://gparted.org/">GParted</A> (which has live media available) or another good general-purpose partitioner.
|
||||
BSDs and Plan 9 are exceptions to this rule due to their exotic partitioning systems.
|
||||
Using utilities from a shell or TUIs does not make you "cooler" than someone who needs a GUI for partitioning; in some cases, messing up partitioning can have serious consequences, so it's always nice to have some idiot-proofing.
|
||||
I always partition my disks with the GParted live media.
|
||||
</P>
|
||||
<P>
|
||||
You should do your own research on how you should partition your disks.
|
||||
I personally use separate partitions for /boot, /home, /, and swap.
|
||||
Your needs will vary.
|
||||
</P>
|
||||
<P>
|
||||
<B>Please note that a separate boot partition is mandatory if you intend to boot via (U)EFI.</B>
|
||||
Check out the linked pages in the "See also" section.
|
||||
</P>
|
||||
<P>
|
||||
Use <CODE>mkfs(8)</CODE> for creating filesystems and <CODE>mount(8)</CODE> for mounting partitions' filesystems.
|
||||
</P>
|
||||
<H3>gpart</H3>
|
||||
<UL>
|
||||
<LI><A HREF="https://en.wikipedia.org/wiki/Gpart">Gpart</A> (Wikipedia)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
Available as <CODE>sysutils/gpart</CODE> in pkgsrc.
|
||||
</P>
|
||||
<P>
|
||||
<CODE>gpart(8)</CODE> is a tool that scans a file (or block device presented as a file) for drive partitions regardless of any table present on the medium.
|
||||
</P>
|
||||
<H3 ID="luks">LUKS</H3>
|
||||
<UL>
|
||||
<LI><A HREF="https://www.howtoforge.com/automatically-unlock-luks-encrypted-drives-with-a-keyfile/">Automatically Unlock LUKS Encrypted Drives With A Keyfile</A></LI>
|
||||
<LI><A HREF="https://man.dragonflybsd.org/?command=cryptsetup§ion=8">cryptsetup(8)</A> (DragonFly Man Pages)</LI>
|
||||
<LI><A HREF="https://wiki.gentoo.org/wiki/Dm-crypt">Dm-crypt</A> (Gentoo Wiki)</LI>
|
||||
<LI><A HREF="https://www.cyberciti.biz/security/how-to-backup-and-restore-luks-header-on-linux/">How to backup and restore LUKS header on Linux</A></LI>
|
||||
<LI><A HREF="https://devconnected.com/how-to-encrypt-partition-on-linux/">How To Encrypt Partition on Linux</A></LI>
|
||||
<LI><A HREF="https://unixfuntime.wordpress.com/2012/08/20/luks-passphrases-changing-adding-removing/">LUKS passphrases: Changing, adding, removing</A></LI>
|
||||
<LI><A HREF="https://wiki.alpinelinux.org/wiki/LVM_on_LUKS">LVM on LUKS</A> (Alpine Wiki)</LI>
|
||||
</UL>
|
||||
<P>
|
||||
<CODE>e2fsprogs</CODE> is needed for the <CODE>dm_mod</CODE> kernel module used for LUKS partition decryption.
|
||||
</P>
|
||||
<P>
|
||||
To format a partition to a LUKS volume, determine the physical block device location for that partition and run <CODE>cryptsetup luksFormat [<I>partition</I>]</CODE>.
|
||||
The passphrase used can be changed or removed after creation.
|
||||
</P>
|
||||
<P>
|
||||
To open a LUKS volume, use <CODE>cryptsetup luksOpen [<I>partition</I>] [<I>name</I>]</CODE>.
|
||||
This <I>name</I> is the name the <I>decrypted block device</I> location will take in <CODE>/dev/mapper/</CODE>.
|
||||
</P>
|
||||
<P>
|
||||
Before the decrypted block device has a filesystem it'll just be cleared space - format as normal but use the decrypted block device location.
|
||||
</P>
|
||||
<P>
|
||||
To mount a partition in an opened LUKS volume, use <CODE>mount(8)</CODE> as normal, just with the decrypted block device location.
|
||||
</P>
|
||||
<P>
|
||||
To close an open LUKS volume, <CODE>umount(8)</CODE> any mapped and mounted partitions from the volume and <CODE>cryptsetup luksClose [<I>name</I>]</CODE>.
|
||||
</P>
|
||||
<P>
|
||||
To make the LUKS partition openable via keyfile, first make a keyfile (<CODE>dd if=/dev/urandom of=/root/keyfile bs=1024 count=4</CODE> seems to work), and optionally make it readable by root only (<CODE>chmod 0400 [<I>keyfile</I>]</CODE>).
|
||||
Then add the keyfile to the partition's LUKS header with <CODE>cryptsetup luksAddKey [<I>physical partition block device</I>] [<I>keyfile</I>]</CODE>.
|
||||
</P>
|
||||
<H4>dm-crypt</H4>
|
||||
<P>
|
||||
<CODE>dm-crypt</CODE> is a service that automatically mounts LUKS volumes at boot.
|
||||
</P>
|
||||
<P>
|
||||
On most OpenRC-initialized distributions, the <CODE>cryptsetup-openrc</CODE> package provides <CODE>dmcrypt</CODE>.
|
||||
Make sure that service is added to runlevel boot.
|
||||
</P>
|
||||
<P>
|
||||
Configuration is in <CODE>/etc/conf.d/dmcrypt</CODE> and further configuration should be done in <CODE><A HREF="#fstab">fstab</A></CODE>.
|
||||
<CODE>dm-crypt</CODE> will need the UUID of the <I>physical</I> block device while fstab (if being configured with UUIDs will need the UUID of the decrypted block device in the device mapper).
|
||||
</P>
|
||||
<H3>TestDisk</H3>
|
||||
<UL>
|
||||
<LI><A HREF="https://en.wikipedia.org/wiki/TestDisk">TestDisk</A> (Wikipedia)</LI>
|
||||
</UL>
|
19
wiki/unix/wifi.m4
Normal file
19
wiki/unix/wifi.m4
Normal file
@ -0,0 +1,19 @@
|
||||
<H2>WiFi</H2>
|
||||
<H3>wpa_supplicant</H3>
|
||||
<P>
|
||||
<CODE>wpa_supplicant(1)</CODE> is usually good enough for establishing WiFi connections.
|
||||
</P>
|
||||
<P>
|
||||
Here's an example configuration for a simple WPA-2 PSK access point.
|
||||
</P>
|
||||
<PRE>
|
||||
network={
|
||||
ssid="My SSID"
|
||||
key_mgmt=WPA-PSK
|
||||
scan_ssid=1
|
||||
psk="My password"
|
||||
}
|
||||
</PRE>
|
||||
<P>
|
||||
See <CODE>wpa_supplicant.conf(5)</CODE>.
|
||||
</P>
|
11
wiki/wiki.m4
Normal file
11
wiki/wiki.m4
Normal file
@ -0,0 +1,11 @@
|
||||
changecom(`<!--', `-->')dnl
|
||||
define(`_bibliography', `<UL>$1</UL>')dnl
|
||||
define(`_bibliography_entry', `<LI>$1</LI>')dnl
|
||||
define(`_bentr', `_bibliography_entry($1)')dnl
|
||||
define(`_cite', `<CITE>$1</CITE>')dnl
|
||||
define(`_code', `<CODE>$1</CODE>')dnl
|
||||
define(`_header', `<H2 ID="$1">$1</H2>')dnl
|
||||
define(`_subheader', `<H3>$1</H3>')dnl
|
||||
define(`_subsubheader', `<H4>$1</H4>')dnl
|
||||
define(`_link', `<A HREF="$2">$1</A>')dnl
|
||||
define(`_ref', `_link(`$1', `$1')')dnl
|
Loading…
Reference in New Issue
Block a user