[oe] [meta-oe][PATCH v2] rarpd : add new recipe
Martin Jansa
martin.jansa at gmail.com
Wed Nov 19 14:40:02 UTC 2014
On Tue, Nov 18, 2014 at 05:55:58PM +0800, 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>
> ---
> .../rarpd/files/0001-rarpd.8-add-man-file.patch | 89 +++++++
> .../0002-Makefile-modify-compile-parameters.patch | 26 ++
> .../rarpd/files/0003-rarpd.c-bug-fix.patch | 263 +++++++++++++++++++++
> .../files/0004-rarpd.init-add-new-init-file.patch | 116 +++++++++
> .../rarpd/files/0005-ethernet.c-remove-it.patch | 244 +++++++++++++++++++
> 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 | 48 ++++
> 8 files changed, 801 insertions(+)
> create mode 100644 meta-oe/recipes-extended/rarpd/files/0001-rarpd.8-add-man-file.patch
> create mode 100644 meta-oe/recipes-extended/rarpd/files/0002-Makefile-modify-compile-parameters.patch
> create mode 100644 meta-oe/recipes-extended/rarpd/files/0003-rarpd.c-bug-fix.patch
> create mode 100644 meta-oe/recipes-extended/rarpd/files/0004-rarpd.init-add-new-init-file.patch
> create mode 100644 meta-oe/recipes-extended/rarpd/files/0005-ethernet.c-remove-it.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
Use files -> rarpd for slightly faster lookup.
>
> diff --git a/meta-oe/recipes-extended/rarpd/files/0001-rarpd.8-add-man-file.patch b/meta-oe/recipes-extended/rarpd/files/0001-rarpd.8-add-man-file.patch
> new file mode 100644
> index 0000000..77c75b4
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/0001-rarpd.8-add-man-file.patch
> @@ -0,0 +1,89 @@
> +From d91161eb163c16408202a91b4325a3381ab33752 Mon Sep 17 00:00:00 2001
> +From: Li xin <lixin.fnst at cn.fujitsu.com>
> +Date: Tue, 18 Nov 2014 17:55:31 +0900
> +Subject: [PATCH 1/5] rarpd.8 : add man file
> +
> +Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
> +---
> + rarpd.8 | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> + 1 file changed, 69 insertions(+)
> + create mode 100644 rarpd.8
> +
> +diff --git a/rarpd.8 b/rarpd.8
> +new file mode 100644
> +index 0000000..ce7bd70
> +--- /dev/null
> ++++ b/rarpd.8
> +@@ -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>
> +--
> +1.8.4.2
> +
> diff --git a/meta-oe/recipes-extended/rarpd/files/0002-Makefile-modify-compile-parameters.patch b/meta-oe/recipes-extended/rarpd/files/0002-Makefile-modify-compile-parameters.patch
> new file mode 100644
> index 0000000..0b3ebc4
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/0002-Makefile-modify-compile-parameters.patch
> @@ -0,0 +1,26 @@
> +From d23b13bd959204824070433d954c5dfbfc421bb7 Mon Sep 17 00:00:00 2001
> +From: Li xin <lixin.fnst at cn.fujitsu.com>
> +Date: Tue, 18 Nov 2014 18:05:27 +0900
> +Subject: [PATCH 2/5] Makefile : modify compile parameters
> +
> +Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
> +---
> + Makefile | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/Makefile b/Makefile
> +index 19966b4..86a8169 100644
> +--- a/Makefile
> ++++ b/Makefile
> +@@ -1,7 +1,7 @@
> + CC=gcc
> + CFLAGS=-O2 -Wall -g $(DEFINES)
> +
> +-OBJ=rarpd.o ethernet.o
> ++OBJ=rarpd.o
> +
> + all: rarpd
> +
> +--
> +1.8.4.2
> +
> diff --git a/meta-oe/recipes-extended/rarpd/files/0003-rarpd.c-bug-fix.patch b/meta-oe/recipes-extended/rarpd/files/0003-rarpd.c-bug-fix.patch
> new file mode 100644
> index 0000000..7ce1279
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/0003-rarpd.c-bug-fix.patch
> @@ -0,0 +1,263 @@
> +From b49c8e6e66801406520d1bff791c66dff7b1cddb Mon Sep 17 00:00:00 2001
> +From: Li xin <lixin.fnst at cn.fujitsu.com>
> +Date: Tue, 18 Nov 2014 18:10:20 +0900
> +Subject: [PATCH 3/5] rarpd.c : bug fix
> +
> +Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
> +---
> + rarpd.c | 98 +++++++++++++++++++++++++++++++++++++----------------------------
> + 1 file changed, 56 insertions(+), 42 deletions(-)
> +
> +diff --git a/rarpd.c b/rarpd.c
> +index 335d2d2..d45300e 100644
> +--- a/rarpd.c
> ++++ b/rarpd.c
> +@@ -7,9 +7,11 @@
> + * 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>
> ++#include <stdlib.h>
> + #include <syslog.h>
> + #include <dirent.h>
> + #include <malloc.h>
> +@@ -26,6 +28,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 +43,26 @@ int only_ethers;
> + 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 +90,8 @@ void load_if()
> + {
> + 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 +147,7 @@ void load_if()
> + continue;
> + }
> +
> +- ifl = (struct iflink*)malloc(sizeof(*ifl));
> ++ ifl = (struct rarpiflink*)malloc(sizeof(*ifl));
> + if (ifl == NULL)
> + continue;
> + memset(ifl, 0, sizeof(*ifl));
> +@@ -154,6 +157,7 @@ void load_if()
> + 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 +183,7 @@ void load_if()
> + 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;
> +@@ -207,6 +211,7 @@ void load_if()
> + }
> + }
> + }
> ++ close(fd);
> + }
> +
> + void configure()
> +@@ -225,20 +230,21 @@ int bootable(__u32 addr)
> + 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;
> + }
> +
> +-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 +300,7 @@ struct rarp_map *rarp_lookup(int ifindex, int hatype,
> +
> + 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 +310,7 @@ struct rarp_map *rarp_lookup(int ifindex, int hatype,
> + 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 +351,7 @@ static int load_arp_bpflet(int fd)
> +
> + 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 +368,8 @@ int put_mylladdr(unsigned char **ptr_p, int ifindex, int alen)
> + 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 +394,7 @@ void arp_advise(int ifindex, unsigned char *lladdr, int lllen, __u32 ipaddr)
> + 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 +427,10 @@ void serve_it(int fd)
> + 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,21 +457,23 @@ void serve_it(int fd)
> + 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;
> ++ 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;
> ++ 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 */
> +
> + /* 1. IP only -> pln==4 */
> +@@ -526,6 +538,8 @@ void serve_it(int fd)
> + 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 @@ int main(int argc, char **argv)
> + 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();
> +--
> +1.8.4.2
> +
> diff --git a/meta-oe/recipes-extended/rarpd/files/0004-rarpd.init-add-new-init-file.patch b/meta-oe/recipes-extended/rarpd/files/0004-rarpd.init-add-new-init-file.patch
> new file mode 100644
> index 0000000..3ba11ff
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/0004-rarpd.init-add-new-init-file.patch
> @@ -0,0 +1,116 @@
> +From 0ef1a95b220c7e110da950e5cc544c50c25b1bc6 Mon Sep 17 00:00:00 2001
> +From: Li xin <lixin.fnst at cn.fujitsu.com>
> +Date: Tue, 18 Nov 2014 18:11:56 +0900
> +Subject: [PATCH 4/5] rarpd.init : add new init file
> +
> +Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
> +---
> + rarpd.init | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> + 1 file changed, 96 insertions(+)
> + create mode 100644 rarpd.init
> +
> +diff --git a/rarpd.init b/rarpd.init
> +new file mode 100644
> +index 0000000..efcf825
> +--- /dev/null
> ++++ b/rarpd.init
> +@@ -0,0 +1,96 @@
> ++#!/bin/bash
> ++#
> ++# /etc/init.d/rarpd
> ++#
> ++# Starts the rarpd daemon
> ++#
> ++# chkconfig: - 82 16
> ++# 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
> ++
> ++# Read the config file if exists
> ++if [ -f /etc/sysconfig/rarpd ]; then
> ++ . /etc/sysconfig/rarpd
> ++fi
> ++
> ++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
> ++ status rarpd;
> ++ if [ $? -ne 0 ]; then
> ++ echo -n $"Starting $prog: "
> ++ daemon /usr/sbin/rarpd $OPTIONS $INTERFACE
> ++ RETVAL=$?
> ++ [ $RETVAL -eq 0 ] && touch /var/lock/subsys/rarpd
> ++ echo
> ++ fi
> ++ return $RETVAL
> ++}
> ++
> ++stop() {
> ++ echo -n $"Stopping $prog: "
> ++ killproc /usr/sbin/rarpd
> ++ RETVAL=$?
> ++ [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/rarpd
> ++ echo
> ++ return $RETVAL
> ++}
> ++reload() {
> ++ RETVAL=3
> ++}
> ++
> ++#
> ++# See how we were called.
> ++#
> ++case "$1" in
> ++ start)
> ++ start
> ++ ;;
> ++ stop)
> ++ stop
> ++ ;;
> ++ reload)
> ++ reload
> ++ ;;
> ++ force-reload|restart)
> ++ stop
> ++ start
> ++ ;;
> ++ condrestart)
> ++ if [ -f /var/lock/subsys/rarpd ]; then
> ++ stop
> ++ start
> ++ fi
> ++ ;;
> ++ status)
> ++ status rarpd
> ++ RETVAL=$?
> ++ ;;
> ++ *)
> ++ echo $"Usage: $0 {start|stop|restart|condrestart|reload|status|force-reload}"
> ++ RETVAL=2
> ++
> ++esac
> ++
> ++exit $RETVAL
> +--
> +1.8.4.2
> +
> diff --git a/meta-oe/recipes-extended/rarpd/files/0005-ethernet.c-remove-it.patch b/meta-oe/recipes-extended/rarpd/files/0005-ethernet.c-remove-it.patch
> new file mode 100644
> index 0000000..c77c806
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/files/0005-ethernet.c-remove-it.patch
> @@ -0,0 +1,244 @@
> +From abe15ba10ddc3548c528ccb088097d7abf5be48b Mon Sep 17 00:00:00 2001
> +From: Li xin <lixin.fnst at cn.fujitsu.com>
> +Date: Tue, 18 Nov 2014 18:14:07 +0900
> +Subject: [PATCH 5/5] ethernet.c : remove it
> +
> +Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
> +---
> + ethernet.c | 224 -------------------------------------------------------------
> + 1 file changed, 224 deletions(-)
> + delete mode 100644 ethernet.c
> +
> +diff --git a/ethernet.c b/ethernet.c
> +deleted file mode 100644
> +index d682b63..0000000
> +--- a/ethernet.c
> ++++ /dev/null
> +@@ -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);
> +-}
> +--
> +1.8.4.2
> +
> 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..b9b4bd7
> --- /dev/null
> +++ b/meta-oe/recipes-extended/rarpd/rarpd_ss981107.bb
> @@ -0,0 +1,48 @@
> +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://0001-rarpd.8-add-man-file.patch \
> + file://0002-Makefile-modify-compile-parameters.patch \
> + file://0003-rarpd.c-bug-fix.patch \
> + file://0004-rarpd.init-add-new-init-file.patch \
> + file://0005-ethernet.c-remove-it.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
> +}
Incorrect indentation again (I've fixed it when cherry-picking)
> +
> +inherit ${@base_contains('VIRTUAL-RUNTIME_init_manager','systemd','systemd','',d)}
> +
> +SYSTEMD_PACKAGES = "${PN}"
> +SYSTEMD_SERVICE_${PN} = "rarpd.service"
> +SYSTEMD_AUTO_ENABLE = "disable"
> --
> 1.8.4.2
>
> --
> _______________________________________________
> Openembedded-devel mailing list
> Openembedded-devel at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
--
Martin 'JaMa' Jansa jabber: Martin.Jansa at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://lists.openembedded.org/pipermail/openembedded-devel/attachments/20141119/776ec13b/attachment-0002.sig>
More information about the Openembedded-devel
mailing list