This document attempts to explain basic styles and guidelines for the IPFire
network codebase. New code should conform to these standards. Of course every
rules has an exception, but still this should be followed as closely as
possible.

# Naming & Formatting Code

## Whitespace

Tabs. No spaces at an end of a line.

## Line Length

Lines should not be longer than 80 characters. 120 is definitely the hard limit.

## Indentation

One tab.

## Control Structures

	if cmd ...; then
		cmd ...
	fi

	while cmd ...; do
		cmd ...
	done

	local i
	for i in 1 2 3; do
		cmd ...
	done

	case "${var}" in
		1)
			cmd ...
			;;
		2)
			cmd ...
			;;
	esac

## Variables

Variables must be used with curly brackets: ${var}, NOT $var

Global variables should be ${UPPERCASE}. Local variables should be ${lowercase}.

## Function Declarations

	# This explains what the function is doing and
	# how it is supposed to be used...
	foo() {
		local arg1=${1}
		local arg2=${2}

		cmd ...
		cmd ...
	}

Arguments must be parsed as early as possible to give them meaningful names
instead of using ${1}, ${2}, ...

## Functions Exit Codes

Functions must always return a clean error code out of EXIT_OK, EXIT_ERROR,
EXIT_TRUE, EXIT_FALSE or others so that things are easily readable.

## Assertions

assert() should be used to catch any errors at runtime as early as possible.

They should not used to catch any issues that the user needs to be informed of.

The developer cannot rely on the statement being executed since we might skip the
executing of assertions when ever we need to.

## Lists

Lists of anything should be alphabetically ordered as long as there is no other
(i.e. better) reason to sort them otherwise. IPv6 is always first.

## Logging & Error Messages

Error messages must be short and clear. No trailing full stops.

They should always be passive sentences and present tense.
