aboutsummaryrefslogtreecommitdiffstats
path: root/docs/submitting-patches.tex
blob: c16aaa9dc1e57c87046039515ab5e71d32c6f40c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
\subsection{How to contribute}
OpenWrt is constantly being improved.  We'd like as many people to contribute
to this as we can get. If you find a change useful, by all means try to get
it incorporated into the project. This should improve OpenWrt and it should
help carry your changes forward into future versions

This section tries to lay out a procedure to enable people to submit patches
in a way that is most effective for all concerned.

It is important to do all these steps repeatedly:

\begin{itemize}
	\item \textit{listen} to what other people think.
	\item \textit{talk} explaining what problem you are addressing and your
		proposed solution.
	\item \textit{do} write useful patches including documentation.
    \item \textit{test. test. test.}
\end{itemize}

\subsection{Where to listen and talk}

\begin{itemize}
	\item google to find things related to your problem
	\item Mailing lists: \href{http://lists.openwrt.org/}{http://lists.openwrt.org/}
	\item Wiki: check the wiki: \href{http://wiki.openwrt.org/OpenWrtDocs}{http://wiki.openwrt.org/OpenWrtDocs}
	\item Forum: \href{http://forum.openwrt.org/}{http://forum.openwrt.org/}
	\item IRC: \texttt{irc.freenode.net}, channels \texttt{\#openwrt} and 
		\texttt{\#openwrt-devel}
	\item TRAC: \href{https://dev.openwrt.org/}{https://dev.openwrt.org/} the issue/bug/change tracking system
\end{itemize}

It is often best to document what you are doing before you do it.  The process
of documentation often exposes possible improvements.  Keep your documentation
up to date.

\subsection{Patch Submission Process}
\begin{enumerate}
	\item Use git or svn to create a patch. Creating patches manually with 
		\textit{diff -urN} also works, but is usually unnecessary.
	\item Send a mail to openwrt-devel@lists.openwrt.org with the following contents:
	\begin{enumerate}
		\item \texttt{[PATCH] <short description>} in the Subject, followed by:
		\item (optional) a longer description of your patch in the message body
        \item \texttt{Signed-off-by: Your name <your@email.address>}
		\item Your actual patch, inline, not word wrapped or whitespace mangled. 
	\end{enumerate}
	\item Please read \href{http://kerneltrap.org/Linux/Email\_Clients\_and\_Patches}{http://kerneltrap.org/Linux/Email\_Clients\_and\_Patches}
		to find out how to make sure your email client doesn't destroy your patch.
	\item Please use your real name and email address in the \texttt{Signed-off-by}
		line, following the same guidelines as in the \href{http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches;h=681e2b36195c98ea5271b76383b3a574b190b04f;hb=HEAD}{Linux Kernel patch submission guidelines}
	\item Example of a properly formatted patch submission: \\
	\href{http://lists.openwrt.org/pipermail/openwrt-devel/2007-November/001334.html}{http://lists.openwrt.org/pipermail/openwrt-devel/2007-November/001334.html}
\end{enumerate}
n class="c1"># (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA DIR="$1"; shift _cp() { cp ${VERBOSE:+-v} -L "$1" "$2" || { echo "cp($1 $2) failed" >&2 exit 1 } } _mv() { mv ${VERBOSE:+-v} "$1" "$2" || { echo "mv($1 $2) failed" >&2 exit 1 } } _md() { mkdir ${VERBOSE:+-v} -p "$1" || { echo "mkdir($1) failed" >&2 exit 2 } } _ln() { ln ${VERBOSE:+-v} -sf "$1" "$2" || { echo "ln($1 $2) failed" >&2 exit 3 } } _relpath() { local base="$(readlink -f "$1")" local dest="$(readlink -f "$2")" local up [ -d "$base" ] || base="${base%/*}" [ -d "$dest" ] || dest="${dest%/*}" while true; do case "$base" in "$dest"/*) echo "$up/${base#$dest/}" break ;; *) dest="${dest%/*}" up="${up:+$up/}.." ;; esac done } _runas_so() { cat <<-EOT | ${CC:-gcc} -x c -fPIC -shared -o "$1" - #include <unistd.h> #include <stdio.h> #include <stdlib.h> int mangle_arg0(int argc, char **argv, char **env) { char *arg0 = getenv("RUNAS_ARG0"); if (arg0) { argv[0] = arg0; unsetenv("RUNAS_ARG0"); } return 0; } #ifdef __APPLE__ __attribute__((section("__DATA,__mod_init_func"))) #else __attribute__((section(".init_array"))) #endif static void *mangle_arg0_constructor = &mangle_arg0; EOT [ -x "$1" ] || { echo "compiling preload library failed" >&2 exit 5 } } _patch_ldso() { _cp "$1" "$1.patched" sed -i -e 's,/\(usr\|lib\|etc\)/,/###/,g' "$1.patched" if "$1.patched" 2>&1 | grep -q -- --library-path; then _mv "$1.patched" "$1" else echo "binary patched ${1##*/} not executable, using original" >&2 rm -f "$1.patched" fi } _patch_glibc() { _cp "$1" "$1.patched" sed -i -e 's,/usr/\(\(lib\|share\)/locale\),/###/\1,g' "$1.patched" if "$1.patched" 2>&1 | grep -q -- GNU; then _mv "$1.patched" "$1" else echo "binary patched ${1##*/} not executable, using original" >&2 rm -f "$1.patched" fi } should_be_patched() { local bin="$1" [ -x "$bin" ] || return 1 case "$bin" in *.so|*.so.[0-9]*) return 1 ;; *) file "$bin" | grep -sqE "ELF.*(executable|interpreter)" && return 0 ;; esac return 1 } for LDD in ${PATH//://ldd }/ldd; do "$LDD" --version >/dev/null 2>/dev/null && break LDD="" done [ -n "$LDD" -a -x "$LDD" ] || LDD= for BIN in "$@"; do [ -n "$BIN" -a -n "$DIR" ] || { echo "Usage: $0 <destdir> <executable> ..." >&2 exit 1 } [ ! -d "$DIR/lib" ] && { _md "$DIR/lib" _md "$DIR/usr" _ln "../lib" "$DIR/usr/lib" } [ ! -x "$DIR/lib/runas.so" ] && { _runas_so "$DIR/lib/runas.so" } LDSO="" [ -n "$LDD" ] && should_be_patched "$BIN" && { for token in $("$LDD" "$BIN" 2>/dev/null); do case "$token" in */*.so*) dest="$DIR/lib/${token##*/}" ddir="${dest%/*}" case "$token" in */ld-*.so*) LDSO="${token##*/}" ;; esac [ -f "$token" -a ! -f "$dest" ] && { _md "$ddir" _cp "$token" "$dest" case "$token" in */ld-*.so*) _patch_ldso "$dest" ;; */libc.so.6) _patch_glibc "$dest" ;; esac } ;; esac done } # is a dynamically linked executable if [ -n "$LDSO" ]; then echo "Bundling ${BIN##*/}" RUNDIR="$(readlink -f "$BIN")"; RUNDIR="${RUNDIR%/*}" RUN="${LDSO#ld-}"; RUN="run-${RUN%%.so*}.sh" REL="$(_relpath "$DIR/lib" "$BIN")" _mv "$BIN" "$RUNDIR/.${BIN##*/}.bin" cat <<-EOF > "$BIN" #!/usr/bin/env bash dir="\$(dirname "\$0")" export RUNAS_ARG0="\$0" export LD_PRELOAD="\${LD_PRELOAD:+\$LD_PRELOAD:}\$dir/${REL:+$REL/}runas.so" exec "\$dir/${REL:+$REL/}$LDSO" --library-path "\$dir/${REL:+$REL/}" "\$dir/.${BIN##*/}.bin" "\$@" EOF chmod ${VERBOSE:+-v} 0755 "$BIN" fi done