Wed May 25 09:33:37 2022 UTC ()
lsof: support kmem grovelling of current-era NetBSD rbtree kernel namecache
(tnn)
diff -r1.140 -r1.141 pkgsrc/sysutils/lsof/Makefile
diff -r1.101 -r1.102 pkgsrc/sysutils/lsof/distinfo
diff -r0 -r1.1 pkgsrc/sysutils/lsof/files/rnmt.c
diff -r1.28 -r1.29 pkgsrc/sysutils/lsof/patches/patch-aa
diff -r1.29 -r1.30 pkgsrc/sysutils/lsof/patches/patch-ac
diff -r0 -r1.1 pkgsrc/sysutils/lsof/patches/patch-lib_Makefile.skel
--- pkgsrc/sysutils/lsof/Makefile 2021/11/11 00:49:34 1.140
+++ pkgsrc/sysutils/lsof/Makefile 2022/05/25 09:33:37 1.141
| @@ -1,18 +1,18 @@ | | | @@ -1,18 +1,18 @@ |
1 | # $NetBSD: Makefile,v 1.140 2021/11/11 00:49:34 gutteridge Exp $ | | 1 | # $NetBSD: Makefile,v 1.141 2022/05/25 09:33:37 tnn Exp $ |
2 | | | 2 | |
3 | DISTNAME= lsof_4.91 | | 3 | DISTNAME= lsof_4.91 |
4 | PKGNAME= ${DISTNAME:S/_/-/} | | 4 | PKGNAME= ${DISTNAME:S/_/-/} |
5 | PKGREVISION= 5 | | 5 | PKGREVISION= 6 |
6 | CATEGORIES= sysutils | | 6 | CATEGORIES= sysutils |
7 | MASTER_SITES= ftp://ftp.mirrorservice.org/sites/lsof.itap.purdue.edu/pub/tools/unix/lsof/ | | 7 | MASTER_SITES= ftp://ftp.mirrorservice.org/sites/lsof.itap.purdue.edu/pub/tools/unix/lsof/ |
8 | MASTER_SITES+= ftp://ftp.mirrorservice.org/sites/lsof.itap.purdue.edu/pub/tools/unix/lsof/OLD/ | | 8 | MASTER_SITES+= ftp://ftp.mirrorservice.org/sites/lsof.itap.purdue.edu/pub/tools/unix/lsof/OLD/ |
9 | MASTER_SITES+= ftp://ftp.fu-berlin.de/pub/unix/tools/lsof/ | | 9 | MASTER_SITES+= ftp://ftp.fu-berlin.de/pub/unix/tools/lsof/ |
10 | MASTER_SITES+= ftp://ftp.fu-berlin.de/pub/unix/tools/lsof/OLD/ | | 10 | MASTER_SITES+= ftp://ftp.fu-berlin.de/pub/unix/tools/lsof/OLD/ |
11 | EXTRACT_SUFX= .tar.bz2 | | 11 | EXTRACT_SUFX= .tar.bz2 |
12 | | | 12 | |
13 | MAINTAINER= pkgsrc-users@NetBSD.org | | 13 | MAINTAINER= pkgsrc-users@NetBSD.org |
14 | HOMEPAGE= https://people.freebsd.org/~abe/ | | 14 | HOMEPAGE= https://people.freebsd.org/~abe/ |
15 | COMMENT= Lists information about open files | | 15 | COMMENT= Lists information about open files |
16 | LICENSE= purdue | | 16 | LICENSE= purdue |
17 | | | 17 | |
18 | WRKSRC= ${WRKDIR}/${DISTNAME}/${SRCBALL_NAME} | | 18 | WRKSRC= ${WRKDIR}/${DISTNAME}/${SRCBALL_NAME} |
| @@ -64,26 +64,27 @@ post-extract: | | | @@ -64,26 +64,27 @@ post-extract: |
64 | exit 1 ; \ | | 64 | exit 1 ; \ |
65 | fi | | 65 | fi |
66 | .endif | | 66 | .endif |
67 | cd ${TMPWRK} ; \ | | 67 | cd ${TMPWRK} ; \ |
68 | EXPMD5=`${GREP} 'MD5 (' README.${DISTNAME} | ${SED} 's/^[ ]*//'` ; \ | | 68 | EXPMD5=`${GREP} 'MD5 (' README.${DISTNAME} | ${SED} 's/^[ ]*//'` ; \ |
69 | CALCMD5=`${DIGEST} MD5 ${SRCBALL_NAME}.tar` ; \ | | 69 | CALCMD5=`${DIGEST} MD5 ${SRCBALL_NAME}.tar` ; \ |
70 | if [ "$${EXPMD5}"X != "$${CALCMD5}"X ]; then \ | | 70 | if [ "$${EXPMD5}"X != "$${CALCMD5}"X ]; then \ |
71 | ${ECHO} "Expected and calculated MD5 signatures don't agree." ; \ | | 71 | ${ECHO} "Expected and calculated MD5 signatures don't agree." ; \ |
72 | ${ECHO} "($$EXPMD5 != $$CALCMD5)" ; \ | | 72 | ${ECHO} "($$EXPMD5 != $$CALCMD5)" ; \ |
73 | exit 1 ; \ | | 73 | exit 1 ; \ |
74 | fi ; \ | | 74 | fi ; \ |
75 | ${TOOLS_PATH.bsdtar} -xf ${SRCBALL_NAME}.tar | | 75 | ${TOOLS_PATH.bsdtar} -xf ${SRCBALL_NAME}.tar |
76 | cd ${WRKSRC} ; ${ECHO} "y" | ./Inventory || exit 1 | | 76 | cd ${WRKSRC} ; ${ECHO} "y" | ./Inventory || exit 1 |
| | | 77 | ${CP} ${FILESDIR}/rnmt.c ${WRKSRC}/lib/rnmt.c |
77 | | | 78 | |
78 | SPECIAL_PERMS+= ${PREFIX}/sbin/lsof ${REAL_ROOT_USER} ${REAL_GROUP} 2755 | | 79 | SPECIAL_PERMS+= ${PREFIX}/sbin/lsof ${REAL_ROOT_USER} ${REAL_GROUP} 2755 |
79 | | | 80 | |
80 | do-install: | | 81 | do-install: |
81 | ${INSTALL_PROGRAM} ${WRKSRC}/lsof ${DESTDIR}${PREFIX}/sbin | | 82 | ${INSTALL_PROGRAM} ${WRKSRC}/lsof ${DESTDIR}${PREFIX}/sbin |
82 | ${INSTALL_MAN} ${WRKSRC}/lsof.8 \ | | 83 | ${INSTALL_MAN} ${WRKSRC}/lsof.8 \ |
83 | ${DESTDIR}${PREFIX}/${PKGMANDIR}/man8/lsof.8 | | 84 | ${DESTDIR}${PREFIX}/${PKGMANDIR}/man8/lsof.8 |
84 | ${INSTALL_DATA} ${WRKSRC}/00* ${DESTDIR}${PREFIX}/share/doc/lsof | | 85 | ${INSTALL_DATA} ${WRKSRC}/00* ${DESTDIR}${PREFIX}/share/doc/lsof |
85 | ${INSTALL_DATA} ${WRKSRC}/ChangeLog ${DESTDIR}${PREFIX}/share/doc/lsof | | 86 | ${INSTALL_DATA} ${WRKSRC}/ChangeLog ${DESTDIR}${PREFIX}/share/doc/lsof |
86 | ${INSTALL_SCRIPT} ${WRKSRC}/scripts/*.perl* \ | | 87 | ${INSTALL_SCRIPT} ${WRKSRC}/scripts/*.perl* \ |
87 | ${DESTDIR}${PREFIX}/share/examples/lsof | | 88 | ${DESTDIR}${PREFIX}/share/examples/lsof |
88 | ${INSTALL_SCRIPT} ${WRKSRC}/scripts/xusers.awk \ | | 89 | ${INSTALL_SCRIPT} ${WRKSRC}/scripts/xusers.awk \ |
89 | ${DESTDIR}${PREFIX}/share/examples/lsof | | 90 | ${DESTDIR}${PREFIX}/share/examples/lsof |
--- pkgsrc/sysutils/lsof/distinfo 2022/02/27 02:13:44 1.101
+++ pkgsrc/sysutils/lsof/distinfo 2022/05/25 09:33:37 1.102
| @@ -1,14 +1,15 @@ | | | @@ -1,14 +1,15 @@ |
1 | $NetBSD: distinfo,v 1.101 2022/02/27 02:13:44 gutteridge Exp $ | | 1 | $NetBSD: distinfo,v 1.102 2022/05/25 09:33:37 tnn Exp $ |
2 | | | 2 | |
3 | BLAKE2s (lsof_4.91.tar.bz2) = 77109e036c36f7d1483e69f2aae2314830dc4d2bdc3bf88a4031832f17e6afef | | 3 | BLAKE2s (lsof_4.91.tar.bz2) = 77109e036c36f7d1483e69f2aae2314830dc4d2bdc3bf88a4031832f17e6afef |
4 | SHA512 (lsof_4.91.tar.bz2) = 49f811941dd6303f7cb0655fddb8b1177af5d1b18f2bd1edfab09d2c128aea73daecf09c7a5375979c66ba764c88a6e70c9086b55c3634e3be01ab1aa12e9f92 | | 4 | SHA512 (lsof_4.91.tar.bz2) = 49f811941dd6303f7cb0655fddb8b1177af5d1b18f2bd1edfab09d2c128aea73daecf09c7a5375979c66ba764c88a6e70c9086b55c3634e3be01ab1aa12e9f92 |
5 | Size (lsof_4.91.tar.bz2) = 791734 bytes | | 5 | Size (lsof_4.91.tar.bz2) = 791734 bytes |
6 | SHA1 (patch-aa) = 4469a5fed540e3c5635b6082efedc477ea96a382 | | 6 | SHA1 (patch-aa) = 76523a6d3bdff93a835dc442114f2bd4a018f95e |
7 | SHA1 (patch-ab) = 1501d8b0e6fd2c61949ba0d447c7b726655725c4 | | 7 | SHA1 (patch-ab) = 1501d8b0e6fd2c61949ba0d447c7b726655725c4 |
8 | SHA1 (patch-ac) = dac0fcdfee97d42c8f23684a4321519b9f8698d9 | | 8 | SHA1 (patch-ac) = ab1dc4540452f413493c58b729c7c6de83abfb6a |
9 | SHA1 (patch-ad) = 7f639e8832c2da8e498c33a38ecbc7b3d3a7430a | | 9 | SHA1 (patch-ad) = 7f639e8832c2da8e498c33a38ecbc7b3d3a7430a |
10 | SHA1 (patch-ae) = 3f4a7ce54c0646941fd86400f91a2d17e9d2354a | | 10 | SHA1 (patch-ae) = 3f4a7ce54c0646941fd86400f91a2d17e9d2354a |
11 | SHA1 (patch-af) = 88b3d2b42c05e20c189fa00fd65f1f412fe54038 | | 11 | SHA1 (patch-af) = 88b3d2b42c05e20c189fa00fd65f1f412fe54038 |
12 | SHA1 (patch-ag) = 99ab1c616604e9775522dbc70bfd6a7294964d0a | | 12 | SHA1 (patch-ag) = 99ab1c616604e9775522dbc70bfd6a7294964d0a |
13 | SHA1 (patch-ah) = 2de22b9a3733f958298af5e33b66c0653c320f59 | | 13 | SHA1 (patch-ah) = 2de22b9a3733f958298af5e33b66c0653c320f59 |
14 | SHA1 (patch-dialects_n+obsd_dnode1.c) = dc8c766760aca4eb2e7d7af3944260dd49795c09 | | 14 | SHA1 (patch-dialects_n+obsd_dnode1.c) = dc8c766760aca4eb2e7d7af3944260dd49795c09 |
| | | 15 | SHA1 (patch-lib_Makefile.skel) = abfb9d50eef60c5d43cbf4978bf179de0ebe371e |
/*
* Copyright (C) 2022 Tobias Nygren <tnn@NetBSD.org>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../machine.h"
#if defined(HASNCACHE) && defined(USE_LIB_RNMT)
#include <sys/rbtree.h>
#include <sys/vnode_impl.h>
#include <err.h>
#include "../lsof.h"
/*
* rnmt.c - read NetBSD=>10-style red-black tree kernel name cache
*/
static int lnc_compare_nodes(void *, const void *, const void *);
static int lnc_compare_key(void *, const void *, const void *);
static rb_tree_t lnc_rbtree;
/* local name cache entry */
struct lnc {
struct rb_node lnc_tree; /* red-black tree */
KA_T lnc_vp; /* vnode address */
KA_T lnc_pvp; /* parent vnode address */
const struct lnc *lnc_plnc; /* parent lnc address */
int lnc_nlen; /* name length */
char lnc_name[NCHNAMLEN + 1]; /* name */
};
static const rb_tree_ops_t lnc_rbtree_ops = {
.rbto_compare_nodes = lnc_compare_nodes,
.rbto_compare_key = lnc_compare_key,
.rbto_node_offset = offsetof(struct lnc, lnc_tree),
.rbto_context = NULL
};
static int
lnc_compare_nodes(void *context, const void *node1, const void *node2)
{
const struct lnc *lnc1 = node1;
const struct lnc *lnc2 = node2;
if (lnc1->lnc_vp < lnc2->lnc_vp) {
return -1;
}
if (lnc1->lnc_vp > lnc2->lnc_vp) {
return 1;
}
return 0;
}
static int
lnc_compare_key(void *context, const void *node, const void *key)
{
const struct lnc *lnc = node;
const KA_T vp = (KA_T)key;
if (lnc->lnc_vp < vp) {
return -1;
}
if (lnc->lnc_vp > vp) {
return 1;
}
return 0;
}
static struct lnc *
ncache_enter_local(KA_T vp, KA_T pvp, const struct lnc *plnc, const struct namecache *nc)
{
struct lnc *lnc;
lnc = malloc(sizeof(*lnc));
if (!lnc) {
errx(1, "can't allocate local name cache entry\n");
}
lnc->lnc_vp = vp;
lnc->lnc_pvp = pvp;
lnc->lnc_plnc = plnc;
lnc->lnc_nlen = nc->nc_nlen;
memcpy(lnc->lnc_name, nc->nc_name, lnc->lnc_nlen);
lnc->lnc_name[lnc->lnc_nlen] = 0;
rb_tree_insert_node(&lnc_rbtree, lnc);
return lnc;
}
static int
sanity_check_vnode_impl(const struct vnode_impl *vi)
{
if (vi->vi_vnode.v_type >= VBAD)
return -1;
return 0;
}
static int
sanity_check_namecache(const struct namecache *nc)
{
if (nc->nc_vp == NULL)
return -1;
if (nc->nc_nlen > NCHNAMLEN)
return -1;
if (nc->nc_nlen == 1 && nc->nc_name[0] == '.')
return -1;
if (nc->nc_nlen == 2 && nc->nc_name[0] == '.' && nc->nc_name[1] == '.')
return -1;
return 0;
}
static void
ncache_walk(KA_T ncp, KA_T pvp, const struct lnc *plnc)
{
struct l_nch *lc;
static struct vnode_impl vi;
static struct namecache nc;
struct lnc *lnc;
KA_T vp;
KA_T left, right;
if (kread(ncp, (char *)&nc, sizeof(nc))) {
return;
}
vp = (KA_T)nc.nc_vp;
if (kread(vp, (char *)&vi, sizeof(vi))) {
vi.vi_vnode.v_type = VBAD;
}
left = (KA_T)nc.nc_tree.rb_nodes[0];
right = (KA_T)nc.nc_tree.rb_nodes[1];
if (sanity_check_vnode_impl(&vi) == 0 && sanity_check_namecache(&nc) == 0) {
lnc = ncache_enter_local(vp, pvp, plnc, &nc);
if (vi.vi_vnode.v_type = VDIR && vi.vi_nc_tree.rbt_root != NULL) {
ncache_walk((KA_T)vi.vi_nc_tree.rbt_root, ncp, lnc);
}
}
if (left)
ncache_walk(left, pvp, plnc);
if (right)
ncache_walk(right, pvp, plnc);
}
void
ncache_load()
{
KA_T rootvnode_addr;
struct vnode_impl vi;
rootvnode_addr = (KA_T)0;
if (get_Nl_value("rootvnode", (struct drive_Nl *)NULL, &rootvnode_addr) < 0
|| !rootvnode_addr
|| kread((KA_T)rootvnode_addr, (char *)&rootvnode_addr, sizeof(rootvnode_addr))
|| kread((KA_T)rootvnode_addr, (char *)&vi, sizeof(vi))) {
errx(1, "can't read rootvnode\n");
}
rb_tree_init(&lnc_rbtree, &lnc_rbtree_ops);
ncache_walk((KA_T)vi.vi_nc_tree.rbt_root, 0, 0);
}
static void
build_path(char **buf, size_t *remaining, const struct lnc *lnc)
{
size_t len;
if (lnc == NULL)
return;
build_path(buf, remaining, lnc->lnc_plnc);
if (remaining == 0) {
return;
}
if (lnc->lnc_plnc != NULL) {
**buf = '/';
(*buf)++;
}
remaining--;
len = lnc->lnc_nlen;
if (*remaining < len)
len = *remaining;
memcpy(*buf, lnc->lnc_name, len);
*remaining -= len;
*buf += len;
}
char *
ncache_lookup(char *buf, int blen, int *fp)
{
const struct lnc *lnc;
char *p;
size_t remaining;
*fp = 0;
lnc = rb_tree_find_node(&lnc_rbtree, (void*)Lf->na);
if (lnc != NULL) {
p = buf;
remaining = blen;
build_path(&p, &remaining, lnc);
if (remaining == 0) {
buf[blen - 1] = 0;
} else {
*p = 0;
}
*fp = 1;
return buf;
}
return NULL;
}
#endif
--- pkgsrc/sysutils/lsof/patches/patch-aa 2010/04/30 06:53:07 1.28
+++ pkgsrc/sysutils/lsof/patches/patch-aa 2022/05/25 09:33:37 1.29
| @@ -1,15 +1,26 @@ | | | @@ -1,15 +1,26 @@ |
1 | $NetBSD: patch-aa,v 1.28 2010/04/30 06:53:07 sbd Exp $ | | 1 | $NetBSD: patch-aa,v 1.29 2022/05/25 09:33:37 tnn Exp $ |
2 | | | 2 | |
3 | --- dialects/n+obsd/machine.h.orig 2006-03-28 16:54:17.000000000 -0500 | | 3 | --- dialects/n+obsd/machine.h.orig 2010-07-29 16:02:55.000000000 +0000 |
4 | +++ dialects/n+obsd/machine.h 2008-05-17 18:53:29.000000000 -0400 | | 4 | +++ dialects/n+obsd/machine.h |
5 | @@ -41,6 +41,10 @@ | | 5 | @@ -41,6 +41,10 @@ |
6 | | | 6 | |
7 | #include <sys/types.h> | | 7 | #include <sys/types.h> |
8 | #include <sys/param.h> | | 8 | #include <sys/param.h> |
9 | +#include <stdbool.h> | | 9 | +#include <stdbool.h> |
10 | +#if __NetBSD_Version__ >= 499006200 | | 10 | +#if __NetBSD_Version__ >= 499006200 |
11 | +#define HASCWDINFO | | 11 | +#define HASCWDINFO |
12 | +#endif | | 12 | +#endif |
13 | | | 13 | |
14 | | | 14 | |
15 | /* | | 15 | /* |
| | | 16 | @@ -577,7 +581,9 @@ |
| | | 17 | /* #define USE_LIB_READMNT 1 rmnt.c */ |
| | | 18 | /* #define USE_LIB_REGEX 1 regex.c */ |
| | | 19 | |
| | | 20 | -# if (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) |
| | | 21 | +#if (defined(NETBSDV) && NETBSDV>=9099000) |
| | | 22 | +#define USE_LIB_RNMT 1 /* rnmt.c */ |
| | | 23 | +# elif (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) |
| | | 24 | #define USE_LIB_RNMH 1 /* rnmh.c */ |
| | | 25 | # else /* (defined(OPENBSDV) && OPENBSDV<2010) && (defined(NETBSDV) && NETBSDV<1002000) */ |
| | | 26 | #define USE_LIB_RNAM 1 /* rnam.c */ |
--- pkgsrc/sysutils/lsof/patches/patch-ac 2008/05/17 23:53:29 1.29
+++ pkgsrc/sysutils/lsof/patches/patch-ac 2022/05/25 09:33:37 1.30
| @@ -1,13 +1,24 @@ | | | @@ -1,13 +1,24 @@ |
1 | $NetBSD: patch-ac,v 1.29 2008/05/17 23:53:29 christos Exp $ | | 1 | $NetBSD: patch-ac,v 1.30 2022/05/25 09:33:37 tnn Exp $ |
2 | | | 2 | |
3 | --- dialects/n+obsd/dstore.c.orig 2004-12-30 13:42:32.000000000 -0500 | | 3 | --- dialects/n+obsd/dstore.c.orig 2004-12-30 18:42:32.000000000 +0000 |
4 | +++ dialects/n+obsd/dstore.c 2008-05-17 19:35:34.000000000 -0400 | | 4 | +++ dialects/n+obsd/dstore.c |
5 | @@ -119,6 +119,8 @@ | | 5 | @@ -48,7 +48,9 @@ struct file *Cfp; /* current file's fil |
| | | 6 | */ |
| | | 7 | |
| | | 8 | struct drive_Nl Drive_Nl[] = { |
| | | 9 | - |
| | | 10 | +#if (defined(NETBSDV) && NETBSDV>=9099000) |
| | | 11 | + { "rootvnode", "rootvnode", }, |
| | | 12 | +#endif |
| | | 13 | #if (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) |
| | | 14 | { X_NCACHE, "_nchashtbl", }, |
| | | 15 | { X_NCSIZE, "_nchash" }, |
| | | 16 | @@ -119,6 +121,8 @@ struct pff_tab Pof_tab[] = { |
6 | | | 17 | |
7 | # if defined(UF_EXCLOSE) | | 18 | # if defined(UF_EXCLOSE) |
8 | { (long)UF_EXCLOSE, POF_CLOEXEC }, | | 19 | { (long)UF_EXCLOSE, POF_CLOEXEC }, |
9 | +# else | | 20 | +# else |
10 | + { (long)1, POF_CLOEXEC }, | | 21 | + { (long)1, POF_CLOEXEC }, |
11 | # endif /* defined(UF_EXCLOSE) */ | | 22 | # endif /* defined(UF_EXCLOSE) */ |
12 | | | 23 | |
13 | # if defined(UF_MAPPED) | | 24 | # if defined(UF_MAPPED) |
$NetBSD: patch-lib_Makefile.skel,v 1.1 2022/05/25 09:33:37 tnn Exp $
--- lib/Makefile.skel.orig 2001-02-13 02:12:22.000000000 +0000
+++ lib/Makefile.skel
@@ -13,10 +13,10 @@ INCL= ${DINC}
HDR= ../lsof.h ../proto.h ../dlsof.h ../dproto.h ../machine.h
SRC= ckkv.c cvfs.c dvch.c fino.c isfn.c lkud.c pdvn.c prfp.c \
- ptti.c rdev.c regex.c rmnt.c rnam.c rnch.c rnmh.c snpf.c
+ ptti.c rdev.c regex.c rmnt.c rnam.c rnch.c rnmh.c rnmt.c snpf.c
OBJ= ckkv.o cvfs.o dvch.o fino.o isfn.o lkud.o pdvn.o prfp.o \
- ptti.o rdev.o regex.o rmnt.o rnam.o rnch.o rnmh.o snpf.o
+ ptti.o rdev.o regex.o rmnt.o rnam.o rnch.o rnmh.o rnmt.o snpf.o
all: ${LIB}
@@ -59,4 +59,6 @@ rnch.o: ${HDR} rnch.c
rnmh.o: ${HDR} rnmh.c
+rnmt.o: ${HDR} rnmt.c
+
snpf.o: ${HDR} snpf.c