Date: Wed, 26 Jun 2013 20:22:37 +0000 (UTC) From: Mark Felder <feld@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r321813 - in head/net/rwhoisd: . files Message-ID: <201306262022.r5QKMb6D052587@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: feld Date: Wed Jun 26 20:22:37 2013 New Revision: 321813 URL: http://svnweb.freebsd.org/changeset/ports/321813 Log: - Fix sample install/uninstall - Fix IPv6 case - Clean up rc script PR: ports/179964 Approved by: crees (mentor) Added: head/net/rwhoisd/files/patch-server-daemon.c (contents, props changed) head/net/rwhoisd/files/patch-server-security.c (contents, props changed) Modified: head/net/rwhoisd/Makefile head/net/rwhoisd/files/rwhoisd.in head/net/rwhoisd/pkg-plist Modified: head/net/rwhoisd/Makefile ============================================================================== --- head/net/rwhoisd/Makefile Wed Jun 26 20:16:55 2013 (r321812) +++ head/net/rwhoisd/Makefile Wed Jun 26 20:22:37 2013 (r321813) @@ -3,7 +3,7 @@ PORTNAME= rwhoisd PORTVERSION= 1.5.9.6 -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= net ipv6 MASTER_SITES= http://projects.arin.net/rwhois/ftp/ \ http://www.rwhois.net/ftp/ \ @@ -34,6 +34,10 @@ MAN8= rwhois_indexer.8 rwhoisd.8 PORTDOCS= INSTALL.html TODO UPGRADE operations_guide.html \ operations_guide.txt rfc2167.txt security.html security.txt +ETCFILES= rwhoisd.allow rwhoisd.auth_area rwhoisd.conf rwhoisd.deny \ + rwhoisd.dir rwhoisd.root rwhoisd.x.dir +PLIST_SUB+= ETCFILES="${ETCFILES}" + .include <bsd.port.options.mk> .if empty(PORT_OPTIONS:MIPV6) @@ -45,8 +49,6 @@ CONFIGURE_ARGS+= --enable-largefile .endif post-patch: - @${REINPLACE_CMD} -e 's,rwhoisd/samples,rwhoisd,' \ - ${WRKSRC}/sample.data/Makefile.in @${REINPLACE_CMD} -e 's,userid: rwhoisd,userid: nobody,' \ -e 's,pid-file: rwhoisd.pid,pid-file: /var/run/rwhoisd/rwhoisd.pid,' \ ${WRKSRC}/sample.data/rwhoisd.conf @@ -54,8 +56,6 @@ post-patch: ${WRKSRC}/common/conf.h post-install: - @${MKDIR} /var/log/rwhoisd /var/run/rwhoisd - @${CHOWN} -R nobody /var/log/rwhoisd /var/run/rwhoisd ${INSTALL_MAN} ${WRKSRC}/doc/rwhois_indexer.8 ${PREFIX}/man/man8 ${INSTALL_MAN} ${WRKSRC}/doc/rwhoisd.8 ${PREFIX}/man/man8 .if ${PORT_OPTIONS:MDOCS} Added: head/net/rwhoisd/files/patch-server-daemon.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/net/rwhoisd/files/patch-server-daemon.c Wed Jun 26 20:22:37 2013 (r321813) @@ -0,0 +1,190 @@ +--- server/daemon.c.orig 2005-06-01 09:20:55.000000000 +0900 ++++ server/daemon.c 2013-06-26 14:51:58.000000000 +0900 +@@ -17,6 +17,8 @@ + #include "session.h" + #include "sslave.h" + ++#include <sys/select.h> ++ + /* -------------------- Local Vars ---------------------- */ + + static int hup_recvd = FALSE; +@@ -173,17 +175,16 @@ + signal(SIGCHLD, sigchld_handler); + } + ++#define MAXSOCK 16 ++ + int + run_daemon() + { +-#ifdef HAVE_IPV6 + struct sockaddr_storage client_addr; +- struct sockaddr_in6 server_addr; +-#else +- struct sockaddr_in client_addr; +- struct sockaddr_in server_addr; +-#endif +- int sockfd; ++ struct addrinfo hints, *res, *res0; ++ fd_set fds, fds0; ++ int sockfd[MAXSOCK], nsock, maxsock, i; ++ char servname[NI_MAXSERV]; + int newsockfd; + int clilen; + int childpid; +@@ -191,25 +192,39 @@ + int port = get_port(); + int failure = 0; + ++ memset(&hints, 0, sizeof(hints)); ++ hints.ai_family = PF_UNSPEC; ++ hints.ai_socktype = SOCK_STREAM; ++ hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV; ++ snprintf(servname, sizeof(servname), "%d", port); ++ servname[sizeof(servname) - 1] = '\0'; ++ failure = getaddrinfo(NULL, servname, &hints, &res0); ++ ++ if (failure) { ++ log(L_LOG_ERR, CONFIG, "run_daemon: getaddrinfo()."); ++ exit(1); ++ } ++ FD_ZERO(&fds0); ++ maxsock = nsock = 0; ++ for (res = res0; res && nsock < MAXSOCK; res = res->ai_next) { ++ if (res->ai_family != AF_INET + #ifdef HAVE_IPV6 +- /* This will accept both IPv4 and IPv6 connections on any interface +- including the loopback so that a local client can send to us. */ +- if ( ( sockfd = socket( AF_INET6, SOCK_STREAM, IPPROTO_TCP ) ) < 0 ) +-#else +- if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) ++ && res->ai_family != AF_INET6 + #endif +- { +- log(L_LOG_ERR, CONFIG, "run_daemon: Can not open socket: %s", ++ ) ++ continue; ++ sockfd[nsock] = socket(res->ai_family, res->ai_socktype, res->ai_protocol); ++ if (sockfd[nsock] < 0) { ++ log(L_LOG_ERR, CONFIG, "run_daemon: Can not open socket: %s", + strerror(errno)); +- exit (1); +- } +- +- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)) ++ continue; ++ } ++ if (setsockopt(sockfd[nsock], SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)) + < 0) + { + log(L_LOG_ERR, CONFIG, + "run_daemon: Can not set socket options SO_REUSEADDR"); +- exit(1); ++ continue; + } + + #ifdef NEED_LINGER +@@ -222,28 +237,31 @@ + sizeof(struct linger)); + } + #endif /* NEED_LINGER */ +- +- /* for now, we will bind to all IP interfaces (INADDR_ANY) */ +- /* Bind our local address so that the client can send to us */ +- bzero((char *)&server_addr, sizeof(server_addr)); +-#ifdef HAVE_IPV6 +- server_addr.sin6_family = AF_INET6; +- server_addr.sin6_port = htons(port); +- server_addr.sin6_addr = in6addr_any; +-#else +- server_addr.sin_family = AF_INET; +- server_addr.sin_port = htons(port); +- server_addr.sin_addr.s_addr = htonl(INADDR_ANY); +-#endif +- +- if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) +- { +- log(L_LOG_ERR, CONFIG, "run_daemon: Can not bind socket: %s", +- strerror(errno)); +- exit(1); ++ if (bind(sockfd[nsock], res->ai_addr, res->ai_addrlen) < 0) { ++ log(L_LOG_ERR, CONFIG, "run_daemon: Can not bind socket: %s", ++ strerror(errno)); ++ close(sockfd[nsock]); ++ sockfd[nsock] = -1; ++ continue; ++ } ++ if (listen(sockfd[nsock], get_listen_queue_length()) == -1) { ++ log(L_LOG_ERR, CONFIG, "run_daemon: listen: %s", ++ strerror(errno)); ++ close(sockfd[nsock]); ++ sockfd[nsock] = -1; ++ continue; ++ } ++ FD_SET(sockfd[nsock], &fds0); ++ if (maxsock < sockfd[nsock]) ++ maxsock = sockfd[nsock]; ++ nsock++; + } ++ freeaddrinfo(res0); + +- listen(sockfd, get_listen_queue_length()); ++ if (nsock == 0) { ++ log(L_LOG_ERR, CONFIG, "run_daemon: Can not open socket"); ++ exit (1); ++ } + + no_zombies(); + +@@ -274,16 +292,32 @@ + hup_recvd = FALSE; + } + ++ newsockfd = -1; ++ memcpy(&fds, &fds0, sizeof(fds)); + clilen = sizeof(client_addr); +- newsockfd = accept(sockfd, (struct sockaddr *) &client_addr, &clilen); +- if (newsockfd < 0) +- { +- if (errno == EINTR) +- { ++ if (select(maxsock + 1, &fds, NULL, NULL, NULL) > 0) { ++ for (i = 0; i < nsock; i++) { ++ if (FD_ISSET(sockfd[i], &fds)) { ++ newsockfd = accept(sockfd[i], (struct sockaddr *) &client_addr, ++ &clilen); ++ if (newsockfd < 0) { ++ if (errno != EINTR) ++ fprintf(stderr, "run_daemon: accept error: %s\n", strerror(errno)); ++ continue; ++ } else ++ break; ++ } ++ } ++ if (newsockfd < 0) { ++ fprintf(stderr, "run_daemon: ignored\n"); ++ continue; ++ } ++ } else { ++ if (errno != EINTR) { ++ fprintf(stderr, "run_daemon: select error: %s\n", strerror(errno)); ++ exit(1); ++ } else + continue; +- } +- fprintf(stderr, "run_daemon: accept error: %s\n", strerror(errno)); +- continue; + } + + failure = 0; +@@ -312,7 +346,8 @@ + exit(1); + } + +- close(sockfd); ++ for (i = 0; i < nsock; i++) ++ close(sockfd[i]); + + if (!authorized_client()) + { Added: head/net/rwhoisd/files/patch-server-security.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/net/rwhoisd/files/patch-server-security.c Wed Jun 26 20:22:37 2013 (r321813) @@ -0,0 +1,83 @@ +--- server/security.c.orig 2005-06-01 09:20:55.000000000 +0900 ++++ server/security.c 2013-06-26 14:56:12.000000000 +0900 +@@ -110,18 +110,17 @@ + char *hosts_deny; + extern char *hosts_allow_table; + extern char *hosts_deny_table; +-# ifdef HAVE_IPV6 +- struct sockaddr_in *sin; + struct sockaddr_storage ss; +- struct sockaddr_in6 *sin6; + struct sockaddr *sa; + socklen_t salen = sizeof ss; ++#ifdef HAVE_IPV6 + char addr[INET6_ADDRSTRLEN]; + char wrapper_addr[INET6_ADDRSTRLEN + 2]; ++#else ++ char addr[INET_ADDRSTRLEN]; ++ char wrapper_addr[INET_ADDRSTRLEN + 2]; ++#endif + char client_name[NI_MAXHOST]; +-# else +- struct request_info req; +-# endif /* HAVE_IPV6 */ + + hosts_allow = get_security_allow(); + hosts_deny = get_security_deny(); +@@ -133,7 +132,6 @@ + hosts_allow_table = hosts_allow; + hosts_deny_table = hosts_deny; + +-# ifdef HAVE_IPV6 + /* Do this the new way, which specifically knows how to format IPv6 + addresses. */ + +@@ -153,42 +151,15 @@ + + /* convert the address to a presentation format that tcp wrapper + understands */ +- switch ( sa->sa_family ) { +- case AF_INET: { +- sin = (struct sockaddr_in *) sa; +- strncpy( wrapper_addr, +- inet_ntop( AF_INET, (void *) sin->sin_addr.s_addr, addr, +- sizeof addr ), +- sizeof wrapper_addr ) ; +- } +- case AF_INET6: { +- sin6 = (struct sockaddr_in6 *) sa; +- inet_ntop( AF_INET6, (void *) sin6->sin6_addr.s6_addr, addr, sizeof +- addr ); +- /* If it's an IPv4 mapped address, drop the leading '::ffff:' */ +- if ( IN6_IS_ADDR_V4MAPPED( &(sin6->sin6_addr) ) ) +- strncpy( wrapper_addr, addr + 7, sizeof wrapper_addr ); +- /* otherwise surround the address with braces to hopefully match +- what tcp wrapper expects */ +- else sprintf( wrapper_addr, "%s", addr ); +- } +- } ++ ++ if (getnameinfo(sa, salen, wrapper_addr, sizeof(wrapper_addr), NULL, 0, ++ NI_NUMERICHOST) != 0) ++ log(L_LOG_WARNING, CONFIG, "getnameinfo failed: %s", ++ strerror(errno)); ++ + log( L_LOG_WARNING, CONFIG, "client tcp wrapper address: %s", wrapper_addr ); + + return( hosts_ctl( directive, client_name, wrapper_addr, STRING_UNKNOWN ) ); +-# else /* HAVE_IPV6 */ +- +- /* Do this the old way, which still seems to work */ +- +- /* set up the request structure */ +- request_init(&req, RQ_FILE, 0, RQ_DAEMON, directive, 0); +- +- /* fill in the client info */ +- fromhost(&req); +- +- /* return the results of the access check */ +- return(hosts_access(&req)); +-# endif /* HAVE_IPV6 */ + + #else /* USE_TCP_WRAPPERS */ + return TRUE; Modified: head/net/rwhoisd/files/rwhoisd.in ============================================================================== --- head/net/rwhoisd/files/rwhoisd.in Wed Jun 26 20:16:55 2013 (r321812) +++ head/net/rwhoisd/files/rwhoisd.in Wed Jun 26 20:22:37 2013 (r321813) @@ -1,5 +1,7 @@ #!/bin/sh - +# +# $FreeBSD$ +# # PROVIDE: rwhoisd # REQUIRE: LOGIN # KEYWORD: shutdown @@ -15,18 +17,17 @@ . /etc/rc.subr -name="rwhoisd" +name=rwhoisd rcvar=rwhoisd_enable - -command=%%PREFIX%%/sbin/${name} -pidfile=${rwhoisd_pidfile} - load_rc_config $name -: ${rwhoisd_enable="NO"} +: ${rwhoisd_enable:=NO} : ${rwhoisd_config="%%PREFIX%%/etc/rwhoisd/rwhoisd.conf"} : ${rwhoisd_pidfile="/var/run/${name}/${name}.pid"} +command=%%PREFIX%%/sbin/${name} +pidfile=${rwhoisd_pidfile} + command_args="-d -c $rwhoisd_config" run_rc_command "$1" Modified: head/net/rwhoisd/pkg-plist ============================================================================== --- head/net/rwhoisd/pkg-plist Wed Jun 26 20:16:55 2013 (r321812) +++ head/net/rwhoisd/pkg-plist Wed Jun 26 20:22:37 2013 (r321813) @@ -2,66 +2,69 @@ bin/rwhois_deleter bin/rwhois_indexer bin/rwhois_repack sbin/rwhoisd -etc/rwhoisd/a.com/attribute_defs/asn.tmpl -etc/rwhoisd/a.com/attribute_defs/contact.tmpl -etc/rwhoisd/a.com/attribute_defs/domain.tmpl -etc/rwhoisd/a.com/attribute_defs/guardian.tmpl -etc/rwhoisd/a.com/attribute_defs/host.tmpl -etc/rwhoisd/a.com/attribute_defs/org.tmpl -etc/rwhoisd/a.com/attribute_defs/referral.tmpl -etc/rwhoisd/a.com/data/asn/asn.txt -etc/rwhoisd/a.com/data/contact/contact.txt -etc/rwhoisd/a.com/data/domain/domain.txt -etc/rwhoisd/a.com/data/guardian/guardian.txt -etc/rwhoisd/a.com/data/host/host.txt -etc/rwhoisd/a.com/data/org/org.txt -etc/rwhoisd/a.com/data/referral/referral.txt -etc/rwhoisd/a.com/schema -etc/rwhoisd/a.com/soa -etc/rwhoisd/net-10.0.0.0-8/attribute_defs/contact.tmpl -etc/rwhoisd/net-10.0.0.0-8/attribute_defs/guardian.tmpl -etc/rwhoisd/net-10.0.0.0-8/attribute_defs/host.tmpl -etc/rwhoisd/net-10.0.0.0-8/attribute_defs/network.tmpl -etc/rwhoisd/net-10.0.0.0-8/attribute_defs/referral.tmpl -etc/rwhoisd/net-10.0.0.0-8/data/network/network.txt -etc/rwhoisd/net-10.0.0.0-8/data/referral/referral.txt -etc/rwhoisd/net-10.0.0.0-8/schema -etc/rwhoisd/net-10.0.0.0-8/soa -etc/rwhoisd/net-fd00:1234::-32/attribute_defs/host.tmpl -etc/rwhoisd/net-fd00:1234::-32/attribute_defs/referral.tmpl -etc/rwhoisd/net-fd00:1234::-32/attribute_defs/contact.tmpl -etc/rwhoisd/net-fd00:1234::-32/attribute_defs/guardian.tmpl -etc/rwhoisd/net-fd00:1234::-32/attribute_defs/network.tmpl -etc/rwhoisd/net-fd00:1234::-32/data/referral/referral.txt -etc/rwhoisd/net-fd00:1234::-32/data/network/network.txt -etc/rwhoisd/net-fd00:1234::-32/soa -etc/rwhoisd/net-fd00:1234::-32/schema -etc/rwhoisd/rwhoisd.allow -etc/rwhoisd/rwhoisd.auth_area -etc/rwhoisd/rwhoisd.conf -etc/rwhoisd/rwhoisd.deny -etc/rwhoisd/rwhoisd.dir -etc/rwhoisd/rwhoisd.root -etc/rwhoisd/rwhoisd.x.dir -@dirrm etc/rwhoisd/net-10.0.0.0-8/data/referral -@dirrm etc/rwhoisd/net-10.0.0.0-8/data/network -@dirrm etc/rwhoisd/net-10.0.0.0-8/data -@dirrm etc/rwhoisd/net-10.0.0.0-8/attribute_defs -@dirrm etc/rwhoisd/net-10.0.0.0-8 -@dirrm etc/rwhoisd/net-fd00:1234::-32/attribute_defs -@dirrm etc/rwhoisd/net-fd00:1234::-32/data/referral -@dirrm etc/rwhoisd/net-fd00:1234::-32/data/network -@dirrm etc/rwhoisd/net-fd00:1234::-32/data -@dirrm etc/rwhoisd/net-fd00:1234::-32 -@dirrm etc/rwhoisd/a.com/data/referral -@dirrm etc/rwhoisd/a.com/data/org -@dirrm etc/rwhoisd/a.com/data/host -@dirrm etc/rwhoisd/a.com/data/guardian -@dirrm etc/rwhoisd/a.com/data/domain -@dirrm etc/rwhoisd/a.com/data/contact -@dirrm etc/rwhoisd/a.com/data/asn -@dirrm etc/rwhoisd/a.com/data -@dirrm etc/rwhoisd/a.com/attribute_defs -@dirrm etc/rwhoisd/a.com -@dirrmtry etc/rwhoisd -@exec mkdir -p /var/log/rwhoisd /var/run/rwhoisd; chown -R nobody /var/log/rwhoisd /var/run/rwhoisd +%%ETCDIR%%/samples/a.com/attribute_defs/asn.tmpl +%%ETCDIR%%/samples/a.com/attribute_defs/contact.tmpl +%%ETCDIR%%/samples/a.com/attribute_defs/domain.tmpl +%%ETCDIR%%/samples/a.com/attribute_defs/guardian.tmpl +%%ETCDIR%%/samples/a.com/attribute_defs/host.tmpl +%%ETCDIR%%/samples/a.com/attribute_defs/org.tmpl +%%ETCDIR%%/samples/a.com/attribute_defs/referral.tmpl +%%ETCDIR%%/samples/a.com/data/asn/asn.txt +%%ETCDIR%%/samples/a.com/data/contact/contact.txt +%%ETCDIR%%/samples/a.com/data/domain/domain.txt +%%ETCDIR%%/samples/a.com/data/guardian/guardian.txt +%%ETCDIR%%/samples/a.com/data/host/host.txt +%%ETCDIR%%/samples/a.com/data/org/org.txt +%%ETCDIR%%/samples/a.com/data/referral/referral.txt +%%ETCDIR%%/samples/a.com/schema +%%ETCDIR%%/samples/a.com/soa +%%ETCDIR%%/samples/net-10.0.0.0-8/attribute_defs/contact.tmpl +%%ETCDIR%%/samples/net-10.0.0.0-8/attribute_defs/guardian.tmpl +%%ETCDIR%%/samples/net-10.0.0.0-8/attribute_defs/host.tmpl +%%ETCDIR%%/samples/net-10.0.0.0-8/attribute_defs/network.tmpl +%%ETCDIR%%/samples/net-10.0.0.0-8/attribute_defs/referral.tmpl +%%ETCDIR%%/samples/net-10.0.0.0-8/data/network/network.txt +%%ETCDIR%%/samples/net-10.0.0.0-8/data/referral/referral.txt +%%ETCDIR%%/samples/net-10.0.0.0-8/schema +%%ETCDIR%%/samples/net-10.0.0.0-8/soa +%%ETCDIR%%/samples/net-fd00:1234::-32/attribute_defs/host.tmpl +%%ETCDIR%%/samples/net-fd00:1234::-32/attribute_defs/referral.tmpl +%%ETCDIR%%/samples/net-fd00:1234::-32/attribute_defs/contact.tmpl +%%ETCDIR%%/samples/net-fd00:1234::-32/attribute_defs/guardian.tmpl +%%ETCDIR%%/samples/net-fd00:1234::-32/attribute_defs/network.tmpl +%%ETCDIR%%/samples/net-fd00:1234::-32/data/referral/referral.txt +%%ETCDIR%%/samples/net-fd00:1234::-32/data/network/network.txt +%%ETCDIR%%/samples/net-fd00:1234::-32/soa +%%ETCDIR%%/samples/net-fd00:1234::-32/schema +%%ETCDIR%%/samples/rwhoisd.allow +%%ETCDIR%%/samples/rwhoisd.auth_area +%%ETCDIR%%/samples/rwhoisd.conf +%%ETCDIR%%/samples/rwhoisd.deny +%%ETCDIR%%/samples/rwhoisd.dir +%%ETCDIR%%/samples/rwhoisd.root +%%ETCDIR%%/samples/rwhoisd.x.dir +@dirrm %%ETCDIR%%/samples/net-10.0.0.0-8/data/referral +@dirrm %%ETCDIR%%/samples/net-10.0.0.0-8/data/network +@dirrm %%ETCDIR%%/samples/net-10.0.0.0-8/data +@dirrm %%ETCDIR%%/samples/net-10.0.0.0-8/attribute_defs +@dirrm %%ETCDIR%%/samples/net-10.0.0.0-8 +@dirrm %%ETCDIR%%/samples/net-fd00:1234::-32/attribute_defs +@dirrm %%ETCDIR%%/samples/net-fd00:1234::-32/data/referral +@dirrm %%ETCDIR%%/samples/net-fd00:1234::-32/data/network +@dirrm %%ETCDIR%%/samples/net-fd00:1234::-32/data +@dirrm %%ETCDIR%%/samples/net-fd00:1234::-32 +@dirrm %%ETCDIR%%/samples/a.com/data/referral +@dirrm %%ETCDIR%%/samples/a.com/data/org +@dirrm %%ETCDIR%%/samples/a.com/data/host +@dirrm %%ETCDIR%%/samples/a.com/data/guardian +@dirrm %%ETCDIR%%/samples/a.com/data/domain +@dirrm %%ETCDIR%%/samples/a.com/data/contact +@dirrm %%ETCDIR%%/samples/a.com/data/asn +@dirrm %%ETCDIR%%/samples/a.com/data +@dirrm %%ETCDIR%%/samples/a.com/attribute_defs +@dirrm %%ETCDIR%%/samples/a.com +@dirrm %%ETCDIR%%/samples +@dirrmtry %%ETCDIR%% +@exec install -d -o nobody /var/log/rwhoisd /var/run/rwhoisd +@exec for f in %%ETCFILES%%; do [ -f %D/%%ETCDIR%%/$f ] || cp -p %D/%%ETCDIR%%/samples/$f %D/%%ETCDIR%%/$f; done +@unexec for f in %%ETCFILES%%; do cmp -s %D/%%ETCDIR%%/$f %D/%%ETCDIR%%/samples/$f && rm -f %D/%%ETCDIR%%/$f || true; done
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306262022.r5QKMb6D052587>