[oe] [PATCH 1/5] rarpd : add recipe

Rongqing Li rongqing.li at windriver.com
Tue Nov 18 02:07:01 UTC 2014



On 2014年11月17日 19:00, Li xin wrote:
> RARP (Reverse Address Resolution Protocol) is a protocol which
> allows individual devices on an IP network to get their own IP
> addresses from the RARP server. Some machines (e.g. SPARC boxes)
> use this protocol instead of e.g. DHCP to query their IP addresses
> during network bootup.
>
> Linux kernels up to 2.2 used to provide a kernel daemon for this
> service,but since 2.3 kernels it is served by this userland daemon.
> You should install rarpd if you want to set up a RARP server on your
> network.
>
> Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
> ---
>   meta-oe/recipes-extended/nicstat/nicstat_1.95.bb   |  31 ++
>   .../rarpd/files/1000rarpd-ss981107.patch           | 592 +++++++++++++++++++++
>   .../rarpd/files/1001rarpd-norun.patch              |  13 +
>   .../rarpd/files/1002rarpd-initscript.patch         |  77 +++
>   .../rarpd/files/1003rarpd-fd-leak.patch            |  25 +
>   .../rarpd/files/1004rarpd-sprintf.patch            |  31 ++
>   .../rarpd/files/1005rarpd-initLSB.patch            |  85 +++
>   .../rarpd/files/1006rarpd-configurableInit.patch   |  23 +
>   meta-oe/recipes-extended/rarpd/files/ethers.sample |   1 +
>   meta-oe/recipes-extended/rarpd/files/rarpd.service |  14 +
>   meta-oe/recipes-extended/rarpd/rarpd_ss981107.bb   |  50 ++
>   11 files changed, 942 insertions(+)
>   create mode 100644 meta-oe/recipes-extended/nicstat/nicstat_1.95.bb
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/1000rarpd-ss981107.patch
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/1001rarpd-norun.patch
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/1002rarpd-initscript.patch
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/1003rarpd-fd-leak.patch
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/1004rarpd-sprintf.patch
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/1005rarpd-initLSB.patch
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/1006rarpd-configurableInit.patch
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/ethers.sample
>   create mode 100644 meta-oe/recipes-extended/rarpd/files/rarpd.service
>   create mode 100644 meta-oe/recipes-extended/rarpd/rarpd_ss981107.bb
>
> diff --git a/meta-oe/recipes-extended/nicstat/nicstat_1.95.bb b/meta-oe/recipes-extended/nicstat/nicstat_1.95.bb
> new file mode 100644
> index 0000000..31a015a
> --- /dev/null
> +++ b/meta-oe/recipes-extended/nicstat/nicstat_1.95.bb
> @@ -0,0 +1,31 @@
> +DESCRIPTION = "nicstat is a Solaris and Linux command-line that prints out network \
> +statistics for all network interface cards (NICs), including packets, kilobytes \
> +per second, average packet sizes and more."
> +HOMEPAGE = "http://nicstat.sourceforge.net"
> +
> +LICENSE = "Artistic-2.0"
> +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b4a94da2a1f918b217ef5156634fc9e0"
> +
> +SRC_URI = "http://softlayer-sng.dl.sourceforge.net/project/nicstat/${PN}-${PV}.tar.gz"
> +
> +SRC_URI[md5sum] = "9a0b87bbc670c1e738e5b40c7afd184d"
> +SRC_URI[sha256sum] = "c4cc33f8838f4523f27c3d7584eedbe59f4c587f0821612f5ac2201adc18b367"
> +
> +
> +do_compile() {
> +	${CC} ${CFLAGS} ${LDFLAGS} -o nicstat nicstat.c
> +}
> +
> +do_install() {
> +        install -d ${D}/${bindir}/
> +        install -d ${D}/${mandir}/
> +     	install -m 0755 ${S}/nicstat ${D}${bindir}/
> +	install -m 0644 ${S}/nicstat.1 ${D}/${mandir}/
> +}
> +
> +
> +
> +
> +
> +
> +

Remove these blank line



> diff --git a/meta-oe/recipes-extended/rarpd/files/1000rarpd-ss981107.patch b/meta-oe/recipes-extended/rarpd/files/1000rarpd-ss981107.patch
> new file mode 100644
> index 0000000..181ff42
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/1000rarpd-ss981107.patch
> @@ -0,0 +1,592 @@


All patches should have the patch header, which include
Upstream-Status, Sign-off-by

-Roy

> +--- rarpd/Makefile.jj	Sat Nov  7 15:29:54 1998
> ++++ rarpd/Makefile	Fri Apr  7 10:40:29 2000
> +@@ -1,7 +1,7 @@
> + CC=gcc
> + CFLAGS=-O2 -Wall -g $(DEFINES)
> +
> +-OBJ=rarpd.o ethernet.o
> ++OBJ=rarpd.o
> +
> + all: rarpd
> +
> +--- rarpd/ethernet.c.jj	Fri Nov  6 16:17:42 1998
> ++++ rarpd/ethernet.c	Thu Jan  1 01:00:00 1970
> +@@ -1,224 +0,0 @@
> +-/*
> +- * Copyright (c) 1990, 1993 The Regents of the University of California.
> +- * All rights reserved.
> +- *
> +- * Redistribution and use in source and binary forms, with or without
> +- * modification, are permitted provided that: (1) source code distributions
> +- * retain the above copyright notice and this paragraph in its entirety, (2)
> +- * distributions including binary code include the above copyright notice and
> +- * this paragraph in its entirety in the documentation or other materials
> +- * provided with the distribution, and (3) all advertising materials mentioning
> +- * features or use of this software display the following acknowledgement:
> +- * ``This product includes software developed by the University of California,
> +- * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
> +- * the University nor the names of its contributors may be used to endorse
> +- * or promote products derived from this software without specific prior
> +- * written permission.
> +- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
> +- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
> +- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
> +- */
> +-#ifndef lint
> +-static char rcsid[] =
> +-    "@(#) $Header: etherent.c,v 1.4 96/06/14 20:34:25 leres Exp $ (LBL)";
> +-#endif
> +-
> +-#include <sys/types.h>
> +-#include <sys/stat.h>
> +-#include <sys/time.h>
> +-
> +-#include <ctype.h>
> +-#include <stdio.h>
> +-#include <string.h>
> +-
> +-#ifndef ETHERS_FILE
> +-#define ETHERS_FILE "/etc/ethers"
> +-#endif
> +-
> +-struct etherent {
> +-        u_char addr[6];
> +-        char name[122];
> +-};
> +-
> +-static FILE *ether_fp = NULL;
> +-
> +-
> +-/* Hex digit to integer. */
> +-static inline int
> +-xdtoi(c)
> +-	int c;
> +-{
> +-
> +-	if (isdigit(c))
> +-		return c - '0';
> +-	else if (islower(c))
> +-		return c - 'a' + 10;
> +-	else
> +-		return c - 'A' + 10;
> +-}
> +-
> +-static inline int
> +-skip_space(f)
> +-	FILE *f;
> +-{
> +-	int c;
> +-
> +-	do {
> +-		c = getc(f);
> +-	} while (isspace(c) && c != '\n');
> +-
> +-	return c;
> +-}
> +-
> +-static inline int
> +-skip_line(f)
> +-	FILE *f;
> +-{
> +-	int c;
> +-
> +-	do
> +-		c = getc(f);
> +-	while (c != '\n' && c != EOF);
> +-
> +-	return c;
> +-}
> +-
> +-static struct etherent *
> +-next_etherent(fp)
> +-	FILE *fp;
> +-{
> +-	register int c, d, i;
> +-	char *bp;
> +-	static struct etherent e;
> +-	static int nline = 1;
> +- top:
> +-	while (nline) {
> +-		/* Find addr */
> +-		c = skip_space(fp);
> +-		if (c == '\n')
> +-			continue;
> +-		/* If this is a comment, or first thing on line
> +-		   cannot be etehrnet address, skip the line. */
> +-		else if (!isxdigit(c))
> +-			c = skip_line(fp);
> +-		else {
> +-			/* must be the start of an address */
> +-			for (i = 0; i < 6; i += 1) {
> +-				d = xdtoi(c);
> +-				c = getc(fp);
> +-				if (c != ':') {
> +-					d <<= 4;
> +-					d |= xdtoi(c);
> +-					c = getc(fp);
> +-				}
> +-				e.addr[i] = d;
> +-				if (c != ':')
> +-					break;
> +-				c = getc(fp);
> +-			}
> +-			nline = 0;
> +-		}
> +-		if (c == EOF)
> +-			return NULL;
> +-	}
> +-	
> +-	/* If we started a new line, 'c' holds the char past the ether addr,
> +-	   which we assume is white space.  If we are continuing a line,
> +-	   'c' is garbage.  In either case, we can throw it away. */
> +-	
> +-	c = skip_space(fp);
> +-	if (c == '\n') {
> +-		nline = 1;
> +-		goto top;
> +-	}
> +-	else if (c == '#') {
> +-		(void)skip_line(fp);
> +-		nline = 1;
> +-		goto top;
> +-	}
> +-	else if (c == EOF)
> +-		return NULL;
> +-	
> +-	/* Must be a name. */
> +-	bp = e.name;
> +-	/* Use 'd' to prevent buffer overflow. */
> +-	d = sizeof(e.name) - 1;
> +-	do {
> +-		*bp++ = c;
> +-		c = getc(fp);
> +-	} while (!isspace(c) && c != EOF && --d > 0);
> +-	*bp = '\0';
> +-	if (c == '\n')
> +-		nline = 1;
> +-
> +-	return &e;
> +-}
> +-
> +-/* Open/rewind the ethers files; returns 1 if file was reopened */
> +-int
> +-ether_rewind()
> +-{
> +-	struct stat st;
> +-	static long mtime = 0, ctime = 0;
> +-
> +-	if (ether_fp != NULL) {
> +-		if (fstat(fileno(ether_fp), &st) < 0 ||
> +-		    mtime != st.st_mtime || ctime != st.st_ctime ||
> +-		    fseek(ether_fp, 0L, SEEK_SET) < 0) {
> +-			fclose(ether_fp);
> +-			ether_fp = NULL;
> +-		}
> +-	}
> +-	if (ether_fp == NULL) {
> +-		ether_fp = fopen(ETHERS_FILE, "r");
> +-		if (ether_fp == NULL)
> +-			return (-1);
> +-		if (fstat(fileno(ether_fp), &st) < 0) {
> +-			fclose(ether_fp);
> +-			ether_fp = NULL;
> +-			return (-1);
> +-		}
> +-		mtime = st.st_mtime;
> +-		ctime = st.st_ctime;
> +-		return (1);
> +-	}
> +-	return (0);
> +-}
> +-
> +-/* Map an ethernet address to a name; returns 0 on success, else 1. */
> +-int
> +-ether_ntohost(name, ea)
> +-	register char *name;
> +-	register u_char *ea;
> +-{
> +-	register struct etherent *ep;
> +-
> +-	if (ether_rewind() < 0)
> +-		return (1);
> +-
> +-	while ((ep = next_etherent(ether_fp)) != NULL)
> +-		if (bcmp(ep->addr, ea, 6) == 0) {
> +-			strcpy(name, ep->name);
> +-			return (0);
> +-		}
> +-	return (1);
> +-}
> +-
> +-/* Map an ethernet name to an address; returns 0 on success, else 1. */
> +-int
> +-ether_hostton(name, ea)
> +-	register char *name;
> +-	register u_char *ea;
> +-{
> +-	register struct etherent *ep;
> +-
> +-	if (ether_rewind() < 0)
> +-		return (1);
> +-
> +-	while ((ep = next_etherent(ether_fp)) != NULL)
> +-		if (strcmp(ep->name, name) == 0) {
> +-			bcopy(ep->addr, ea, 6);
> +-			return (0);
> +-		}
> +-	return (1);
> +-}
> +--- rarpd/rarpd.8.jj	Thu Jan  1 01:00:00 1970
> ++++ rarpd/rarpd.8	Fri Apr  7 10:47:16 2000
> +@@ -0,0 +1,69 @@
> ++.TH RARP 8 "7 April 2000" "rarpd" "Linux Programmer's Manual"
> ++.SH NAME
> ++rarpd \- Reverse Address Resolution Protocol (RARP) daemon
> ++.SH SYNOPSIS
> ++.B "rarpd [-aAvde] [-b bootdir ] [ interface ]"
> ++.SH DESCRIPTION
> ++.B Rarpd
> ++is a daemon which responds to RARP requests.
> ++RARP is used by some machines at boot time to discover their IP address.
> ++They provide their Ethernet address and
> ++.B rarpd
> ++responds with their IP address if it finds it in the ethers database
> ++(either
> ++.I /etc/ethers
> ++file or NIS+ lookup) and using DNS lookup if ethers database
> ++contains a hostname and not an IP address.
> ++By default
> ++.B rarpd
> ++also checks if a bootable image with a name starting with the IP address
> ++in hexadecimal uppercase letters is present in the TFTP boot directory
> ++(usually
> ++.I /tftpboot
> ++) before it decides to respond to the RARP request.
> ++.SH OPTIONS
> ++.TP
> ++.B \-a
> ++Do not bind to the interface.
> ++.TP
> ++.B \-A
> ++Respond to ARP as well as RARP requests.
> ++.TP
> ++.B \-v
> ++Tell the user what is going on by being verbose.
> ++.TP
> ++.B \-d
> ++Debugging mode. Do not detach from the tty.
> ++.TP
> ++.B \-e
> ++Skip the check for bootable image in the TFTP boot directory. If not
> ++present, then even if the Ethernet address is present in
> ++the ethers database but the bootable image for the resolved IP does not exist,
> ++.B rarpd
> ++will not respond to the request.
> ++.TP
> ++.B "\-b bootdir"
> ++Use
> ++.I bootdir
> ++instead of the default
> ++.I /tftpboot
> ++as the TFTP boot directory for bootable image checks.
> ++.SH OBSOLETES
> ++This
> ++.B rarpd
> ++obsoletes kernel
> ++.B rarp
> ++daemon present in Linux kernels up to 2.2 which was controlled by the
> ++rarp(8) command.
> ++.SH FILES
> ++.I /etc/ethers,
> ++.br
> ++.I /etc/nsswitch.conf,
> ++.br
> ++.I /tftpboot
> ++.SH SEE ALSO
> ++ethers(5)
> ++.SH AUTHORS
> ++Alexey Kuznetsov, <kuznet at ms2.inr.ac.ru>
> ++.br
> ++Jakub Jelinek, <jakub at redhat.com>
> +--- rarpd/rarpd.c.jj	Sat Nov  7 15:48:40 1998
> ++++ rarpd/rarpd.c	Fri Apr  7 15:35:44 2000
> +@@ -7,6 +7,7 @@
> +  *		2 of the License, or (at your option) any later version.
> +  *
> +  * Authors:	Alexey Kuznetsov, <kuznet at ms2.inr.ac.ru>
> ++ *		Jakub Jelinek, <jakub at redhat.com>
> +  */
> +
> + #include <stdio.h>
> +@@ -26,6 +27,8 @@
> + #include <net/if.h>
> + #include <net/if_arp.h>
> + #include <netinet/in.h>
> ++#include <netinet/ether.h>
> ++#include <asm/types.h>
> + #include <linux/if_packet.h>
> + #include <linux/filter.h>
> +
> +@@ -39,27 +42,26 @@
> + int all_ifaces;
> + int listen_arp;
> + char *ifname;
> +-char *tftp_dir = "/etc/tftpboot";
> ++char *tftp_dir = "/tftpboot";
> +
> +-extern int ether_ntohost(char *name, unsigned char *ea);
> + void usage(void) __attribute__((noreturn));
> +
> +-struct iflink
> ++struct rarpiflink
> + {
> +-	struct iflink	*next;
> +-	int	       	index;
> +-	int		hatype;
> +-	unsigned char	lladdr[16];
> +-	unsigned char	name[IFNAMSIZ];
> +-	struct ifaddr 	*ifa_list;
> ++	struct rarpiflink	*next;
> ++	int	       		index;
> ++	int			hatype;
> ++	unsigned char		lladdr[16];
> ++	unsigned char		name[IFNAMSIZ];
> ++	struct rarpifaddr 	*ifa_list;
> + } *ifl_list;
> +
> +-struct ifaddr
> ++struct rarpifaddr
> + {
> +-	struct ifaddr 	*next;
> +-	__u32		prefix;
> +-	__u32		mask;
> +-	__u32		local;
> ++	struct rarpifaddr 	*next;
> ++	__u32			prefix;
> ++	__u32			mask;
> ++	__u32			local;
> + };
> +
> + struct rarp_map
> +@@ -87,8 +89,8 @@
> + {
> + 	int fd;
> + 	struct ifreq *ifrp, *ifend;
> +-	struct iflink *ifl;
> +-	struct ifaddr *ifa;
> ++	struct rarpiflink *ifl;
> ++	struct rarpifaddr *ifa;
> + 	struct ifconf ifc;
> + 	struct ifreq ibuf[256];
> +
> +@@ -144,7 +146,7 @@
> + 				continue;
> + 			}
> +
> +-			ifl = (struct iflink*)malloc(sizeof(*ifl));
> ++			ifl = (struct rarpiflink*)malloc(sizeof(*ifl));
> + 			if (ifl == NULL)
> + 				continue;
> + 			memset(ifl, 0, sizeof(*ifl));
> +@@ -154,6 +156,7 @@
> + 			ifl->hatype = ifrp->ifr_hwaddr.sa_family;
> + 			memcpy(ifl->lladdr, ifrp->ifr_hwaddr.sa_data, 14);
> + 			strncpy(ifl->name, ifrp->ifr_name, IFNAMSIZ);
> ++			ifl->name[IFNAMSIZ-1] = 0;
> + 			p = strchr(ifl->name, ':');
> + 			if (p)
> + 				*p = 0;
> +@@ -179,7 +182,7 @@
> + 		if (ifa == NULL) {
> + 			if (mask == 0 || prefix == 0)
> + 				continue;
> +-			ifa = (struct ifaddr*)malloc(sizeof(*ifa));
> ++			ifa = (struct rarpifaddr*)malloc(sizeof(*ifa));
> + 			memset(ifa, 0, sizeof(*ifa));
> + 			ifa->local = addr;
> + 			ifa->prefix = prefix;
> +@@ -235,10 +238,10 @@
> + 	return dent != NULL;
> + }
> +
> +-struct ifaddr *select_ipaddr(int ifindex, __u32 *sel_addr, __u32 **alist)
> ++struct rarpifaddr *select_ipaddr(int ifindex, __u32 *sel_addr, __u32 **alist)
> + {
> +-	struct iflink *ifl;
> +-	struct ifaddr *ifa;
> ++	struct rarpiflink *ifl;
> ++	struct rarpifaddr *ifa;
> + 	int retry = 0;
> + 	int i;
> +
> +@@ -294,7 +297,7 @@
> +
> + 	if (r == NULL) {
> + 		if (hatype == ARPHRD_ETHER && halen == 6) {
> +-			struct ifaddr *ifa;
> ++			struct rarpifaddr *ifa;
> + 			struct hostent *hp;
> + 			char ename[256];
> + 			static struct rarp_map emap = {
> +@@ -304,7 +307,7 @@
> + 				6,
> + 			};
> +
> +-			if (ether_ntohost(ename, lladdr) != 0 ||
> ++			if (ether_ntohost(ename, (struct ether_addr *)lladdr) != 0 ||
> + 			    (hp = gethostbyname(ename)) == NULL) {
> + 				if (verbose)
> + 					syslog(LOG_INFO, "not found in /etc/ethers");
> +@@ -345,7 +348,7 @@
> +
> + int put_mylladdr(unsigned char **ptr_p, int ifindex, int alen)
> + {
> +-	struct iflink *ifl;
> ++	struct rarpiflink *ifl;
> +
> + 	for (ifl=ifl_list; ifl; ifl = ifl->next)
> + 		if (ifl->index == ifindex)
> +@@ -362,8 +365,8 @@
> + int put_myipaddr(unsigned char **ptr_p, int ifindex, __u32 hisipaddr)
> + {
> + 	__u32 laddr = 0;
> +-	struct iflink *ifl;
> +-	struct ifaddr *ifa;
> ++	struct rarpiflink *ifl;
> ++	struct rarpifaddr *ifa;
> +
> + 	for (ifl=ifl_list; ifl; ifl = ifl->next)
> + 		if (ifl->index == ifindex)
> +@@ -388,7 +391,7 @@
> + 	int fd;
> + 	struct arpreq req;
> + 	struct sockaddr_in *sin;
> +-	struct iflink *ifl;
> ++	struct rarpiflink *ifl;
> +
> + 	for (ifl=ifl_list; ifl; ifl = ifl->next)
> + 		if (ifl->index == ifindex)
> +@@ -421,6 +424,10 @@
> + 	struct rarp_map *rmap;
> + 	unsigned char *ptr;
> + 	int n;
> ++	int i;
> ++	char tmpbuf[16*3];
> ++	char tmpname[IFNAMSIZ];
> ++	struct rarpiflink *ifl;
> +
> + 	n = recvfrom(fd, buf, sizeof(buf), MSG_DONTWAIT, (struct sockaddr*)&sll, &sll_len);
> + 	if (n<0) {
> +@@ -447,20 +454,25 @@
> + 	if (a->ar_op != htons(ARPOP_RREQUEST))
> + 		return;
> +
> +-	if (verbose) {
> +-		int i;
> +-		char tmpbuf[16*3];
> +-		char *ptr = tmpbuf;
> +-		for (i=0; i<sll.sll_halen; i++) {
> +-			if (i) {
> +-				sprintf(ptr, ":%02x", sll.sll_addr[i]);
> +-				ptr++;
> +-			} else
> +-				sprintf(ptr, "%02x", sll.sll_addr[i]);
> +-			ptr += 2;
> +-		}
> +-		syslog(LOG_INFO, "RARP request from %s on if%d", tmpbuf, sll.sll_ifindex);
> ++	ptr = tmpbuf;
> ++	for (i=0; i<sll.sll_halen; i++) {
> ++		if (i) {
> ++			sprintf(ptr, ":%02x", sll.sll_addr[i]);
> ++			ptr++;
> ++		} else
> ++			sprintf(ptr, "%02x", sll.sll_addr[i]);
> ++		ptr += 2;
> + 	}
> ++	
> ++	for (ifl=ifl_list; ifl; ifl = ifl->next)
> ++		if (ifl->index == sll.sll_ifindex)
> ++			break;
> ++	if (ifl) {
> ++		strncpy(tmpname, ifl->name, IFNAMSIZ);
> ++		tmpname[IFNAMSIZ-1] = 0;
> ++	} else
> ++		sprintf(tmpname, "if%d", sll.sll_ifindex);
> ++	syslog(LOG_INFO, "RARP request from %s on %s", tmpbuf, tmpname);
> +
> + 	/* Sanity checks */
> +
> +@@ -526,6 +538,8 @@
> + 	ptr += rmap->lladdr_len;
> + 	memcpy(ptr, &rmap->ipaddr, 4);
> + 	ptr += 4;
> ++	syslog(LOG_INFO, "RARP response to %s %s on %s", tmpbuf,
> ++	       inet_ntoa(*(struct in_addr *)&rmap->ipaddr), tmpname);
> +
> + 	/* Update our ARP cache. Probably, this guy
> + 	   will not able to make ARP (if it is broken)
> +@@ -613,7 +627,7 @@
> +         if (ifname) {
> + 		struct ifreq ifr;
> + 		memset(&ifr, 0, sizeof(ifr));
> +-		strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
> ++		strncpy(ifr.ifr_name, ifname, IFNAMSIZ-1);
> + 		if (ioctl(pset[0].fd, SIOCGIFINDEX, &ifr)) {
> + 			perror("ioctl(SIOCGIFINDEX)");
> + 			usage();
> +--- rarpd/rarpd.init.jj	Thu Jan  1 01:00:00 1970
> ++++ rarpd/rarpd.init	Fri Apr  7 15:42:38 2000
> +@@ -0,0 +1,53 @@
> ++#!/bin/bash
> ++#
> ++#	/etc/init.d/rarpd
> ++#
> ++# Starts the rarpd daemon
> ++#
> ++# chkconfig: 345 82 16
> ++# description: Servers Reverse Address Resolution Protocol requests.
> ++# processname: rarpd
> ++
> ++# Source function library.
> ++. /etc/init.d/functions
> ++
> ++test -x /usr/sbin/rarpd -a -f /etc/ethers || exit 0
> ++
> ++RETVAL=0
> ++
> ++#
> ++#	See how we were called.
> ++#
> ++case "$1" in
> ++  start)
> ++	# Check if rarpd is already running
> ++	if [ ! -f /var/lock/subsys/rarpd ]; then
> ++	    echo -n 'Starting at daemon: '
> ++	    daemon /usr/sbin/rarpd
> ++	    RETVAL=$?
> ++	    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/rarpd
> ++	    echo
> ++	fi
> ++	;;
> ++  stop)
> ++	echo -n 'Stopping at daemon: '
> ++	killproc /usr/sbin/rarpd
> ++	RETVAL=$?
> ++	[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/rarpd
> ++	echo
> ++	;;
> ++  reload|restart)
> ++	$0 stop
> ++	$0 start
> ++	RETVAL=$?
> ++	;;
> ++  status)
> ++	status /usr/sbin/rarpd
> ++	RETVAL=$?
> ++	;;
> ++  *)
> ++	echo "Usage: /etc/init.d/rarpd {start|stop|restart|reload|status}"
> ++	exit 1
> ++esac
> ++
> ++exit $RETVAL
> diff --git a/meta-oe/recipes-extended/rarpd/files/1001rarpd-norun.patch b/meta-oe/recipes-extended/rarpd/files/1001rarpd-norun.patch
> new file mode 100644
> index 0000000..55e6dfd
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/1001rarpd-norun.patch
> @@ -0,0 +1,13 @@
> +--- rarpd/rarpd.init.foo	Fri Jun 16 16:29:01 2000
> ++++ rarpd/rarpd.init	Fri Jun 16 16:29:13 2000
> +@@ -4,8 +4,8 @@
> + #
> + # Starts the rarpd daemon
> + #
> +-# chkconfig: 345 82 16
> +-# description: Servers Reverse Address Resolution Protocol requests.
> ++# chkconfig: - 82 16
> ++# description: Server Reverse Address Resolution Protocol requests.
> + # processname: rarpd
> +
> + # Source function library.
> diff --git a/meta-oe/recipes-extended/rarpd/files/1002rarpd-initscript.patch b/meta-oe/recipes-extended/rarpd/files/1002rarpd-initscript.patch
> new file mode 100644
> index 0000000..b08eaac
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/1002rarpd-initscript.patch
> @@ -0,0 +1,77 @@
> +--- rarpd/rarpd.init.initscript	Thu Mar 15 16:44:18 2001
> ++++ rarpd/rarpd.init	Thu Mar 15 16:46:16 2001
> +@@ -9,44 +9,60 @@
> + # processname: rarpd
> +
> + # Source function library.
> +-. /etc/init.d/functions
> ++. /etc/init.d/functions
> +
> + test -x /usr/sbin/rarpd -a -f /etc/ethers || exit 0
> +
> + RETVAL=0
> ++prog="rarpd"
> +
> +-#
> +-#	See how we were called.
> +-#
> +-case "$1" in
> +-  start)
> ++start() {
> + 	# Check if rarpd is already running
> + 	if [ ! -f /var/lock/subsys/rarpd ]; then
> +-	    echo -n 'Starting at daemon: '
> ++	    echo -n $"Starting $prog: "
> + 	    daemon /usr/sbin/rarpd
> + 	    RETVAL=$?
> + 	    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/rarpd
> + 	    echo
> + 	fi
> +-	;;
> +-  stop)
> +-	echo -n 'Stopping at daemon: '
> ++	return $RETVAL
> ++}
> ++
> ++stop() {
> ++	echo -n $"Stopping $prog: "
> + 	killproc /usr/sbin/rarpd
> + 	RETVAL=$?
> + 	[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/rarpd
> + 	echo
> ++	return $RETVAL
> ++}
> ++
> ++#
> ++#	See how we were called.
> ++#
> ++case "$1" in
> ++  start)
> ++	start
> ++	;;
> ++  stop)
> ++	stop
> + 	;;
> +   reload|restart)
> +-	$0 stop
> +-	$0 start
> +-	RETVAL=$?
> ++        stop
> ++	start
> ++	;;
> ++  condrestart)
> ++	if [ -f /var/lock/subsys/rarpd ]; then
> ++	    stop
> ++	    start
> ++	fi
> + 	;;
> +   status)
> + 	status /usr/sbin/rarpd
> + 	RETVAL=$?
> + 	;;
> +   *)
> +-	echo "Usage: /etc/init.d/rarpd {start|stop|restart|reload|status}"
> ++	echo $"Usage: $0 {start|stop|restart|condrestart|reload|status}"
> + 	exit 1
> + esac
> +
> diff --git a/meta-oe/recipes-extended/rarpd/files/1003rarpd-fd-leak.patch b/meta-oe/recipes-extended/rarpd/files/1003rarpd-fd-leak.patch
> new file mode 100644
> index 0000000..7ca7ee5
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/1003rarpd-fd-leak.patch
> @@ -0,0 +1,25 @@
> +--- rarpd/rarpd.c.leak	2005-04-25 08:13:26.000000000 -0400
> ++++ rarpd/rarpd.c	2005-04-27 13:28:22.000000000 -0400
> +@@ -210,6 +210,7 @@
> + 			}
> + 		}
> + 	}
> ++	close(fd);
> + }
> +
> + void configure()
> +@@ -228,12 +229,13 @@
> + 	d = opendir(tftp_dir);
> + 	if (d == NULL) {
> + 		syslog(LOG_ERR, "opendir: %m");
> +-		return 0;
> ++		goto done_bootable;
> + 	}
> + 	while ((dent = readdir(d)) != NULL) {
> + 		if (strncmp(dent->d_name, name, 8) == 0)
> + 			break;
> + 	}
> ++done_bootable:
> + 	closedir(d);
> + 	return dent != NULL;
> + }
> diff --git a/meta-oe/recipes-extended/rarpd/files/1004rarpd-sprintf.patch b/meta-oe/recipes-extended/rarpd/files/1004rarpd-sprintf.patch
> new file mode 100644
> index 0000000..382e16f
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/1004rarpd-sprintf.patch
> @@ -0,0 +1,31 @@
> +--- rarpd/rarpd.c.sprintf	2005-07-26 18:14:47.000000000 +0200
> ++++ rarpd/rarpd.c	2005-07-26 18:18:42.000000000 +0200
> +@@ -11,6 +11,7 @@
> +  */
> +
> + #include <stdio.h>
> ++#include <stdlib.h>
> + #include <syslog.h>
> + #include <dirent.h>
> + #include <malloc.h>
> +@@ -457,15 +458,12 @@
> + 		return;
> +
> + 	ptr = tmpbuf;
> +-	for (i=0; i<sll.sll_halen; i++) {
> +-		if (i) {
> +-			sprintf(ptr, ":%02x", sll.sll_addr[i]);
> +-			ptr++;
> +-		} else
> +-			sprintf(ptr, "%02x", sll.sll_addr[i]);
> +-		ptr += 2;
> ++        snprintf(tmpbuf, 2, "%02x", sll.sll_addr[0]);
> ++	for (ptr=tmpbuf+2, i=1; i<sll.sll_halen; i++) {
> ++		snprintf(ptr, 3, ":%02x", sll.sll_addr[i]);
> ++		ptr += 3;
> + 	}
> +-	
> ++
> + 	for (ifl=ifl_list; ifl; ifl = ifl->next)
> + 		if (ifl->index == sll.sll_ifindex)
> + 			break;
> diff --git a/meta-oe/recipes-extended/rarpd/files/1005rarpd-initLSB.patch b/meta-oe/recipes-extended/rarpd/files/1005rarpd-initLSB.patch
> new file mode 100644
> index 0000000..396a4a7
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/1005rarpd-initLSB.patch
> @@ -0,0 +1,85 @@
> +Only in rarpd_patchedinit/: debugfiles.list
> +Only in rarpd_patchedinit/: debugsources.list
> +Only in rarpd_patchedinit/: rarpd
> +diff -urp rarpd/rarpd.init rarpd_patchedinit/rarpd.init
> +--- rarpd/rarpd.init	2007-07-23 14:26:36.000000000 +0200
> ++++ rarpd_patchedinit/rarpd.init	2007-07-23 14:22:09.000000000 +0200
> +@@ -8,17 +8,32 @@
> + # description: Server Reverse Address Resolution Protocol requests.
> + # processname: rarpd
> +
> ++### BEGIN INIT INFO
> ++# Provides: rarpd
> ++# Required-Start: $syslog $network
> ++# Required-Stop:  $syslog $network
> ++# Default-Start:
> ++# Default-Stop: 0 1 2 3 4 5 6
> ++# Short-Description: start and stop rarpd
> ++# Description: RARP (Reverse Address Resolution Protocol) is a protocol \
> ++#              which allows individual devices on an IP network to get \
> ++#              their own IP addresses from the RARP server. \
> ++### END INIT INFO
> ++
> + # Source function library.
> + . /etc/init.d/functions
> +
> +-test -x /usr/sbin/rarpd -a -f /etc/ethers || exit 0
> +-
> + RETVAL=0
> + prog="rarpd"
> +
> ++
> + start() {
> ++    #if these files don't exist rarpd can't work
> ++    test -x /usr/sbin/rarpd -a -f /etc/ethers || exit 6
> + 	# Check if rarpd is already running
> +-	if [ ! -f /var/lock/subsys/rarpd ]; then
> ++	#if [ ! -f /var/lock/subsys/rarpd ]; then
> ++    status rarpd;
> ++    if [ $? -ne 0 ]; then
> + 	    echo -n $"Starting $prog: "
> + 	    daemon /usr/sbin/rarpd
> + 	    RETVAL=$?
> +@@ -36,6 +51,9 @@ stop() {
> + 	echo
> + 	return $RETVAL
> + }
> ++reload() {
> ++    RETVAL=3
> ++}
> +
> + #
> + #	See how we were called.
> +@@ -47,8 +65,11 @@ case "$1" in
> +   stop)
> + 	stop
> + 	;;
> +-  reload|restart)
> +-        stop
> ++  reload)
> ++    reload
> ++    ;;
> ++  force-reload|restart)
> ++    stop
> + 	start
> + 	;;
> +   condrestart)
> +@@ -58,12 +79,13 @@ case "$1" in
> + 	fi
> + 	;;
> +   status)
> +-	status /usr/sbin/rarpd
> ++	status rarpd
> + 	RETVAL=$?
> + 	;;
> +   *)
> +-	echo $"Usage: $0 {start|stop|restart|condrestart|reload|status}"
> +-	exit 1
> ++	echo $"Usage: $0 {start|stop|restart|condrestart|reload|status|force-reload}"
> ++	RETVAL=2
> ++
> + esac
> +
> + exit $RETVAL
> +Only in rarpd_patchedinit/: rarpd.init~
> +Only in rarpd_patchedinit/: rarpd.o
> diff --git a/meta-oe/recipes-extended/rarpd/files/1006rarpd-configurableInit.patch b/meta-oe/recipes-extended/rarpd/files/1006rarpd-configurableInit.patch
> new file mode 100644
> index 0000000..9950dd1
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/1006rarpd-configurableInit.patch
> @@ -0,0 +1,23 @@
> +--- rarpd/rarpd.init	2007-07-30 11:53:35.000000000 +0200
> ++++ rarpd_configurable/rarpd.init	2007-07-30 11:45:20.000000000 +0200
> +@@ -23,6 +23,11 @@
> + # Source function library.
> + . /etc/init.d/functions
> +
> ++# Read the config file if exists
> ++if [ -f /etc/sysconfig/rarpd ]; then
> ++ . /etc/sysconfig/rarpd
> ++fi
> ++
> + RETVAL=0
> + prog="rarpd"
> +
> +@@ -35,7 +40,7 @@ start() {
> +     status rarpd;
> +     if [ $? -ne 0 ]; then
> + 	    echo -n $"Starting $prog: "
> +-	    daemon /usr/sbin/rarpd
> ++	    daemon /usr/sbin/rarpd $OPTIONS $INTERFACE
> + 	    RETVAL=$?
> + 	    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/rarpd
> + 	    echo
> diff --git a/meta-oe/recipes-extended/rarpd/files/ethers.sample b/meta-oe/recipes-extended/rarpd/files/ethers.sample
> new file mode 100644
> index 0000000..249ca6b
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/ethers.sample
> @@ -0,0 +1 @@
> +# see man ethers for syntax
> diff --git a/meta-oe/recipes-extended/rarpd/files/rarpd.service b/meta-oe/recipes-extended/rarpd/files/rarpd.service
> new file mode 100644
> index 0000000..137710e
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/rarpd.service
> @@ -0,0 +1,14 @@
> +[Unit]
> +Description=Reverse Address Resolution Protocol Requests Server
> +Requires=network.target
> +After=syslog.target network.target
> +
> +[Service]
> +Type=forking
> +EnvironmentFile=-/etc/sysconfig/rarpd
> +ExecStart=/usr/sbin/rarpd $OPTIONS $INTERFACE
> +StandardError=syslog
> +
> +[Install]
> +WantedBy=multi-user.target
> +
> diff --git a/meta-oe/recipes-extended/rarpd/rarpd_ss981107.bb b/meta-oe/recipes-extended/rarpd/rarpd_ss981107.bb
> new file mode 100644
> index 0000000..df705e0
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/rarpd_ss981107.bb
> @@ -0,0 +1,50 @@
> +SUMMARY = "The RARP daemon."
> +DESCRIPTION = "RARP (Reverse Address Resolution Protocol) is a protocol which \
> +allows individual devices on an IP network to get their own IP addresses from \
> +the RARP server. Some machines (e.g. SPARC boxes) use this protocol instead \
> +of e.g. DHCP to query their IP addresses during network bootup. \
> +Linux kernels up to 2.2 used to provide a kernel daemon for this service, \
> +but since 2.3 kernels it is served by this userland daemon. \
> +You should install rarpd if you want to set up a RARP server on your \
> +network."
> +SECTION = "System Environment/Daemons"
> +
> +SRC_URI = "http://pkgs.fedoraproject.org/repo/pkgs/${PN}/${PN}-${PV}.tar.gz/be2a88f8ccddf2a40ac484cb3294fedc/${PN}-${PV}.tar.gz"
> +SRC_URI[md5sum] = "be2a88f8ccddf2a40ac484cb3294fedc"
> +SRC_URI[sha256sum] = "4d6145d435a5d8b567b9798620f57f9b0a464078a1deba267958f168fbe776e6"
> +
> +SRC_URI += "file://1000rarpd-ss981107.patch \
> +            file://1001rarpd-norun.patch \
> +            file://1002rarpd-initscript.patch \
> +            file://1003rarpd-fd-leak.patch \
> +            file://1004rarpd-sprintf.patch \
> +            file://1005rarpd-initLSB.patch \
> +            file://1006rarpd-configurableInit.patch \
> +            file://ethers.sample \
> +            file://rarpd.service \
> +           "
> +LICENSE = "GPLv2+"
> +LIC_FILES_CHKSUM = "file://rarpd.c;md5=199b20b172ea93121bc613a9c77b6931"
> +
> +S = "${WORKDIR}/${PN}"
> +
> +do_install() {
> +        install -d ${D}${sysconfdir}/init.d
> +        install -d ${D}${sbindir}
> +        install -d ${D}${mandir}/man8
> +        install -m 755 rarpd.init ${D}${sysconfdir}/init.d/rarpd
> +        install -m 755 rarpd ${D}${sbindir}/rarpd
> +        install -m 644 rarpd.8 ${D}${mandir}/man8/rarpd.8
> +        install -m 644 ${WORKDIR}/ethers.sample ${D}${sysconfdir}/ethers
> +
> +        if ${@base_contains('DISTRO_FEATURES','systemd','true','false',d)}; then
> +	    install -d ${D}${systemd_unitdir}/system
> +	    install -m 0644 ${WORKDIR}/rarpd.service ${D}${systemd_unitdir}/system/
> +        fi
> +}
> +
> +inherit ${@base_contains('VIRTUAL-RUNTIME_init_manager','systemd','systemd','',d)}
> +
> +SYSTEMD_PACKAGES = "${PN}"
> +SYSTEMD_SERVICE_${PN} = "rarpd.service"
> +SYSTEMD_AUTO_ENABLE = "disable"
>

-- 
Best Reagrds,
Roy | RongQing Li



More information about the Openembedded-devel mailing list