PERFORCE change 57027 for review
Marcel Moolenaar
marcel at FreeBSD.org
Sat Jul 10 18:53:26 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=57027
Change 57027 by marcel at marcel_nfs on 2004/07/11 01:52:31
IFC @57026
Affected files ...
.. //depot/projects/gdb/sys/compat/ndis/kern_ndis.c#16 integrate
.. //depot/projects/gdb/sys/compat/ndis/ndis_var.h#8 integrate
.. //depot/projects/gdb/sys/compat/ndis/subr_ndis.c#13 integrate
.. //depot/projects/gdb/sys/conf/NOTES#32 integrate
.. //depot/projects/gdb/sys/conf/files.powerpc#4 integrate
.. //depot/projects/gdb/sys/conf/options#31 integrate
.. //depot/projects/gdb/sys/dev/if_ndis/if_ndis_pccard.c#6 integrate
.. //depot/projects/gdb/sys/dev/if_ndis/if_ndis_pci.c#6 integrate
.. //depot/projects/gdb/sys/dev/if_ndis/if_ndisvar.h#7 integrate
.. //depot/projects/gdb/sys/kern/uipc_socket.c#21 integrate
.. //depot/projects/gdb/usr.bin/hexdump/conv.c#2 integrate
.. //depot/projects/gdb/usr.bin/hexdump/display.c#2 integrate
.. //depot/projects/gdb/usr.bin/hexdump/hexdump.h#2 integrate
.. //depot/projects/gdb/usr.bin/hexdump/od.1#3 integrate
Differences ...
==== //depot/projects/gdb/sys/compat/ndis/kern_ndis.c#16 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.56 2004/06/07 01:22:48 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.57 2004/07/11 00:19:30 wpaul Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -853,7 +853,8 @@
rl->cprl_count = sc->ndis_rescnt;
prd = rl->cprl_partial_descs;
- brl = BUS_GET_RESOURCE_LIST(device_get_parent(dev), dev);
+ brl = BUS_GET_RESOURCE_LIST(dev, dev);
+
if (brl != NULL) {
/*
==== //depot/projects/gdb/sys/compat/ndis/ndis_var.h#8 (text+ko) ====
@@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.26 2004/07/07 17:46:29 wpaul Exp $
+ * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.27 2004/07/11 00:19:30 wpaul Exp $
*/
#ifndef _NDIS_VAR_H_
@@ -1500,6 +1500,7 @@
extern int ndis_send_packet(void *, ndis_packet *);
extern int ndis_convert_res(void *);
extern int ndis_alloc_amem(void *);
+extern void ndis_free_amem(void *);
extern void ndis_free_packet(ndis_packet *);
extern void ndis_free_bufs(ndis_buffer *);
extern int ndis_reset_nic(void *);
@@ -1520,6 +1521,7 @@
extern int ndis_unsched(void (*)(void *), void *, int);
extern int ndis_thsuspend(struct proc *, int);
extern void ndis_thresume(struct proc *);
+extern int ndis_strcasecmp(const char *, const char *);
__END_DECLS
#endif /* _NDIS_VAR_H_ */
==== //depot/projects/gdb/sys/compat/ndis/subr_ndis.c#13 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.61 2004/07/07 17:46:29 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.62 2004/07/11 00:19:30 wpaul Exp $");
/*
* This file implements a translation layer between the BSD networking
@@ -130,7 +130,6 @@
struct sysctl_oid *, ndis_parm_type, ndis_config_parm **);
static ndis_status ndis_decode_parm(ndis_miniport_block *,
ndis_config_parm *, char *);
-static int my_strcasecmp(const char *, const char *);
__stdcall static void ndis_read_cfg(ndis_status *, ndis_config_parm **,
ndis_handle, ndis_unicode_string *, ndis_parm_type);
__stdcall static void ndis_write_cfg(ndis_status *, ndis_handle,
@@ -556,8 +555,8 @@
return(NDIS_STATUS_SUCCESS);
}
-static int
-my_strcasecmp(s1, s2)
+int
+ndis_strcasecmp(s1, s2)
const char *s1;
const char *s2;
{
@@ -619,7 +618,7 @@
TAILQ_FOREACH(e, device_get_sysctl_ctx(sc->ndis_dev), link) {
#endif
oidp = e->entry;
- if (my_strcasecmp(oidp->oid_name, keystr) == 0) {
+ if (ndis_strcasecmp(oidp->oid_name, keystr) == 0) {
if (strcmp((char *)oidp->oid_arg1, "UNSET") == 0) {
free(keystr, M_DEVBUF);
*status = NDIS_STATUS_FAILURE;
@@ -719,7 +718,7 @@
TAILQ_FOREACH(e, device_get_sysctl_ctx(sc->ndis_dev), link) {
#endif
oidp = e->entry;
- if (my_strcasecmp(oidp->oid_name, keystr) == 0) {
+ if (ndis_strcasecmp(oidp->oid_name, keystr) == 0) {
/* Found it, set the value. */
strcpy((char *)oidp->oid_arg1, val);
free(keystr, M_DEVBUF);
@@ -885,6 +884,7 @@
uint16_t flags;
char msgbuf[ERRMSGLEN];
+
block = (ndis_miniport_block *)adapter;
error = pe_get_message(block->nmb_img, code, &str, &i, &flags);
@@ -1478,6 +1478,9 @@
else if (sc->ndis_res_altmem != NULL &&
paddr.np_quad == rman_get_start(sc->ndis_res_altmem))
*vaddr = (void *)rman_get_virtual(sc->ndis_res_altmem);
+ else if (sc->ndis_res_am != NULL &&
+ paddr.np_quad == rman_get_start(sc->ndis_res_am))
+ *vaddr = (void *)rman_get_virtual(sc->ndis_res_am);
else
return(NDIS_STATUS_FAILURE);
@@ -2244,7 +2247,7 @@
bt = rman_get_bustag(sc->ndis_res_am);
for (i = 0; i < len; i++)
- dest[i] = bus_space_read_1(bt, bh, (offset * 2) + (i * 2));
+ dest[i] = bus_space_read_1(bt, bh, (offset + i) * 2);
return(i);
}
@@ -2274,7 +2277,7 @@
bt = rman_get_bustag(sc->ndis_res_am);
for (i = 0; i < len; i++)
- bus_space_write_1(bt, bh, (offset * 2) + (i * 2), src[i]);
+ bus_space_write_1(bt, bh, (offset + i) * 2, src[i]);
return(i);
}
@@ -2584,7 +2587,7 @@
NDFREE(&nd, NDF_ONLY_PNBUF);
/* Get the file size. */
- VOP_GETATTR(nd.ni_vp, vap, NOCRED, td);
+ VOP_GETATTR(nd.ni_vp, vap, td->td_ucred, td);
VOP_UNLOCK(nd.ni_vp, 0, td);
mtx_unlock(&Giant);
@@ -2593,6 +2596,7 @@
*filehandle = fh;
*filelength = fh->nf_maplen = vap->va_size & 0xFFFFFFFF;
*status = NDIS_STATUS_SUCCESS;
+
return;
}
==== //depot/projects/gdb/sys/conf/NOTES#32 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1243 2004/07/08 22:35:34 brian Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1244 2004/07/11 01:44:07 marcel Exp $
#
# NOTES -- Lines that can be cut/pasted into kernel and hints configs.
#
==== //depot/projects/gdb/sys/conf/files.powerpc#4 (text+ko) ====
@@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
-# $FreeBSD: src/sys/conf/files.powerpc,v 1.37 2004/03/23 18:26:02 alc Exp $
+# $FreeBSD: src/sys/conf/files.powerpc,v 1.38 2004/07/11 01:38:25 grehan Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -27,6 +27,7 @@
dev/syscons/syscons.c optional sc
dev/syscons/sysmouse.c optional sc
geom/geom_apple.c standard
+kern/syscalls.c optional ktr
powerpc/powerpc/atomic.S standard
powerpc/powerpc/autoconf.c standard
powerpc/powerpc/bcopy.c standard
==== //depot/projects/gdb/sys/conf/options#31 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.463 2004/07/10 19:34:06 marcel Exp $
+# $FreeBSD: src/sys/conf/options,v 1.464 2004/07/11 01:44:07 marcel Exp $
#
# On the handling of kernel options
#
@@ -30,15 +30,6 @@
# If filename is missing, the default is
# opt_<name-of-option-in-lower-case>.h
-# XXX temporary
-GDB
-KDB opt_global.h
-KDB_TRACE opt_kdb.h
-KDB_UNATTENDED opt_kdb.h
-WITNESS_KDB opt_witness.h
-SC_DISABLE_KDBKEY opt_syscons.h
-
-
AAC_DEBUG opt_aac.h
AHC_ALLOW_MEMIO opt_aic7xxx.h
AHC_TMODE_ENABLE opt_aic7xxx.h
==== //depot/projects/gdb/sys/dev/if_ndis/if_ndis_pccard.c#6 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pccard.c,v 1.5 2004/06/01 23:27:36 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pccard.c,v 1.6 2004/07/11 00:19:30 wpaul Exp $");
#include <sys/ctype.h>
#include <sys/param.h>
@@ -85,14 +85,14 @@
static int ndis_probe_pccard (device_t);
static int ndis_attach_pccard (device_t);
+static struct resource_list *ndis_get_resource_list
+ (device_t, device_t);
extern int ndis_attach (device_t);
extern int ndis_shutdown (device_t);
extern int ndis_detach (device_t);
extern int ndis_suspend (device_t);
extern int ndis_resume (device_t);
-static int my_strcasecmp (const char *, const char *, int);
-
extern struct mtx_pool *ndis_mtxpool;
static device_method_t ndis_methods[] = {
@@ -104,6 +104,15 @@
DEVMETHOD(device_suspend, ndis_suspend),
DEVMETHOD(device_resume, ndis_resume),
+ /* Bus interface. */
+
+ /*
+ * This is an awful kludge, but we need it becase pccard
+ * does not implement a bus_get_resource_list() method.
+ */
+
+ DEVMETHOD(bus_get_resource_list, ndis_get_resource_list),
+
{ 0, 0 }
};
@@ -127,22 +136,6 @@
DRIVER_MODULE(ndis, pccard, ndis_driver, ndis_devclass, 0, 0);
#endif
-static int my_strcasecmp(s1, s2, len)
- const char *s1;
- const char *s2;
- int len;
-{
- int i;
-
- for (i = 0; i < len; i++) {
- if (toupper(s1[i]) != toupper(s2[i]))
- return(0);
- }
-
- return(1);
-}
-
-
/*
* Probe for an NDIS device. Check the PCI vendor and device
* IDs against our list and return a device name if we find a match.
@@ -165,8 +158,8 @@
return(error);
while(t->ndis_name != NULL) {
- if (my_strcasecmp(vendstr, t->ndis_vid, strlen(vendstr)) &&
- my_strcasecmp(prodstr, t->ndis_did, strlen(prodstr))) {
+ if (ndis_strcasecmp(vendstr, t->ndis_vid) == 0 &&
+ ndis_strcasecmp(prodstr, t->ndis_did) == 0) {
device_set_desc(dev, t->ndis_name);
return(0);
}
@@ -193,6 +186,7 @@
sc = device_get_softc(dev);
unit = device_get_unit(dev);
sc->ndis_dev = dev;
+ resource_list_init(&sc->ndis_rl);
sc->ndis_io_rid = 0;
sc->ndis_res_io = bus_alloc_resource(dev,
@@ -205,6 +199,9 @@
goto fail;
}
sc->ndis_rescnt++;
+ resource_list_add(&sc->ndis_rl, SYS_RES_IOPORT, rid,
+ rman_get_start(sc->ndis_res_io), rman_get_end(sc->ndis_res_io),
+ rman_get_size(sc->ndis_res_io));
rid = 0;
sc->ndis_irq = bus_alloc_resource(dev,
@@ -217,6 +214,8 @@
goto fail;
}
sc->ndis_rescnt++;
+ resource_list_add(&sc->ndis_rl, SYS_RES_IRQ, rid,
+ rman_get_start(sc->ndis_irq), rman_get_start(sc->ndis_irq), 1);
sc->ndis_iftype = PCMCIABus;
@@ -232,8 +231,8 @@
return(error);
while(t->ndis_name != NULL) {
- if (my_strcasecmp(vendstr, t->ndis_vid, strlen(vendstr)) &&
- my_strcasecmp(prodstr, t->ndis_did, strlen(prodstr)))
+ if (ndis_strcasecmp(vendstr, t->ndis_vid) == 0 &&
+ ndis_strcasecmp(prodstr, t->ndis_did) == 0)
break;
t++;
devidx++;
@@ -247,6 +246,17 @@
return(error);
}
+static struct resource_list *
+ndis_get_resource_list(dev, child)
+ device_t dev;
+ device_t child;
+{
+ struct ndis_softc *sc;
+
+ sc = device_get_softc(dev);
+ return (&sc->ndis_rl);
+}
+
#endif /* NDIS_PCI_DEV_TABLE */
#define NDIS_AM_RID 3
@@ -271,6 +281,10 @@
"failed to allocate attribute memory\n");
return(ENXIO);
}
+ sc->ndis_rescnt++;
+ resource_list_add(&sc->ndis_rl, SYS_RES_MEMORY, rid,
+ rman_get_start(sc->ndis_res_am), rman_get_end(sc->ndis_res_am),
+ rman_get_size(sc->ndis_res_am));
error = CARD_SET_MEMORY_OFFSET(device_get_parent(sc->ndis_dev),
sc->ndis_dev, rid, 0, NULL);
@@ -290,5 +304,26 @@
return(error);
}
+ sc->ndis_am_rid = rid;
+
return(0);
}
+
+void
+ndis_free_amem(arg)
+ void *arg;
+{
+ struct ndis_softc *sc;
+
+ if (arg == NULL)
+ return;
+
+ sc = arg;
+
+ if (sc->ndis_res_am != NULL)
+ bus_release_resource(sc->ndis_dev, SYS_RES_MEMORY,
+ sc->ndis_am_rid, sc->ndis_res_am);
+ resource_list_free(&sc->ndis_rl);
+
+ return;
+}
==== //depot/projects/gdb/sys/dev/if_ndis/if_ndis_pci.c#6 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pci.c,v 1.6 2004/06/01 23:27:36 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pci.c,v 1.7 2004/07/11 00:19:30 wpaul Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -84,6 +84,8 @@
static int ndis_probe_pci (device_t);
static int ndis_attach_pci (device_t);
+static struct resource_list *ndis_get_resource_list
+ (device_t, device_t);
extern int ndis_attach (device_t);
extern int ndis_shutdown (device_t);
extern int ndis_detach (device_t);
@@ -101,6 +103,9 @@
DEVMETHOD(device_suspend, ndis_suspend),
DEVMETHOD(device_resume, ndis_resume),
+ /* Bus interface */
+ DEVMETHOD(bus_get_resource_list, ndis_get_resource_list),
+
{ 0, 0 }
};
@@ -321,4 +326,15 @@
return(error);
}
+static struct resource_list *
+ndis_get_resource_list(dev, child)
+ device_t dev;
+ device_t child;
+{
+ struct ndis_softc *sc;
+
+ sc = device_get_softc(dev);
+ return (BUS_GET_RESOURCE_LIST(device_get_parent(sc->ndis_dev), dev));
+}
+
#endif /* NDIS_PCI_DEV_TABLE */
==== //depot/projects/gdb/sys/dev/if_ndis/if_ndisvar.h#7 (text+ko) ====
@@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/if_ndis/if_ndisvar.h,v 1.14 2004/07/07 17:46:30 wpaul Exp $
+ * $FreeBSD: src/sys/dev/if_ndis/if_ndisvar.h,v 1.15 2004/07/11 00:19:30 wpaul Exp $
*/
#define NDIS_DEFAULT_NODENAME "FreeBSD NDIS node"
@@ -90,7 +90,9 @@
struct resource *ndis_res_altmem;
int ndis_altmem_rid;
struct resource *ndis_res_am; /* attribute mem (pccard) */
+ int ndis_am_rid;
struct resource *ndis_res_cm; /* common mem (pccard) */
+ struct resource_list ndis_rl;
int ndis_rescnt;
struct mtx ndis_mtx;
struct mtx ndis_intrmtx;
==== //depot/projects/gdb/sys/kern/uipc_socket.c#21 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.195 2004/07/10 21:43:35 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.198 2004/07/11 01:44:12 rwatson Exp $");
#include "opt_inet.h"
#include "opt_mac.h"
@@ -63,6 +63,9 @@
#include <vm/uma.h>
+static int soreceive_rcvoob(struct socket *so, struct uio *uio,
+ int flags);
+
#ifdef INET
static int do_setopt_accept_filter(struct socket *so, struct sockopt *sopt);
#endif
@@ -831,6 +834,64 @@
}
/*
+ * The part of soreceive() that implements reading non-inline out-of-band
+ * data from a socket. For more complete comments, see soreceive(), from
+ * which this code originated.
+ *
+ * XXXRW: Note that soreceive_rcvoob(), unlike the remainder of soreceve(),
+ * is unable to return an mbuf chain to the caller.
+ */
+static int
+soreceive_rcvoob(so, uio, flags)
+ struct socket *so;
+ struct uio *uio;
+ int flags;
+{
+ struct protosw *pr = so->so_proto;
+ struct mbuf *m;
+ int error;
+
+ KASSERT(flags & MSG_OOB, ("soreceive_rcvoob: (flags & MSG_OOB) == 0"));
+
+ m = m_get(M_TRYWAIT, MT_DATA);
+ if (m == NULL)
+ return (ENOBUFS);
+ error = (*pr->pr_usrreqs->pru_rcvoob)(so, m, flags & MSG_PEEK);
+ if (error)
+ goto bad;
+ do {
+#ifdef ZERO_COPY_SOCKETS
+ if (so_zero_copy_receive) {
+ vm_page_t pg;
+ int disposable;
+
+ if ((m->m_flags & M_EXT)
+ && (m->m_ext.ext_type == EXT_DISPOSABLE))
+ disposable = 1;
+ else
+ disposable = 0;
+
+ pg = PHYS_TO_VM_PAGE(vtophys(mtod(m, caddr_t)));
+ if (uio->uio_offset == -1)
+ uio->uio_offset =IDX_TO_OFF(pg->pindex);
+
+ error = uiomoveco(mtod(m, void *),
+ min(uio->uio_resid, m->m_len),
+ uio, pg->object,
+ disposable);
+ } else
+#endif /* ZERO_COPY_SOCKETS */
+ error = uiomove(mtod(m, void *),
+ (int) min(uio->uio_resid, m->m_len), uio);
+ m = m_free(m);
+ } while (uio->uio_resid && error == 0 && m);
+bad:
+ if (m != NULL)
+ m_freem(m);
+ return (error);
+}
+
+/*
* Implement receive operations on a socket.
* We depend on the way that records are added to the sockbuf
* by sbappend*. In particular, each record (mbufs linked through m_next)
@@ -864,51 +925,15 @@
mp = mp0;
if (psa != NULL)
- *psa = 0;
+ *psa = NULL;
if (controlp != NULL)
- *controlp = 0;
+ *controlp = NULL;
if (flagsp != NULL)
flags = *flagsp &~ MSG_EOR;
else
flags = 0;
- if (flags & MSG_OOB) {
- m = m_get(M_TRYWAIT, MT_DATA);
- if (m == NULL)
- return (ENOBUFS);
- error = (*pr->pr_usrreqs->pru_rcvoob)(so, m, flags & MSG_PEEK);
- if (error)
- goto bad;
- do {
-#ifdef ZERO_COPY_SOCKETS
- if (so_zero_copy_receive) {
- vm_page_t pg;
- int disposable;
-
- if ((m->m_flags & M_EXT)
- && (m->m_ext.ext_type == EXT_DISPOSABLE))
- disposable = 1;
- else
- disposable = 0;
-
- pg = PHYS_TO_VM_PAGE(vtophys(mtod(m, caddr_t)));
- if (uio->uio_offset == -1)
- uio->uio_offset =IDX_TO_OFF(pg->pindex);
-
- error = uiomoveco(mtod(m, void *),
- min(uio->uio_resid, m->m_len),
- uio, pg->object,
- disposable);
- } else
-#endif /* ZERO_COPY_SOCKETS */
- error = uiomove(mtod(m, void *),
- (int) min(uio->uio_resid, m->m_len), uio);
- m = m_free(m);
- } while (uio->uio_resid && error == 0 && m);
-bad:
- if (m != NULL)
- m_freem(m);
- return (error);
- }
+ if (flags & MSG_OOB)
+ return (soreceive_rcvoob(so, uio, flags));
if (mp != NULL)
*mp = NULL;
if (so->so_state & SS_ISCONFIRMING && uio->uio_resid)
@@ -985,6 +1010,7 @@
SOCKBUF_LOCK_ASSERT(&so->so_rcv);
if (uio->uio_td)
uio->uio_td->td_proc->p_stats->p_ru.ru_msgrcv++;
+ KASSERT(m == so->so_rcv.sb_mb, ("soreceive: m != so->so_rcv.sb_mb"));
SBLASTRECORDCHK(&so->so_rcv);
SBLASTMBUFCHK(&so->so_rcv);
nextrecord = m->m_nextpkt;
==== //depot/projects/gdb/usr.bin/hexdump/conv.c#2 (text+ko) ====
@@ -35,20 +35,35 @@
static const char sccsid[] = "@(#)conv.c 8.1 (Berkeley) 6/6/93";
#endif /* not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.bin/hexdump/conv.c,v 1.6 2002/09/04 23:29:01 dwmalone Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/hexdump/conv.c,v 1.7 2004/07/11 01:11:12 tjr Exp $");
#include <sys/types.h>
+#include <assert.h>
#include <stdio.h>
#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <wctype.h>
#include "hexdump.h"
void
-conv_c(PR *pr, u_char *p)
+conv_c(PR *pr, u_char *p, size_t bufsize)
{
char buf[10];
char const *str;
+ wchar_t wc;
+ size_t clen, oclen;
+ int converr, pad, width;
+ char peekbuf[MB_LEN_MAX];
+ if (pr->mbleft > 0) {
+ str = "**";
+ pr->mbleft--;
+ goto strpr;
+ }
+
switch(*p) {
case '\0':
str = "\\0";
@@ -78,9 +93,53 @@
default:
break;
}
- if (isprint(*p)) {
- *pr->cchar = 'c';
- (void)printf(pr->fmt, *p);
+ /*
+ * Multibyte characters are disabled for hexdump(1) for backwards
+ * compatibility and consistency (none of its other output formats
+ * recognize them correctly).
+ */
+ converr = 0;
+ if (odmode && MB_CUR_MAX > 1) {
+ oclen = 0;
+retry:
+ clen = mbrtowc(&wc, p, bufsize, &pr->mbstate);
+ if (clen == 0)
+ clen = 1;
+ else if (clen == (size_t)-1 || (clen == (size_t)-2 &&
+ buf == peekbuf)) {
+ memset(&pr->mbstate, 0, sizeof(pr->mbstate));
+ wc = *p;
+ clen = 1;
+ converr = 1;
+ } else if (clen == (size_t)-2) {
+ /*
+ * Incomplete character; peek ahead and see if we
+ * can complete it.
+ */
+ oclen = bufsize;
+ bufsize = peek(p = peekbuf, MB_CUR_MAX);
+ goto retry;
+ }
+ clen += oclen;
+ } else {
+ wc = *p;
+ clen = 1;
+ }
+ if (!converr && iswprint(wc)) {
+ if (!odmode) {
+ *pr->cchar = 'c';
+ (void)printf(pr->fmt, (int)wc);
+ } else {
+ *pr->cchar = 'C';
+ assert(strcmp(pr->fmt, "%3C") == 0);
+ width = wcwidth(wc);
+ assert(width > 0);
+ pad = 3 - width;
+ if (pad < 0)
+ pad = 0;
+ (void)printf("%*s%C", pad, "", wc);
+ pr->mbleft = clen - 1;
+ }
} else {
(void)sprintf(buf, "%03o", (int)*p);
str = buf;
==== //depot/projects/gdb/usr.bin/hexdump/display.c#2 (text+ko) ====
@@ -37,7 +37,7 @@
#endif
#endif /* not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.bin/hexdump/display.c,v 1.18 2002/09/04 23:29:01 dwmalone Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/hexdump/display.c,v 1.19 2004/07/11 01:11:12 tjr Exp $");
#include <sys/param.h>
#include <sys/stat.h>
@@ -132,7 +132,8 @@
(void)printf(pr->fmt, "");
break;
case F_C:
- conv_c(pr, bp);
+ conv_c(pr, bp, eaddress ? eaddress - address :
+ blocksize - address % blocksize);
break;
case F_CHAR:
(void)printf(pr->fmt, *bp);
@@ -261,6 +262,10 @@
errx(1, "cannot skip past end of input");
if (need == blocksize)
return((u_char *)NULL);
+ /*
+ * XXX bcmp() is not quite right in the presence
+ * of multibyte characters.
+ */
if (vflag != ALL &&
valid_save &&
bcmp(curp, savp, nread) == 0) {
@@ -284,6 +289,10 @@
if (length != -1)
length -= n;
if (!(need -= n)) {
+ /*
+ * XXX bcmp() is not quite right in the presence
+ * of multibyte characters.
+ */
if (vflag == ALL || vflag == FIRST ||
valid_save == 0 ||
bcmp(curp, savp, blocksize) != 0) {
@@ -303,6 +312,27 @@
}
}
+size_t
+peek(u_char *buf, size_t nbytes)
+{
+ size_t n, nread;
+ int c;
+
+ if (length != -1 && nbytes > length)
+ nbytes = length;
+ nread = 0;
+ while (nread < nbytes && (c = getchar()) != EOF) {
+ *buf++ = c;
+ nread++;
+ }
+ n = nread;
+ while (n-- > 0) {
+ c = *--buf;
+ ungetc(c, stdin);
+ }
+ return (nread);
+}
+
int
next(char **argv)
{
==== //depot/projects/gdb/usr.bin/hexdump/hexdump.h#2 (text+ko) ====
@@ -31,9 +31,11 @@
* SUCH DAMAGE.
*
* @(#)hexdump.h 8.1 (Berkeley) 6/6/93
- * $FreeBSD: src/usr.bin/hexdump/hexdump.h,v 1.8 2002/09/04 23:29:01 dwmalone Exp $
+ * $FreeBSD: src/usr.bin/hexdump/hexdump.h,v 1.9 2004/07/11 01:11:12 tjr Exp $
*/
+#include <wchar.h>
+
typedef struct _pr {
struct _pr *nextpr; /* next print unit */
#define F_ADDRESS 0x001 /* print offset */
@@ -52,6 +54,8 @@
char *cchar; /* conversion character */
char *fmt; /* printf format */
char *nospace; /* no whitespace version */
+ int mbleft; /* bytes left of multibyte char. */
+ mbstate_t mbstate; /* conversion state */
} PR;
typedef struct _fu {
@@ -88,7 +92,7 @@
void badfmt(const char *);
void badsfmt(void);
void bpad(PR *);
-void conv_c(PR *, u_char *);
+void conv_c(PR *, u_char *, size_t);
void conv_u(PR *, u_char *);
void display(void);
void doskip(const char *, int);
@@ -98,6 +102,7 @@
int next(char **);
void nomem(void);
void oldsyntax(int, char ***);
+size_t peek(u_char *, size_t);
void rewrite(FS *);
int size(FS *);
void usage(void);
==== //depot/projects/gdb/usr.bin/hexdump/od.1#3 (text+ko) ====
@@ -30,9 +30,9 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)od.1 8.1 (Berkeley) 6/6/93
-.\" $FreeBSD: src/usr.bin/hexdump/od.1,v 1.16 2004/07/03 01:28:20 tjr Exp $
+.\" $FreeBSD: src/usr.bin/hexdump/od.1,v 1.17 2004/07/11 01:11:12 tjr Exp $
.\"
-.Dd July 3, 2004
+.Dd July 11, 2004
.Os
.Dt OD 1
.Sh NAME
@@ -179,6 +179,10 @@
.It vertical tab
\ev
.El
+.Pp
+Multi-byte characters are displayed in the area corresponding to the first
+byte of the character. The remaining bytes are shown as
+.Ql ** .
.It Xo
.Sm off
.Op Cm d | o | u | x
@@ -231,6 +235,15 @@
If no output format is specified,
.Fl t Ar oS
is assumed.
+.Sh ENVIRONMENT
+The
+.Ev LANG , LC_ALL
+and
+.Ev LC_CTYPE
+environment variables affect the execution of
+.Nm
+as described in
+.Xr environ 7 .
.Sh DIAGNOSTICS
.Ex -std
.Sh COMPATIBILITY
@@ -252,7 +265,3 @@
.Nm
command appeared in
.At v1 .
-.Sh BUGS
-The
-.Nm
-utility does not recognize multibyte characters.
More information about the p4-projects
mailing list