distribution: .MAKE
cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \
${IMAKE_INSTALL} ${IMAKE_MTREE} METALOG=${METALOG} ${.TARGET}
- ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 installconfig
+ ${_+_}cd ${.CURDIR}; ${CROSSENV} PATH=${TMPPATH} \
+ ${MAKE} -f Makefile.inc1 ${IMAKE_INSTALL} \
+ METALOG=${METALOG} installconfig
#
# buildkernel and installkernel
+++ /dev/null
-# $DragonFly: src/libexec/dma/Makefile,v 1.5 2008/09/19 00:36:57 corecode Exp $
-#
-
-version!= sh get-version.sh
-
-CFLAGS+= -I${.CURDIR}
-CFLAGS+= -DHAVE_REALLOCF -DHAVE_STRLCPY -DHAVE_GETPROGNAME
-CFLAGS+= -DLIBEXEC_PATH='"${LIBEXEC}"' -DDMA_VERSION='"${version}"'
-CFLAGS+= -DCONF_PATH='"${CONFDIR}"'
-
-DPADD= ${LIBSSL} ${LIBCRYPTO}
-LDADD= -lssl -lcrypto
-
-PROG= dma
-SRCS= aliases_parse.y aliases_scan.l base64.c conf.c crypto.c
-SRCS+= dma.c dns.c local.c mail.c net.c spool.c util.c
-MAN= dma.8
-
-PREFIX?= /usr/local
-LIBEXEC?= ${PREFIX}/libexec
-CONFDIR?= ${PREFIX}/etc/dma
-
-BINOWN= root
-BINGRP= mail
-BINMODE=2555
-WARNS?= 6
-
-.include <bsd.prog.mk>
+Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
Copyright (c) 2008 The DragonFly Project.
-Copyright (c) 2008-2011, Simon Schubert <2@0x2c.org>.
All rights reserved.
This code is derived from software contributed to The DragonFly Project
SUCH DAMAGE.
-Copyright (c) 1995-2001 Kungliga Tekniska Högskolan
+Copyright (c) 1995-2001 Kungliga Tekniska Högskolan
(Royal Institute of Technology, Stockholm, Sweden).
All rights reserved.
Building
--------
+In Linux:
+
make
+In BSD:
+
+ cd bsd && make
Installation
------------
- unquote/handle quoted local recipients
-- use proper sysexit codes
- handle/use ESMTP extensions
- .forward support
- suggest way to run a queue flush on boot
extern int yylineno;
static void yyerror(const char *);
-int yywrap(void);
-int yylex(void);
static void
yyerror(const char *msg)
%{
#include <string.h>
+#include "dma.h"
#include "aliases_parse.h"
#define YY_NO_INPUT
-int yylex(void);
%}
%option yylineno
if (line[0] == '.') {
if ((linelen + 2) > 1000) {
syslog(LOG_CRIT, "Cannot escape leading dot. Buffer overflow");
- exit(1);
+ exit(EX_DATAERR);
}
memmove((line + 1), line, (linelen + 1));
line[0] = '.';
a = fopen(path, "r");
if (a == NULL) {
- errlog(1, "can not open auth file `%s'", path);
+ errlog(EX_NOINPUT, "can not open auth file `%s'", path);
/* NOTREACHED */
}
au = calloc(1, sizeof(*au));
if (au == NULL)
- errlog(1, "calloc failed");
+ errlog(EX_OSERR, NULL);
data = strdup(line);
au->login = strsep(&data, "|");
if (au->login == NULL ||
au->host == NULL ||
au->password == NULL) {
- errlogx(1, "syntax error in authfile %s:%d",
- path, lineno);
+ errlogx(EX_CONFIG, "syntax error in authfile %s:%d", path, lineno);
/* NOTREACHED */
}
/* Don't treat a non-existing config file as error */
if (errno == ENOENT)
return;
- errlog(1, "can not open config `%s'", config_path);
+ errlog(EX_NOINPUT, "can not open config `%s'", config_path);
/* NOTREACHED */
}
} else {
host = data;
}
- if (host && *host == 0)
+ if (host && *host == 0)
host = NULL;
if (user && *user == 0)
user = NULL;
else if (strcmp(word, "NULLCLIENT") == 0 && data == NULL)
config.features |= NULLCLIENT;
else {
- errlogx(1, "syntax error in %s:%d", config_path, lineno);
+ errlogx(EX_CONFIG, "syntax error in %s:%d", config_path, lineno);
/* NOTREACHED */
}
}
if ((config.features & NULLCLIENT) && config.smarthost == NULL) {
- errlogx(1, "%s: NULLCLIENT requires SMARTHOST", config_path);
+ errlogx(EX_CONFIG, "%s: NULLCLIENT requires SMARTHOST", config_path);
/* NOTREACHED */
}
+++ /dev/null
-dma (0.0.2010.06.17-3) unstable; urgency=low
-
- The default delivery mode has been changed to immediate, as it is in
- the upstream version of dma; the DEFER keyword is now disabled by default
- in dma.conf.
-
- -- Peter Pentchev <roam@ringlet.net> Tue, 27 Jul 2010 13:26:48 +0300
-
-dma (0.0.2010.06.17-1) unstable; urgency=low
-
- The dma spool directory format has changed. The Debian package of dma now
- recommends a separate package containing the dma-migrate utility; if it is
- present, it will be invoked at each periodic dma queue flush and attempt to
- convert the existing old-style queued messages to the new format. In most
- cases, this should not incur any performance penalties in normal operation,
- since dma-migrate will scan the spool directory and ignore any new messages
- (they should already be in the new format); however, if it appears that
- the periodic queue flush runs take longer than usual to start up, you may
- remove the dma-migrate package once you have ascertained that your queue
- directory (/var/spool/dma) only contains files with names beginning with
- the letters M or Q.
-
- This version of dma knows how to perform MX lookups, so remote delivery is
- now possible directly, not through a smarthost. However, a smarthost setup
- might still be preferred on many systems for various reasons - e.g. dynamic
- address assignment, a central outgoing mailserver, a roaming laptop, etc.
-
- -- Peter Pentchev <roam@ringlet.net> Mon, 21 Jun 2010 11:03:57 +0300
-
+++ /dev/null
-dma for Debian
---------------
-
-Smarthost operation by default - needs to be configured!
-
-After first installing dma, you need to configure it for proper operation -
-whether it should deliver all outgoing e-mail messages through a single
-smarthost or attempt to contact the remote mail servers directly. This should
-be configured through the debconf questions, but you may change the setting
-using the SMARTHOST directive in the /etc/dma/dma.conf file.
-
- -- Simon Schubert <2@0x2c.org> Fri, 29 Oct 2010 00:25:48 +0200
+++ /dev/null
-dma (0.9) unstable; urgency=low
-
- [ Ed Maste ]
- * Be explicit about missing user.
- * Allow DMA_ROOT_USER & DMA_GROUP to be overridden.
- * Add compat #ifdef for older OpenSSL
- * Add CONF_DIR, as in Makefile
- * More detailed error message for tmp file failure.
-
- [ Simon Schubert ]
- * spool.c: bzero contents of pointer
-
- -- Simon Schubert <2@0x2c.org> Mon, 03 Jun 2013 15:58:44 +0200
-
-dma (0.8) unstable; urgency=low
-
- [ Gert van den Berg ]
- * Added some more documentation on compiling
- * Make Makefile and README consistent with INSTALL
-
- [ Sascha Wildner ]
- * dma.8: Fix a few small issues.
-
- [ Simon Schubert ]
- * dma.8: we only have 2 config files at the moment
- * Merge pull request #2 from mohag/master
- * don't treat -options following -q as argument to it
- * deliver_remote: propagate back DNS errors
- * don't complain when we can't lock a queue file during flush
- * implement queue flushing prod
-
- -- Simon Schubert <2@0x2c.org> Fri, 30 Mar 2012 12:03:54 +0200
-
-dma (0.7) unstable; urgency=low
-
- [ Simon Schubert ]
- * add semicolon before date in Received: header
- * parse_conf: fix bug with masqueraded domains
- * clear up warnings found by clang static analysis
- * mark printf-alike functions
-
- -- Simon Schubert <2@0x2c.org> Tue, 03 Jan 2012 14:53:43 +0100
-
-dma (0.6) unstable; urgency=low
-
- [ Simon Schubert ]
- * deliver_local: quote "From " more liberally
-
- -- Simon Schubert <2@0x2c.org> Wed, 07 Dec 2011 12:42:22 +0100
-
-dma (0.5) unstable; urgency=low
-
- [ Simon Schubert ]
- * implement masquerading using the MASQUERADE config option
- * access config files at CONF_PATH, add makefile target to install conf files
- * implement the "*" catch-all alias
-
- -- Simon Schubert <2@0x2c.org> Wed, 16 Nov 2011 13:34:43 +0100
-
-dma (0.4) unstable; urgency=low
-
- [ Simon Schubert ]
- * Makefile: put libraries at the end when linking
- * LICENSE: add
- * Merge commit 'refs/merge-requests/3' of git://gitorious.org/dma/dma
- * Merge commit 'refs/merge-requests/4' of git://gitorious.org/dma/dma
- * Add symlink for sendmail which is expected by many packages
- * Makefile: create spool directories in a separate target
- * Makefile: add symlink for mailq
- * README: elaborate, use markdown
-
- [ Peter Pentchev ]
- * Fix straight SSL/TLS delivery to remote MX's.
- * Fix a minor memory leak discovered by cppcheck.
-
- -- Simon Schubert <2@0x2c.org> Wed, 16 Nov 2011 00:08:28 +0100
-
-dma (0.3) unstable; urgency=low
-
- [ Simon Schubert ]
- * todo: we create mboxes properly now
- * dma-mbox-create: group mail only needs to write to mboxes
- * errlog: preserve errno
- * dma-mbox-create: add error/status logging
- * dns_get_mx_list: handle errors properly
-
- [ Peter Pentchev ]
- * Make add_host() really return an error code.
-
- [ Simon Schubert ]
- * readmail: accept mail without newline at the end
-
- [ Peter Pentchev ]
- * In OpenSSL 1.0, TLSv1_client_method() returns a const pointer.
-
- [ Simon Schubert ]
- * make dma compile again on DragonFly
- * parse_addrs: fix parsing for multiple <addresses>
-
- -- Simon Schubert <2@0x2c.org> Sat, 09 Jul 2011 02:38:05 +0200
-
-dma (0.2) unstable; urgency=low
-
- * Update to dma 0.2
- - debian: better mark as UNRELEASED
- - add ppa makefile recipe
- - TODO: suggest way to run a queue flush on boot
- - partially adopt 34-manpage-defaults.patch: AUTHPATH is not set by default
- - Revert "debian: better mark as UNRELEASED"
- - setlogident: openlog() wants a static variable
- - writequeuef: create files with g+rw
- - drop privileges when run by root
- - implement mbox creation via setuid helper
- - debian: build with consistent flags
- - debian: remove unused files
- - debian: fix lintian warnings and errors
- - make ppa: force lower version number
- - make ppa: proper name
-
- -- Simon Schubert <2@0x2c.org> Sun, 31 Oct 2010 23:57:50 +0100
-
-dma (0.1) unstable; urgency=low
-
- * Update dma to 0.1
-
- -- Simon Schubert <2@0x2c.org> Fri, 29 Oct 2010 00:57:26 +0200
-
-dma (0.0.2010.06.17-6) unstable; urgency=low
-
- * Add the 37-gnu-hurd patch to really fix the FTBFS on GNU/Hurd.
- * Convert several shell output assignments from = to :=
- * Switch to bzip2 compression for the Debian tarball.
-
- -- Peter Pentchev <roam@ringlet.net> Sun, 17 Oct 2010 00:08:33 +0300
-
-dma (0.0.2010.06.17-5) unstable; urgency=low
-
- * Only use SA_NOCLDWAIT if available to fix the Hurd FTBFS.
-
- -- Peter Pentchev <roam@ringlet.net> Thu, 07 Oct 2010 11:42:23 +0300
-
-dma (0.0.2010.06.17-4) unstable; urgency=low
-
- * Fix an infinite loop in dma-migrate if char is unsigned.
- Closes: #599172
- * Switch to Git and point the Vcs-* fields to Gitorious.
-
- -- Peter Pentchev <roam@ringlet.net> Wed, 06 Oct 2010 17:30:29 +0300
-
-dma (0.0.2010.06.17-3) unstable; urgency=low
-
- * Update the debconf translations:
- - French by Steve Petruzzello; Closes: #587883
- * Bump Standards-Version to 3.9.1 with no changes.
- * Disable deferred delivery by default, as in the upstream version:
- - in the 03-debian-locations patch, comment the DEFER keyword in dma.conf,
- as it is upstream
- - refresh the 11-double-bounce.patch
- - reword the README.Debian section on deferred delivery a bit
- - add a news blurb
-
- -- Peter Pentchev <roam@ringlet.net> Tue, 27 Jul 2010 13:34:27 +0300
-
-dma (0.0.2010.06.17-2) unstable; urgency=low
-
- * Quick on the heels of -1 to fix a momentary lapse of reason on my part:
- in the 03-debian-locations patch, revert part of the 0.0.2010.06.17-1
- change: do not set a un-overrideable default for the deferred delivery!
- Closes: #587593
- * Update the debconf translations:
- - Japanese by Hideki Yamane; Closes: #587543
-
- -- Peter Pentchev <roam@ringlet.net> Wed, 30 Jun 2010 11:59:46 +0300
-
-dma (0.0.2010.06.17-1) unstable; urgency=low
-
- * New upstream version:
- - no longer reports the remote port number; Closes: #544820
- - fixes some queue locking problems; Closes: #582593
- - adapt the rules file to use the GNU Makefile instead of the BSD one
- - drop pmake from Build-Depends
- - remove the 01-debian-build patch, overtaken by upstream changes
- - in the 03-debian-locations patch, make the Debian defaults actual
- defaults for the dma binary, not just in the dma.conf file
- - adapt the 04-debian-setgid patch for the GNU Makefile
- - in the 10-liblockfile patch, change the GNU Makefile, too
- - enhance the 11-double-bounce patch a bit:
- - use dma's own delqueue() function instead of a naive unlink() so
- all the queue files are cleaned up
- - document the Debian default for DBOUNCEPROG in the manual page
- - resurrect the 13-hardening patch, correcting a couple of
- unchecked asprintf(3) and vasprintf(3) invocations
- - the functionality of the 20-parse-recipient patch was implemented
- upstream in a different way, so replace it with a small bugfix
- - remove the 22-openfiles patch, overtaken by upstream changes
- - in the 24-random-message-id patch, change the GNU Makefile, too
- - add the 27-int-size patch to cast a variable to the correct type
- - add the 28-valid-recipient patch to fix parsing recipients out of
- the message body
- - add the 29-double-free patch to fix a double-free error
- - add the 30-ldflags patch to honor LDFLAGS if specified
- - refresh the 09-typos, 17-mailname, 23-dirent-d_type, and
- 25-unsupported-starttls patches
- - teach the dbounce-simple-safecat handler about the M*/Q* spool
- files scheme
- * Bump Standards-Version to 3.9.0 with no changes.
- * Update the copyright file:
- - bring it up to the latest revision of the DEP 5
- - update the upstream copyright notices
- - bump the year on my copyright notice
- * Remove the diffsrc rules target which was intended for my own
- internal use, but has outlived its time.
- * Use dpkg-buildflags from dpkg-dev >= 1.15.7~ to get the default
- values for CFLAGS, CPPFLAGS, and LDFLAGS; no longer rely on
- dpkg-buildpackage to set them by default.
- * Add the dma-migrate utility (in a separate binary package) to convert
- spool files to the new queue format (M* and Q* files for each message)
- * Add a dma-migrate invocation to dma.cron.d
- * Shorten the Vcs-Browser URL.
- * Add the 31-sigalrm-backoff patch to force a delivery attempt on SIGALRM.
- * Properly substitute the debconf-supplied values for DBOUNCEPROG and
- SMARTHOST into dma.conf even if they are empty without generating
- an invalid dma.conf file.
- * Remove the smarthost default; dma does MX lookups now, so it doesn't
- really *need* one anymore.
- * Reword the debconf relayhost question - dma does not really need
- a smarthost anymore.
- * Update the debconf translations:
- - Bulgarian
- - Portuguese by Américo Monteiro
- - German by Helge Kreutzmann; Closes: #586531
- - Russian by Yuri Kozlov; Closes: #586579
- - Czech by Michal Simunek; Closes: #586791
- - Swedish by Martin Bagge; Closes: #586825
- - Spanish by Francisco Javier Cuadrado; Closes: #587088
- * Update the smarthost configuration information in README.Debian.
- * Add the 32-comment-uncomment patch to correct the manual page wording.
- * Add the 33-opportunistic-tls patch to allow remote connections to proceed
- even if the STARTTLS negotiation fails.
- * Fix the 25-unsupported-starttls patch to actually error out if the SSL
- negotiation fails.
- * Forward all the non-Debian-specific patches upstream to Simon Schubert.
- * Add the 34-manpage-defaults patch to properly document what dma will use
- as default values if not specified in the config file instead of what
- the default config file specifies. Closes: #544748
- * Add the 35-delivery-retry patch to try local deliveries a bit more often
- and to randomize the delivery timeout to avoid locking issues.
-
- -- Peter Pentchev <roam@ringlet.net> Mon, 28 Jun 2010 23:26:36 +0300
-
-dma (0.0.2009.07.17-3) unstable; urgency=low
-
- * Really install the files in /etc/dma/ as root/mail/640 and
- change the ownership of the existing files in the postinst script
- when upgrading from older versions. Closes: #544664
- * Install the /usr/bin/mailq and /usr/bin/newaliases symlinks.
- Closes: #558421
- * Switch to the 3.0 (quilt) source format.
- * Update the debconf translations:
- - add German. Closes: #552754
- - add Japanese. Closes: #554515
- - remove a double space and unfuzzy the translations. Closes: #552586
- * Fix a crash when the SMTP server does not support STARTTLS.
- Closes: #547594
- * Always use the user-supplied value from the debconf query for
- the smarthost and the double-bounce program. This may result in
- debconf overriding a manually-edited config file, so add a note to
- dma.conf stating that these values are handled via debconf.
- Closes: #544663
- * Fix a misspelling of dma/dbounceprog as dma/defer in the debconf
- configuration script. Oops.
-
- -- Peter Pentchev <roam@ringlet.net> Sat, 19 Dec 2009 14:35:10 +0200
-
-dma (0.0.2009.07.17-2) unstable; urgency=low
-
- * Allow the spool directory to live on a filesystem that does not
- set the d_type member of the dirent structure, like XFS.
- Closes: #544357
- * Randomize the Message-Id a bit more. Closes: #544475
- * Bump Standards-Version to 3.8.3 with no changes.
- * Only enable the build hardening wrapper if the "hardening" build
- option is specified.
- * Switch the copyright file header from the Wiki to DEP 5.
- * Remove the manual page ".Dx" patch - the groff version in Squeeze
- knows about the .Dx mdoc macro. Add a lintian override for
- the "Unknown DragonFly version" error.
- * Convert the patch file headers to the DEP 3 format.
-
- -- Peter Pentchev <roam@ringlet.net> Tue, 01 Sep 2009 13:36:33 +0300
-
-dma (0.0.2009.07.17-1) unstable; urgency=low
-
- * Initial release
- (Closes: #511410, #533458, #533614, #533890, #534101, #534860)
-
- -- Peter Pentchev <roam@ringlet.net> Tue, 11 Aug 2009 16:08:41 +0300
+++ /dev/null
-Source: dma
-Section: mail
-Priority: optional
-Maintainer: Peter Pentchev <roam@ringlet.net>
-DM-Upload-Allowed: yes
-Build-Depends: debhelper (>= 7.0.50), byacc, dpkg-dev (>= 1.15.7~), flex, hardening-wrapper, libssl-dev, po-debconf
-Standards-Version: 3.9.1
-Homepage: http://devel.ringlet.net/mail/dma/
-Vcs-Git: git://gitorious.org/dma-roam/pkg-debian.git
-Vcs-Browser: http://gitorious.org/dma-roam/pkg-debian
-
-Package: dma
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Provides: mail-transport-agent
-Conflicts: mail-transport-agent
-Replaces: mail-transport-agent
-Recommends: dma-migrate
-Description: lightweight mail transport agent
- The DragonFly Mail Agent is a small Mail Transport Agent (MTA),
- designed for home and office use. It accepts mails from local Mail
- User Agents (MUA) and delivers them either to local mailboxes or
- remote SMTP servers. Remote delivery includes support for features
- such as TLS/SSL and SMTP authentication.
- .
- dma is not intended as a replacement for full-featured MTAs like
- Sendmail, Postfix, or Exim. Consequently, dma does not listen on
- port 25 for incoming connections.
-
-Package: dma-migrate
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Enhances: dma
-Description: migration utility for the DragonFly Mail Agent's spool files
- The dma-migrate utility examines the DragonFly Mail Agent's mail queue
- and performs any conversions from old message file formats to the most
- recent one as needed.
+++ /dev/null
-Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135
-Name: dma
-
-Files: base64.c
-Copyright: Copyright (c) 1995-2001 Kungliga Tekniska Högskolan
- (Royal Institute of Technology, Stockholm, Sweden).
- All rights reserved.
-License: BSD-3
-
-Files: conf.c crypto.c net.c
-Copyright: Copyright (c) 2008 The DragonFly Project. All rights reserved.
- This code is derived from software contributed to The DragonFly Project
- by Matthias Schmidt <matthias@dragonflybsd.org>, University of Marburg,
- Germany.
-License: BSD-3
-
-Files: dfcompat.c
-Copyright: Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- Copyright (c) 1998, M. Warner Losh <imp@freebsd.org> All rights reserved.
-License: BSD-1 BSD-2
-
-Files: dma.8
-Copyright: Copyright (c) 2008 The DragonFly Project. All rights reserved.
-License: BSD-3
-
-Files: dma.c dns.c mail.c spool.c util.c
-Copyright: Copyright (c) 2008 The DragonFly Project. All rights reserved.
- This code is derived from software contributed to The DragonFly Project
- by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
-License: BSD-3
-
-Files: dma.h
-Copyright: Copyright (c) 2008 The DragonFly Project. All rights reserved.
- This code is derived from software contributed to The DragonFly Project
- by Simon 'corecode' Schubert <corecode@fs.ei.tum.de> and
- Matthias Schmidt <matthias@dragonflybsd.org>.
-License: BSD-3
-
-Files: debian/*
-Copyright: Copyright (c) 2009, 2010 Peter Pentchev.
-License: BSD-3
-
-License: BSD-3
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- .
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- 3. Neither the name of The DragonFly Project nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific, prior written permission.
-
-License: BSD-1
- Permission to use, copy, modify, and distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
- .
- 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.
-
-License: BSD-2
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- .
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
+++ /dev/null
-usr/sbin
-usr/share/man/man8
+++ /dev/null
-debian/migrate/dma-migrate usr/sbin
+++ /dev/null
-debian/migrate/dma-migrate.8
+++ /dev/null
-etc/dma
-usr/sbin
-usr/share/lintian/overrides
-usr/share/man/man8
+++ /dev/null
-usr/sbin/dma usr/bin/mailq
-usr/sbin/dma usr/bin/newaliases
-usr/sbin/dma usr/sbin/sendmail
-usr/share/man/man8/dma.8 usr/share/man/man8/mailq.8
-usr/share/man/man8/dma.8 usr/share/man/man8/newaliases.8
-usr/share/man/man8/dma.8 usr/share/man/man8/sendmail.8
+++ /dev/null
-dma: manpage-has-errors-from-man *Unknown DragonFly version*
-dma: non-standard-dir-in-var var/mail/
-dma: non-standard-dir-perm var/spool/dma/ 0770 != 0755
-dma: non-standard-dir-perm var/spool/dma/ 2775 != 0755
-dma: non-standard-file-perm etc/dma/auth.conf 0640 != 0644
-dma: no-upstream-changelog
-dma: setgid-binary usr/sbin/dma 2755 root/mail
-dma: setuid-binary usr/lib/dma-mbox-create 4754 root/mail
+++ /dev/null
-all: dma-migrate
-
-clean:
- rm -f dma-migrate dma-migrate.o
+++ /dev/null
-Change log for dma-migrate, the DragonFly Mail Agent queue migration utility.
-
-0.01 not yet ;)
- - first public release
-
-Comments: Peter Pentchev <roam@ringlet.net>
+++ /dev/null
-.\" Copyright (c) 2010 Peter Pentchev
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd May 11, 2009
-.Dt dma-migrate 8
-.Os
-.Sh NAME
-.Nm dma-migrate
-.Nd convert the DragonFly Mail Agent's queue files
-.Sh SYNOPSIS
-.Nm
-.Op Fl v
-.Op Fl d Ar spooldir
-.Nm
-.Op Fl h | Fl V
-.Sh DESCRIPTION
-The
-.Nm
-utility is used to convert the mail queue files in the
-.Xr dma 8
-spool directory to the latest spool directory format supported by
-the installed version of
-.Xr dma 8 .
-Currently it only handles the conversion from a single file containing
-both message and delivery metadata to the M/Q format.
-.Pp
-The following command-line options are available:
-.Bl -tag -width indent
-.It Fl d
-Specify the location of the
-.Xr dma 8
-spool directory, default
-.Pa /var/spool/dma .
-.It Fl h
-Display usage information and exit.
-.It Fl V
-Display program version information and exit.
-.It Fl v
-Verbose output - display diagnostic messages.
-.El
-.Sh ENVIRONMENT
-The operation of the
-.Nm
-utility is currently not influenced by environment variables.
-.Sh FILES
-The
-.Nm
-utility looks for the
-.Xr dma 8
-mail queue files in the
-.Pa /var/spool/dma
-directory, unless another location is specified by the
-.Fl d
-command-line option.
-.Sh EXIT STATUS
-The
-.Nm
-utility will scan the whole spool directory and attempt to convert all
-suitable files there.
-If there are no files to be converted, or if all the conversions are
-successful, it will complete with an exit code of zero.
-If any conversion errors are encountered, a message will be displayed
-to the standard error stream and
-.Nm
-will exit with an exit code of 1 after attempting to convert the rest of
-the suitable files in the spool directory.
-.Sh SEE ALSO
-.Xr dma 8
-.Sh STANDARDS
-No standards documentation was harmed in the process of creating
-.Nm .
-.Sh BUGS
-Please report any bugs in
-.Nm
-to the author.
-.Sh AUTHOR
-.An Peter Pentchev Aq roam@ringlet.net
+++ /dev/null
-/*-
- * Copyright (c) 2010 Peter Pentchev
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#define _GNU_SOURCE
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-
-#include <dirent.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <regex.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#ifndef __printflike
-#ifdef __GNUC__
-#define __printflike(fmtarg, firstvararg) \
- __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
-#else
-#define __printflike(fmtarg, firstvararg)
-#endif
-#endif
-
-#define DEFAULT_SPOOLDIR "/var/spool/dma"
-
-static int verbose = 0;
-static char copybuf[BUFSIZ];
-
-static int dma_migrate(int, const char *);
-
-static int open_locked(const char *, int, ...);
-static void cleanup_file(int, char *);
-
-static void usage(int);
-static void version(void);
-static void debug(const char *, ...) __printflike(1, 2);
-
-int
-main(int argc, char **argv)
-{
- const char *spooldir;
- int hflag, Vflag, errs, fd, res;
- int ch;
- DIR *d;
- struct dirent *e;
- struct stat sb;
-
- srandom((unsigned long)((time(NULL) ^ getpid()) + ((uintptr_t)argv)));
-
- hflag = Vflag = 0;
- spooldir = DEFAULT_SPOOLDIR;
- while (ch = getopt(argc, argv, "d:hVv"), ch != -1)
- switch (ch) {
- case 'd':
- spooldir = optarg;
- break;
-
- case 'h':
- hflag = 1;
- break;
-
- case 'V':
- Vflag = 1;
- break;
-
- case 'v':
- verbose = 1;
- break;
-
- case '?':
- default:
- usage(1);
- /* NOTREACHED */
- }
- if (Vflag)
- version();
- if (hflag)
- usage(0);
- if (hflag || Vflag)
- exit(0);
-
- argc -= optind;
- argv += optind;
-
- /* Let's roll! */
- if (chdir(spooldir) == -1)
- err(1, "Could not change into spool directory %s", spooldir);
- if (d = opendir("."), d == NULL)
- err(1, "Could not read spool directory %s", spooldir);
- errs = 0;
- while (e = readdir(d), e != NULL) {
- /* Do we care about this entry? */
- debug("Read a directory entry: %s\n", e->d_name);
- if (strncmp(e->d_name, "tmp_", 4) == 0 ||
- e->d_name[0] == 'M' || e->d_name[0] == 'Q' ||
- (e->d_type != DT_REG && e->d_type != DT_UNKNOWN))
- continue;
- if (e->d_type == DT_UNKNOWN)
- if (stat(e->d_name, &sb) == -1 || !S_ISREG(sb.st_mode))
- continue;
- debug("- want to process it\n");
-
- /* Try to lock it - skip it if dma is delivering the message */
- if (fd = open_locked(e->d_name, O_RDONLY|O_NDELAY), fd == -1) {
- debug("- seems to be locked, skipping\n");
- continue;
- }
-
- /* Okay, convert it to the M/Q schema */
- res = dma_migrate(fd, e->d_name);
- close(fd);
- if (res == -1)
- errs++;
- }
- if (errs)
- debug("Finished, %d conversion errors\n", errs);
- else
- debug("Everything seems to be all right\n");
- return (errs && 1);
-}
-
-static int
-dma_migrate(int fd, const char *fname)
-{
- const char *id;
- char *mname, *qname, *tempname, *sender, *recp, *line, *recpline;
- int mfd, qfd, tempfd;
- struct stat sb;
- FILE *fp, *qfp, *mfp;
- size_t sz, len;
- static regex_t *qidreg = NULL;
-
- mfd = tempfd = qfd = -1;
- mname = qname = sender = recp = line = NULL;
- fp = qfp = NULL;
-
- if (fstat(fd, &sb) == -1) {
- warn("Could not fstat(%s)", fname);
- return (-1);
- }
- /*
- * Let's just blithely assume that the queue ID *is* the filename,
- * since that's the way dma did things so far.
- * Well, okay, let's check it.
- */
- if (qidreg == NULL) {
- regex_t *nreg;
-
- if ((nreg = malloc(sizeof(*qidreg))) == NULL) {
- warn("Could not allocate memory for a regex");
- return (-1);
- }
- if (regcomp(nreg, "^[a-fA-F0-9]\\+\\.[a-fA-F0-9]\\+$", 0)
- != 0) {
- warnx("Could not compile a dma queue ID regex");
- free(nreg);
- return (-1);
- }
- qidreg = nreg;
- }
- if (regexec(qidreg, fname, 0, NULL, 0) != 0) {
- warnx("The name '%s' is not a valid dma queue ID", fname);
- return (-1);
- }
- id = fname;
- debug(" - queue ID %s\n", id);
- if (asprintf(&mname, "M%s", id) == -1 ||
- asprintf(&tempname, "tmp_%s", id) == -1 ||
- asprintf(&qname, "Q%s", id) == -1 ||
- mname == NULL || tempname == NULL || qname == NULL)
- goto fail;
-
- /* Create the message placeholder early to avoid races */
- mfd = open_locked(mname, O_CREAT | O_EXCL | O_RDWR, 0600);
- if (mfd == -1) {
- warn("Could not create temporary file %s", mname);
- goto fail;
- }
- if (stat(qname, &sb) != -1 || errno != ENOENT ||
- stat(tempname, &sb) != -1 || errno != ENOENT) {
- warnx("Some of the queue files for %s already exist", fname);
- goto fail;
- }
- debug(" - mfd %d names %s, %s, %s\n", mfd, mname, tempname, qname);
-
- fp = fdopen(fd, "r");
- if (fp == NULL) {
- warn("Could not reopen the descriptor for %s", fname);
- goto fail;
- }
-
- /* Parse the header of the old-format message file */
- /* ...sender... */
- if (getline(&sender, &sz, fp) == -1) {
- warn("Could not read the initial line from %s", fname);
- goto fail;
- }
- sz = strlen(sender);
- while (sz > 0 && (sender[sz - 1] == '\n' || sender[sz - 1] == '\r'))
- sender[--sz] = '\0';
- if (sz == 0) {
- warnx("Empty sender line in %s", fname);
- goto fail;
- }
- debug(" - sender %s\n", sender);
- /* ...recipient(s)... */
- len = strlen(fname);
- recpline = NULL;
- while (1) {
- if (getline(&line, &sz, fp) == -1) {
- warn("Could not read a recipient line from %s", fname);
- goto fail;
- }
- sz = strlen(line);
- while (sz > 0 &&
- (line[sz - 1] == '\n' || line[sz - 1] == '\r'))
- line[--sz] = '\0';
- if (sz == 0) {
- free(line);
- line = NULL;
- break;
- }
- if (recp == NULL &&
- strncmp(line, fname, len) == 0 && line[len] == ' ') {
- recp = line + len + 1;
- recpline = line;
- } else {
- free(line);
- }
- line = NULL;
- }
- if (recp == NULL) {
- warnx("Could not find its own recipient line in %s", fname);
- goto fail;
- }
- /* ..phew, finished with the header. */
-
- tempfd = open_locked(tempname, O_CREAT | O_EXCL | O_RDWR, 0600);
- if (tempfd == -1) {
- warn("Could not create a queue file for %s", fname);
- goto fail;
- }
- qfp = fdopen(tempfd, "w");
- if (qfp == NULL) {
- warn("Could not fdopen(%s) for %s", tempname, fname);
- goto fail;
- }
- mfp = fdopen(mfd, "w");
- if (mfp == NULL) {
- warn("Could not fdopen(%s) for %s", mname, fname);
- goto fail;
- }
- fprintf(qfp, "ID: %s\nSender: %s\nRecipient: %s\n", id, sender, recp);
- fflush(qfp);
- fsync(tempfd);
-
- /* Copy the message file over to mname */
- while ((sz = fread(copybuf, 1, sizeof(copybuf), fp)) > 0)
- if (fwrite(copybuf, 1, sz, mfp) != sz) {
- warn("Could not copy the message from %s to %s",
- fname, mname);
- goto fail;
- }
- if (ferror(fp)) {
- warn("Could not read the full message from %s", fname);
- goto fail;
- }
- fflush(mfp);
- fsync(mfd);
-
- if (rename(tempname, qname) == -1) {
- warn("Could not rename the queue file for %s", fname);
- goto fail;
- }
- qfd = tempfd;
- tempfd = -1;
- if (unlink(fname) == -1) {
- warn("Could not remove the old converted file %s", fname);
- goto fail;
- }
-
- fclose(fp);
- fclose(qfp);
- free(sender);
- free(line);
- free(recpline);
- free(mname);
- free(qname);
- free(tempname);
- return (0);
-
-fail:
- if (fp != NULL)
- fclose(fp);
- if (qfp != NULL)
- fclose(qfp);
- if (sender != NULL)
- free(sender);
- if (line != NULL)
- free(line);
- if (recpline != NULL)
- free(recpline);
- cleanup_file(mfd, mname);
- cleanup_file(qfd, qname);
- cleanup_file(tempfd, tempname);
- return (-1);
-}
-
-static void
-cleanup_file(int fd, char *fname)
-{
- if (fd != -1) {
- close(fd);
- unlink(fname);
- }
- if (fname != NULL)
- free(fname);
-}
-
-static void
-usage(int ferr)
-{
- const char *s =
- "Usage:\tdma-migrate [-hVv] [-d spooldir]\n"
- "\t-d\tspecify the spool directory (" DEFAULT_SPOOLDIR ")\n"
- "\t-h\tdisplay program usage information and exit\n"
- "\t-V\tdisplay program version information and exit\n"
- "\t-v\tverbose operation - display diagnostic messages";
-
- if (ferr)
- errx(1, "%s", s);
- puts(s);
-}
-
-static void
-version(void)
-{
- printf("dma-migrate 0.01 (dma 0.0.2010.06.17)\n");
-}
-
-static void
-debug(const char *fmt, ...)
-{
- va_list v;
-
- if (verbose < 1)
- return;
- va_start(v, fmt);
- vfprintf(stderr, fmt, v);
- va_end(v);
-}
-
-static int
-open_locked(const char *fname, int flags, ...)
-{
- int mode = 0;
-#ifndef O_EXLOCK
- int fd, save_errno;
-#endif
-
- if (flags & O_CREAT) {
- va_list ap;
- va_start(ap, flags);
- mode = va_arg(ap, int);
- va_end(ap);
- }
-
-#ifndef O_EXLOCK
- fd = open(fname, flags, mode);
- if (fd < 0)
- return(fd);
- if (flock(fd, LOCK_EX|((flags & O_NONBLOCK)? LOCK_NB: 0)) < 0) {
- save_errno = errno;
- close(fd);
- errno = save_errno;
- return(-1);
- }
- return(fd);
-#else
- return(open(fname, flags|O_EXLOCK, mode));
-#endif
-}
+++ /dev/null
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Debian build rules for dma, the DragonFly mail agent
-
-DDIR= $(CURDIR)/debian
-D= $(DDIR)/dma
-
-BUILDDEFS= DESTDIR=$D PREFIX=/usr
-
-CFLAGS:= $(shell dpkg-buildflags --get CFLAGS)
-CPPFLAGS:= $(shell dpkg-buildflags --get CPPFLAGS)
-LDFLAGS:= $(shell dpkg-buildflags --get LDFLAGS)
-
-CONFFILES= dma.conf auth.conf
-
-ifneq (,$(filter werror,$(DEB_BUILD_OPTIONS)))
- CFLAGS+= -Werror
-endif
-ifneq (,$(filter nostrip,$(DEB_BUILD_OPTIONS)))
- export STRIPFLAG=
-endif
-ifneq (,$(filter hardening,$(DEB_BUILD_OPTIONS)))
-export DEB_BUILD_HARDENING=1
-else
-export DEB_BUILD_HARDENING=0
-endif
-
-export CFLAGS CPPFLAGS LDFLAGS
-
-override_dh_auto_build:
- $(MAKE) -f Makefile ${BUILDDEFS}
- $(MAKE) -C $(DDIR)/migrate
-
-override_dh_auto_clean:
- $(MAKE) -f Makefile clean
- $(MAKE) -C $(DDIR)/migrate clean
-
-override_dh_auto_install:
- $(MAKE) -f Makefile ${BUILDDEFS} install sendmail-link mailq-link install-spool-dirs install-etc
-
-override_dh_fixperms:
- dh_fixperms -Xusr/sbin/dma -Xusr/lib/dma-mbox-create -Xvar/spool/dma -Xetc/dma
-
-override_dh_installchangelogs:
- dh_installchangelogs -p dma
- dh_installchangelogs -p dma-migrate debian/migrate/NEWS
-
-%:
- dh $@
+++ /dev/null
-3.0 (native)
+++ /dev/null
-compression = "bzip2"
-compression-level = 9
/*
- * Copyright (c) 2010 Simon Schubert <2@0x2c.org>
+ * Copyright (c) 2010-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
static void
-logfail(const char *fmt, ...)
+logfail(int exitcode, const char *fmt, ...)
{
int oerrno = errno;
va_list ap;
else
syslog(LOG_ERR, errno ? "%m" : "unknown error");
- exit(1);
+ exit(exitcode);
}
/*
errno = 0;
gr = getgrnam(DMA_GROUP);
if (!gr)
- logfail("cannot find dma group `%s'", DMA_GROUP);
+ logfail(EX_CONFIG, "cannot find dma group `%s'", DMA_GROUP);
mail_gid = gr->gr_gid;
if (setgid(mail_gid) != 0)
- logfail("cannot set gid to %d (%s)", mail_gid, DMA_GROUP);
+ logfail(EX_NOPERM, "cannot set gid to %d (%s)", mail_gid, DMA_GROUP);
if (getegid() != mail_gid)
- logfail("cannot set gid to %d (%s), still at %d", mail_gid, DMA_GROUP, getegid());
+ logfail(EX_NOPERM, "cannot set gid to %d (%s), still at %d", mail_gid, DMA_GROUP, getegid());
/*
* We take exactly one argument: the username.
*/
if (argc != 2) {
errno = 0;
- logfail("no arguments");
+ logfail(EX_USAGE, "no arguments");
}
user = argv[1];
/* the username may not contain a pathname separator */
if (strchr(user, '/')) {
errno = 0;
- logfail("path separator in username `%s'", user);
+ logfail(EX_DATAERR, "path separator in username `%s'", user);
exit(1);
}
errno = 0;
pw = getpwnam(user);
if (!pw)
- logfail("cannot find user `%s'", user);
+ logfail(EX_NOUSER, "cannot find user `%s'", user);
user_uid = pw->pw_uid;
if (error < 0 || (size_t)error >= sizeof(fn)) {
if (error >= 0) {
errno = 0;
- logfail("mbox path too long");
+ logfail(EX_USAGE, "mbox path too long");
}
- logfail("cannot build mbox path for `%s/%s'", _PATH_MAILDIR, user);
+ logfail(EX_CANTCREAT, "cannot build mbox path for `%s/%s'", _PATH_MAILDIR, user);
}
f = open(fn, O_RDONLY|O_CREAT, 0600);
if (f < 0)
- logfail("cannot open mbox `%s'", fn);
+ logfail(EX_NOINPUT, "cannt open mbox `%s'", fn);
if (fchown(f, user_uid, mail_gid))
- logfail("cannot change owner of mbox `%s'", fn);
+ logfail(EX_OSERR, "cannot change owner of mbox `%s'", fn);
if (fchmod(f, 0620))
- logfail("cannot change permissions of mbox `%s'", fn);
+ logfail(EX_OSERR, "cannot change permissions of mbox `%s'", fn);
/* file should be present with the right owner and permissions */
.\"
+.\" Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
.\" Copyright (c) 2008
.\" The DragonFly Project. All rights reserved.
.\"
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
if (daemonize && daemon(0, 0) != 0) {
syslog(LOG_ERR, "can not daemonize: %m");
- exit(1);
+ exit(EX_OSERR);
}
daemonize = 0;
switch (pid) {
case -1:
syslog(LOG_ERR, "can not fork: %m");
- exit(1);
+ exit(EX_OSERR);
break;
case 0:
break;
case 1:
if (doqueue)
- exit(0);
+ exit(EX_OK);
syslog(LOG_WARNING, "could not lock queue file");
- exit(1);
+ exit(EX_SOFTWARE);
default:
- exit(1);
+ exit(EX_SOFTWARE);
}
dropspool(queue, it);
return (it);
}
syslog(LOG_CRIT, "reached dead code");
- exit(1);
+ exit(EX_SOFTWARE);
}
static void
case 0:
delqueue(it);
syslog(LOG_INFO, "delivery successful");
- exit(0);
+ exit(EX_OK);
case 1:
if (stat(it->queuefn, &st) != 0) {
syslog(LOG_ERR, "lost queue file `%s'", it->queuefn);
- exit(1);
+ exit(EX_SOFTWARE);
}
if (gettimeofday(&now, NULL) == 0 &&
(now.tv_sec - st.st_mtim.tv_sec > MAX_TIMEOUT)) {
pw = getpwnam(DMA_ROOT_USER);
if (pw == NULL) {
if (errno == 0)
- errx(1, "user '%s' not found", DMA_ROOT_USER);
+ errx(EX_CONFIG, "user '%s' not found", DMA_ROOT_USER);
else
- err(1, "cannot drop root privileges");
+ err(EX_OSERR, "cannot drop root privileges");
}
if (setuid(pw->pw_uid) != 0)
- err(1, "cannot drop root privileges");
+ err(EX_OSERR, "cannot drop root privileges");
if (geteuid() == 0 || getuid() == 0)
- errx(1, "cannot drop root privileges");
+ errx(EX_OSERR, "cannot drop root privileges");
}
atexit(deltmp);
argv++; argc--;
showq = 1;
if (argc != 0)
- errx(1, "invalid arguments");
+ errx(EX_USAGE, "invalid arguments");
goto skipopts;
} else if (strcmp(argv[0], "newaliases") == 0) {
logident_base = "dma";
setlogident("%s", logident_base);
if (read_aliases() != 0)
- errx(1, "could not parse aliases file `%s'", config.aliases);
- exit(0);
+ errx(EX_SOFTWARE, "could not parse aliases file `%s'", config.aliases);
+ exit(EX_OK);
}
opterr = 0;
default:
fprintf(stderr, "invalid argument: `-%c'\n", optopt);
- exit(1);
+ exit(EX_USAGE);
}
}
argc -= optind;
opterr = 1;
if (argc != 0 && (showq || doqueue))
- errx(1, "sending mail and queue operations are mutually exclusive");
+ errx(EX_USAGE, "sending mail and queue operations are mutually exclusive");
if (showq + doqueue > 1)
- errx(1, "conflicting queue operations");
+ errx(EX_USAGE, "conflicting queue operations");
skipopts:
if (logident_base == NULL)
if (showq) {
if (load_queue(&queue) < 0)
- errlog(1, "can not load queue");
+ errlog(EX_NOINPUT, "can not load queue");
show_queue(&queue);
return (0);
}
if (doqueue) {
flushqueue_signal();
if (load_queue(&queue) < 0)
- errlog(1, "can not load queue");
+ errlog(EX_NOINPUT, "can not load queue");
run_queue(&queue);
return (0);
}
if (read_aliases() != 0)
- errlog(1, "could not parse aliases file `%s'", config.aliases);
+ errlog(EX_SOFTWARE, "could not parse aliases file `%s'", config.aliases);
if ((sender = set_from(&queue, sender)) == NULL)
- errlog(1, "set_from failed");
+ errlog(EX_SOFTWARE, NULL);
if (newspoolf(&queue) != 0)
- errlog(1, "can not create temp file in `%s'", config.spooldir);
+ errlog(EX_CANTCREAT, "can not create temp file in `%s'", config.spooldir);
setlogident("%s", queue.id);
for (i = 0; i < argc; i++) {
if (add_recp(&queue, argv[i], EXPAND_WILDCARD) != 0)
- errlogx(1, "invalid recipient `%s'", argv[i]);
+ errlogx(EX_DATAERR, "invalid recipient `%s'", argv[i]);
}
if (LIST_EMPTY(&queue.queue) && !recp_from_header)
- errlogx(1, "no recipients");
+ errlogx(EX_NOINPUT, "no recipients");
if (readmail(&queue, nodot, recp_from_header) != 0)
- errlog(1, "can not read mail");
+ errlog(EX_NOINPUT, "can not read mail");
if (LIST_EMPTY(&queue.queue))
- errlogx(1, "no recipients");
+ errlogx(EX_NOINPUT, "no recipients");
if (linkspool(&queue) != 0)
- errlog(1, "can not create spools");
+ errlog(EX_CANTCREAT, "can not create spools");
/* From here on the mail is safe. */
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de> and
+ * by Simon Schubert <2@0x2c.org> and
* Matthias Schmidt <matthias@dragonflybsd.org>.
*
* Redistribution and use in source and binary forms, with or without
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <netdb.h>
+#include <sysexits.h>
#define VERSION "DragonFly Mail Agent " DMA_VERSION
/* aliases_parse.y */
int yyparse(void);
+int yywrap(void);
+int yylex(void);
extern FILE *yyin;
/* conf.c */
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
char servname[10];
struct mx_hostentry *p;
const int count_inc = 10;
- int err;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_protocol = IPPROTO_TCP;
snprintf(servname, sizeof(servname), "%d", port);
- err = getaddrinfo(host, servname, &hints, &res0);
- if (err)
- return (err == EAI_AGAIN ? 1 : -1);
+ switch (getaddrinfo(host, servname, &hints, &res0)) {
+ case 0:
+ break;
+ case EAI_AGAIN:
+ case EAI_NONAME:
+ /*
+ * EAI_NONAME gets returned for:
+ * SMARTHOST set but DNS server not reachable -> defer
+ * SMARTHOST set but DNS server returns "host does not exist"
+ * -> buggy configuration
+ * -> either defer or bounce would be ok -> defer
+ * MX entry was returned by DNS server but name doesn't resolve
+ * -> hopefully transient situation -> defer
+ * all other DNS problems should have been caught earlier
+ * in dns_get_mx_list().
+ */
+ goto out;
+ default:
+ return(-1);
+ }
for (res = res0; res != NULL; res = res->ai_next) {
if (*ps + 1 >= roundup(*ps, count_inc)) {
#!/bin/sh
+tmp=$1
+file=${tmp:=VERSION}
gitver=$(git describe 2>/dev/null | tr - .)
-filever=$(cat VERSION)
+filever=$(cat ${file} 2>/dev/null)
version=${gitver}
: ${version:=$filever}
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
execl(LIBEXEC_PATH "/dma-mbox-create", "dma-mbox-create", name, NULL);
syslog(LOG_ERR, "cannot execute "LIBEXEC_PATH"/dma-mbox-create: %m");
- exit(1);
+ exit(EX_SOFTWARE);
default:
/* parent */
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
/* Don't bounce bounced mails */
if (it->sender[0] == 0) {
syslog(LOG_INFO, "can not bounce a bounce message, discarding");
- exit(1);
+ exit(EX_SOFTWARE);
}
bzero(&bounceq, sizeof(bounceq));
fail:
syslog(LOG_CRIT, "error creating bounce: %m");
delqueue(it);
- exit(1);
+ exit(EX_IOERR);
}
struct parse_state {
ps->pos = 0;
addr = strdup(ps->addr);
if (addr == NULL)
- errlog(1, "strdup failed");
+ errlog(EX_SOFTWARE, NULL);
if (add_recp(queue, addr, EXPAND_WILDCARD) != 0)
- errlogx(1, "invalid recipient `%s'", addr);
+ errlogx(EX_DATAERR, "invalid recipient `%s'", addr);
goto again;
}
if (fgets(line, sizeof(line) - 1, stdin) == NULL)
break;
if (had_last_line)
- errlogx(1, "bad mail input format");
+ errlogx(EX_DATAERR, "bad mail input format:"
+ " from %s (uid %d) (envelope-from %s)",
+ username, useruid, queue->sender);
linelen = strlen(line);
if (linelen == 0 || line[linelen - 1] != '\n') {
/*
if (parse_state.state != NONE) {
if (parse_addrs(&parse_state, line, queue) < 0) {
- errlogx(1, "invalid address in header\n");
+ errlogx(EX_DATAERR, "invalid address in header\n");
/* NOTREACHED */
}
}
strprefixcmp(line, "Bcc:") == 0)) {
parse_state.state = START;
if (parse_addrs(&parse_state, line, queue) < 0) {
- errlogx(1, "invalid address in header\n");
+ errlogx(EX_DATAERR, "invalid address in header\n");
/* NOTREACHED */
}
}
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
spooldir = opendir(config.spooldir);
if (spooldir == NULL)
- err(1, "reading queue");
+ err(EX_NOINPUT, "reading queue");
while ((de = readdir(spooldir)) != NULL) {
queuefn = NULL;
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
.\"
.\" $FreeBSD$
.\"
-.Dd July 17, 1995
+.Dd October 10, 2015
.Dt SHMCTL 2
.Os
.Sh NAME
.It Dv IPC_RMID
Removes the segment from the system.
The removal will not take
-effect until all processes having attached the segment have exited;
-however, once the IPC_RMID operation has taken place, no further
-processes will be allowed to attach the segment.
+effect until all processes having attached the segment have exited.
For the operation
to succeed, the calling process's effective uid must match
.Fa shm_perm.uid
or
.Fa shm_perm.cuid ,
or the process must have superuser privileges.
+If the
+.Va kern.ipc.shm_allow_removed
+.Xr sysctl 3
+variable is set to 0, once the IPC_RMID operation has taken place,
+no further processes will be allowed to attach the segment.
.\" .It Dv SHM_LOCK
.\" Locks the segment in memory. The calling process must have
.\" superuser privileges. Not implemented in FreeBSD.
CFLAGS= -I${DMA_SOURCES} \
-DHAVE_REALLOCF -DHAVE_STRLCPY -DHAVE_GETPROGNAME \
-DCONF_PATH='"/etc/dma"' \
- -DLIBEXEC_PATH='"/usr/libexec"' -DDMA_VERSION='"v0.9+"' \
+ -DLIBEXEC_PATH='"/usr/libexec"' -DDMA_VERSION='"v0.10"' \
-DDMA_ROOT_USER='"mailnull"' \
-DDMA_GROUP='"mail"'
BINGRP= mail
util.c
MAN8= dma.8
CONFS= dma.conf
-CONFSDIR= ${ETCDIR}/dma
+CONFSDIR= ${CONFIGDIR}/dma
YFLAGS+= -i
CLEANFILES= aliases_parse.i
FILES= mailer.conf
.\"
.\" $FreeBSD$
.\"
-.Dd September 15, 2015
+.Dd October 10, 2015
.Dt GNOP 8
.Os
.Sh NAME
utility is used for setting up transparent providers on existing ones.
Its main purpose is testing other GEOM classes, as it allows forced provider
removal and I/O error simulation with a given probability.
-It also gathers the following statistics: number of read requests, number of
-write requests, number of bytes read and number of bytes written.
-In addition, it can be used as a good starting point for implementing new GEOM
+It also gathers statistics on the number of read, write, delete,
+getattr, flush, and other requests, and the number of bytes read and written.
+.Nm
+can also be used as a good starting point for implementing new GEOM
classes.
.Pp
The first argument to
.\"
.\" $FreeBSD$
.\"
-.Dd August 6, 2015
+.Dd October 10, 2015
.Dt MDCONFIG 8
.Os
.Sh NAME
Size of the memory disk.
.Ar Size
is the number of 512 byte sectors unless suffixed with a
-.Cm b , k , m , g ,
+.Cm b , k , m , g , t ,
or
-.Cm t
+.Cm p
which
-denotes byte, kilobyte, megabyte, gigabyte and terabyte respectively.
+denotes byte, kilobyte, megabyte, gigabyte, terabyte and petabyte respectively.
When used without the
.Fl r
option, the
fprintf(stderr, "\t\ttype = {malloc, vnode, swap}\n");
fprintf(stderr, "\t\toption = {cluster, compress, reserve}\n");
fprintf(stderr, "\t\tsize = %%d (512 byte blocks), %%db (B),\n");
- fprintf(stderr, "\t\t %%dk (kB), %%dm (MB), %%dg (GB) or\n");
- fprintf(stderr, "\t\t %%dt (TB)\n");
+ fprintf(stderr, "\t\t %%dk (kB), %%dm (MB), %%dg (GB), \n");
+ fprintf(stderr, "\t\t %%dt (TB), or %%dp (PB)\n");
exit(1);
}
else if (*p == 't' || *p == 'T') {
mdio.md_mediasize <<= 30;
mdio.md_mediasize <<= 10;
+ } else if (*p == 'p' || *p == 'P') {
+ mdio.md_mediasize <<= 30;
+ mdio.md_mediasize <<= 20;
} else
errx(1, "unknown suffix on -s argument");
break;
If the hypervisor advertises the appreciate features, the
.Nm
driver supports TCP/UDP checksum offload for both transmit and receive,
-TCP segmentation offload (TSO), TCP large receive offload (LRO), and
-hardware VLAN tag stripping/insertion features, as well as a multicast
-hash filter, as well as Jumbo Frames (up to 9216 bytes), which can be
+TCP segmentation offload (TSO), TCP large receive offload (LRO),
+hardware VLAN tag stripping/insertion features, a multicast hash filter,
+as well as Jumbo Frames (up to 9216 bytes), which can be
configured via the interface MTU setting.
Selecting an MTU larger than 1500 bytes with the
.Xr ifconfig 8
bsd.README \
bsd.arch.inc.mk \
bsd.compiler.mk \
+ bsd.confs.mk \
bsd.cpu.mk \
bsd.crunchgen.mk \
bsd.dep.mk \
${group}OWN?= ${SHAREOWN}
${group}GRP?= ${SHAREGRP}
${group}MODE?= ${CONFMODE}
-${group}DIR?= ${ETCDIR}/
+${group}DIR?= ${CONFIGDIR}/
STAGE_SETS+= ${group}
STAGE_DIR.${group}= ${STAGE_OBJTOP}${${group}DIR}
STAGE_SYMLINKS_DIR.${group}= ${STAGE_OBJTOP}
NLSMODE?= ${NOBINMODE}
INCLUDEDIR?= /usr/include
-ETCDIR?= /etc
+CONFIGDIR?= /etc
#
# install(1) parameters.
static void peer_close_upcall(struct c4iw_ep *ep);
static void peer_abort_upcall(struct c4iw_ep *ep);
static void connect_reply_upcall(struct c4iw_ep *ep, int status);
-static void connect_request_upcall(struct c4iw_ep *ep);
+static int connect_request_upcall(struct c4iw_ep *ep);
static void established_upcall(struct c4iw_ep *ep);
static void process_mpa_reply(struct c4iw_ep *ep);
static void process_mpa_request(struct c4iw_ep *ep);
int err;
CTR2(KTR_IW_CXGBE, "%s:abB %p", __func__, ep);
- close_complete_upcall(ep, -ECONNRESET);
state_set(&ep->com, ABORTING);
abort_socket(ep);
err = close_socket(&ep->com, 0);
CTR2(KTR_IW_CXGBE, "%s:cruE %p", __func__, ep);
}
-static void connect_request_upcall(struct c4iw_ep *ep)
+static int connect_request_upcall(struct c4iw_ep *ep)
{
struct iw_cm_event event;
+ int ret;
CTR3(KTR_IW_CXGBE, "%s: ep %p, mpa_v1 %d", __func__, ep,
ep->tried_with_mpa_v1);
}
c4iw_get_ep(&ep->com);
- ep->parent_ep->com.cm_id->event_handler(ep->parent_ep->com.cm_id,
+ ret = ep->parent_ep->com.cm_id->event_handler(ep->parent_ep->com.cm_id,
&event);
+ if(ret)
+ c4iw_put_ep(&ep->com);
+
set_bit(CONNREQ_UPCALL, &ep->com.history);
c4iw_put_ep(&ep->parent_ep->com);
+ return ret;
}
static void established_upcall(struct c4iw_ep *ep)
/* drive upcall */
mutex_lock(&ep->parent_ep->com.mutex);
- if (ep->parent_ep->com.state != DEAD)
- connect_request_upcall(ep);
- else
+ if (ep->parent_ep->com.state != DEAD) {
+ if(connect_request_upcall(ep)) {
+ abort_connection(ep);
+ }
+ }else
abort_connection(ep);
mutex_unlock(&ep->parent_ep->com.mutex);
}
CTR2(KTR_IW_CXGBE, "%s:ced1 %p", __func__, ep);
fatal = 1;
- close_complete_upcall(ep, -EIO);
+ close_complete_upcall(ep, -ECONNRESET);
ep->com.state = DEAD;
}
CTR3(KTR_IW_CXGBE, "%s:ced2 %p %s", __func__, ep,
if (obj->gtt_space == NULL)
return 0;
- if (obj->pin_count) {
- DRM_ERROR("Attempting to unbind pinned buffer\n");
+ if (obj->pin_count)
return -EINVAL;
- }
ret = i915_gem_object_finish_gpu(obj);
if (ret == -ERESTARTSYS || ret == -EINTR)
struct icee_softc {
device_t sc_dev; /* Myself */
- struct sx sc_lock; /* basically a perimeter lock */
+ device_t sc_busdev; /* Parent bus */
struct cdev *cdev; /* user interface */
int addr;
int size; /* How big am I? */
int wr_sz; /* What's the write page size */
};
-#define ICEE_LOCK(_sc) sx_xlock(&(_sc)->sc_lock)
-#define ICEE_UNLOCK(_sc) sx_xunlock(&(_sc)->sc_lock)
-#define ICEE_LOCK_INIT(_sc) sx_init(&_sc->sc_lock, "icee")
-#define ICEE_LOCK_DESTROY(_sc) sx_destroy(&_sc->sc_lock);
-#define ICEE_ASSERT_LOCKED(_sc) sx_assert(&_sc->sc_lock, SA_XLOCKED);
-#define ICEE_ASSERT_UNLOCKED(_sc) sx_assert(&_sc->sc_lock, SA_UNLOCKED);
#define CDEV2SOFTC(dev) ((dev)->si_drv1)
/* cdev routines */
int dunit, err;
sc->sc_dev = dev;
+ sc->sc_busdev = device_get_parent(sc->sc_dev);
sc->addr = iicbus_get_addr(dev);
err = 0;
dname = device_get_name(dev);
goto out;
}
sc->cdev->si_drv1 = sc;
- ICEE_LOCK_INIT(sc);
out:
return (err);
}
return (EIO);
if (sc->type != 8 && sc->type != 16)
return (EINVAL);
- ICEE_LOCK(sc);
+ error = iicbus_request_bus(sc->sc_busdev, sc->sc_dev, IIC_INTRWAIT);
+ if (error!= 0)
+ return (iic2errno(error));
slave = error = 0;
while (uio->uio_resid > 0) {
if (uio->uio_offset >= sc->size)
for (i = 0; i < 2; i++)
msgs[i].slave = slave;
error = iicbus_transfer(sc->sc_dev, msgs, 2);
- if (error)
+ if (error) {
+ error = iic2errno(error);
break;
+ }
error = uiomove(data, len, uio);
if (error)
break;
}
- ICEE_UNLOCK(sc);
+ iicbus_release_bus(sc->sc_busdev, sc->sc_dev);
return (error);
}
return (EIO);
if (sc->type != 8 && sc->type != 16)
return (EINVAL);
- ICEE_LOCK(sc);
+
+ error = iicbus_request_bus(sc->sc_busdev, sc->sc_dev, IIC_INTRWAIT);
+ if (error!= 0)
+ return (iic2errno(error));
slave = error = 0;
while (uio->uio_resid > 0) {
if (uio->uio_offset >= sc->size)
if (error)
break;
error = iicbus_transfer(sc->sc_dev, wr, 1);
- if (error)
+ if (error) {
+ error = iic2errno(error);
break;
+ }
/* Read after write to wait for write-done. */
waitlimit = 10000;
rd[0].slave = slave;
do {
error = iicbus_transfer(sc->sc_dev, rd, 1);
} while (waitlimit-- > 0 && error != 0);
- if (error)
+ if (error) {
+ error = iic2errno(error);
break;
+ }
}
- ICEE_UNLOCK(sc);
+ iicbus_release_bus(sc->sc_busdev, sc->sc_dev);
return error;
}
#define IIC_NOINTR 0
#define IIC_WAIT 0x1
#define IIC_INTR 0x2
+#define IIC_INTRWAIT (IIC_INTR | IIC_WAIT)
/*
* i2c modes
static void wpi_reset_rx_ring(struct wpi_softc *);
static void wpi_free_rx_ring(struct wpi_softc *);
static int wpi_alloc_tx_ring(struct wpi_softc *, struct wpi_tx_ring *,
- int);
+ uint8_t);
static void wpi_update_tx_ring(struct wpi_softc *, struct wpi_tx_ring *);
static void wpi_update_tx_ring_ps(struct wpi_softc *,
struct wpi_tx_ring *);
static int wpi_read_eeprom(struct wpi_softc *,
uint8_t macaddr[IEEE80211_ADDR_LEN]);
static uint32_t wpi_eeprom_channel_flags(struct wpi_eeprom_chan *);
-static void wpi_read_eeprom_band(struct wpi_softc *, int);
-static int wpi_read_eeprom_channels(struct wpi_softc *, int);
+static void wpi_read_eeprom_band(struct wpi_softc *, uint8_t);
+static int wpi_read_eeprom_channels(struct wpi_softc *, uint8_t);
static struct wpi_eeprom_chan *wpi_find_eeprom_channel(struct wpi_softc *,
struct ieee80211_channel *);
static int wpi_setregdomain(struct ieee80211com *,
struct ieee80211_regdomain *, int,
struct ieee80211_channel[]);
-static int wpi_read_eeprom_group(struct wpi_softc *, int);
-static int wpi_add_node_entry_adhoc(struct wpi_softc *);
+static int wpi_read_eeprom_group(struct wpi_softc *, uint8_t);
static struct ieee80211_node *wpi_node_alloc(struct ieee80211vap *,
const uint8_t mac[IEEE80211_ADDR_LEN]);
static void wpi_node_free(struct ieee80211_node *);
-static void wpi_recv_mgmt(struct ieee80211_node *, struct mbuf *, int,
+static void wpi_ibss_recv_mgmt(struct ieee80211_node *, struct mbuf *, int,
const struct ieee80211_rx_stats *,
int, int);
static void wpi_restore_node(void *, struct ieee80211_node *);
static void wpi_scan_timeout(void *);
static void wpi_tx_timeout(void *);
static void wpi_parent(struct ieee80211com *);
-static int wpi_cmd(struct wpi_softc *, int, const void *, size_t, int);
+static int wpi_cmd(struct wpi_softc *, uint8_t, const void *, uint16_t,
+ int);
static int wpi_mrr_setup(struct wpi_softc *);
static int wpi_add_node(struct wpi_softc *, struct ieee80211_node *);
static int wpi_add_broadcast_node(struct wpi_softc *, int);
static int wpi_key_delete(struct ieee80211vap *,
const struct ieee80211_key *);
static int wpi_post_alive(struct wpi_softc *);
-static int wpi_load_bootcode(struct wpi_softc *, const uint8_t *, int);
+static int wpi_load_bootcode(struct wpi_softc *, const uint8_t *,
+ uint32_t);
static int wpi_load_firmware(struct wpi_softc *);
static int wpi_read_firmware(struct wpi_softc *);
static void wpi_unload_firmware(struct wpi_softc *);
{
struct wpi_softc *sc = (struct wpi_softc *)device_get_softc(dev);
struct ieee80211com *ic;
- int i, error, rid;
+ uint8_t i;
+ int error, rid;
#ifdef WPI_DEBUG
int supportsa = 1;
const struct wpi_ident *ident;
sc->sc_st = rman_get_bustag(sc->mem);
sc->sc_sh = rman_get_bushandle(sc->mem);
- i = 1;
- rid = 0;
- if (pci_alloc_msi(dev, &i) == 0)
+ rid = 1;
+ if (pci_alloc_msi(dev, &rid) == 0)
rid = 1;
+ else
+ rid = 0;
/* Install interrupt handler. */
sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE |
(rid != 0 ? 0 : RF_SHAREABLE));
}
/* Allocate TX rings - 4 for QoS purposes, 1 for commands. */
- for (i = 0; i < WPI_NTXQUEUES; i++) {
+ for (i = 0; i < WPI_DRV_NTXQUEUES; i++) {
if ((error = wpi_alloc_tx_ring(sc, &sc->txq[i], i)) != 0) {
device_printf(dev,
"could not allocate TX ring %d, error %d\n", i,
/* Override with driver methods. */
vap->iv_key_set = wpi_key_set;
vap->iv_key_delete = wpi_key_delete;
- wvp->wv_recv_mgmt = vap->iv_recv_mgmt;
- vap->iv_recv_mgmt = wpi_recv_mgmt;
+ if (opmode == IEEE80211_M_IBSS) {
+ wvp->wv_recv_mgmt = vap->iv_recv_mgmt;
+ vap->iv_recv_mgmt = wpi_ibss_recv_mgmt;
+ }
wvp->wv_newstate = vap->iv_newstate;
vap->iv_newstate = wpi_newstate;
vap->iv_update_beacon = wpi_update_beacon;
{
struct wpi_softc *sc = device_get_softc(dev);
struct ieee80211com *ic = &sc->sc_ic;
- int qid;
+ uint8_t qid;
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
if (sc->txq[0].data_dmat) {
/* Free DMA resources. */
- for (qid = 0; qid < WPI_NTXQUEUES; qid++)
+ for (qid = 0; qid < WPI_DRV_NTXQUEUES; qid++)
wpi_free_tx_ring(sc, &sc->txq[qid]);
wpi_free_rx_ring(sc);
static __inline void
wpi_prph_write_region_4(struct wpi_softc *sc, uint32_t addr,
- const uint32_t *data, int count)
+ const uint32_t *data, uint32_t count)
{
- for (; count > 0; count--, data++, addr += 4)
+ for (; count != 0; count--, data++, addr += 4)
wpi_prph_write(sc, addr, *data);
}
return;
}
+ WPI_TXQ_LOCK(sc);
WPI_SETBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_MAC_ACCESS_REQ);
if (WPI_READ(sc, WPI_GP_CNTRL) & WPI_GP_CNTRL_SLEEP) {
DPRINTF(sc, WPI_DEBUG_PWRSAVE, "%s: wakeup request\n",
wpi_update_rx_ring(sc);
WPI_CLRBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_MAC_ACCESS_REQ);
}
+ WPI_TXQ_UNLOCK(sc);
}
static void
}
static int
-wpi_alloc_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring, int qid)
+wpi_alloc_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring, uint8_t qid)
{
bus_addr_t paddr;
bus_size_t size;
bus_dmamap_sync(sc->shared_dma.tag, sc->shared_dma.map,
BUS_DMASYNC_PREWRITE);
- /*
- * We only use rings 0 through 4 (4 EDCA + cmd) so there is no need
- * to allocate commands space for other rings.
- * XXX Do we really need to allocate descriptors for other rings?
- */
- if (qid > WPI_CMD_QUEUE_NUM) {
- DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
- return 0;
- }
-
size = WPI_TX_RING_COUNT * sizeof (struct wpi_tx_cmd);
error = wpi_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd,
size, 4);
if ((error = res) != 0) \
goto fail; \
} while (0)
- int error, i;
+ uint8_t i;
+ int error;
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
}
static void
-wpi_read_eeprom_band(struct wpi_softc *sc, int n)
+wpi_read_eeprom_band(struct wpi_softc *sc, uint8_t n)
{
struct ieee80211com *ic = &sc->sc_ic;
struct wpi_eeprom_chan *channels = sc->eeprom_channels[n];
const struct wpi_chan_band *band = &wpi_bands[n];
struct ieee80211_channel *c;
- uint8_t chan;
- int i, nflags;
+ uint32_t nflags;
+ uint8_t chan, i;
for (i = 0; i < band->nchan; i++) {
if (!(channels[i].flags & WPI_EEPROM_CHAN_VALID)) {
* band and update net80211 with what we find.
*/
static int
-wpi_read_eeprom_channels(struct wpi_softc *sc, int n)
+wpi_read_eeprom_channels(struct wpi_softc *sc, uint8_t n)
{
struct ieee80211com *ic = &sc->sc_ic;
const struct wpi_chan_band *band = &wpi_bands[n];
}
static int
-wpi_read_eeprom_group(struct wpi_softc *sc, int n)
+wpi_read_eeprom_group(struct wpi_softc *sc, uint8_t n)
{
struct wpi_power_group *group = &sc->groups[n];
struct wpi_eeprom_group rgroup;
return 0;
}
-static int
+static __inline uint8_t
wpi_add_node_entry_adhoc(struct wpi_softc *sc)
{
- int newid = WPI_ID_IBSS_MIN;
+ uint8_t newid = WPI_ID_IBSS_MIN;
for (; newid <= WPI_ID_IBSS_MAX; newid++) {
if ((sc->nodesmsk & (1 << newid)) == 0) {
return WPI_ID_UNDEFINED;
}
-static __inline int
+static __inline uint8_t
wpi_add_node_entry_sta(struct wpi_softc *sc)
{
sc->nodesmsk |= 1 << WPI_ID_BSS;
}
static void
-wpi_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, int subtype,
+wpi_ibss_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, int subtype,
const struct ieee80211_rx_stats *rxs,
int rssi, int nf)
{
wvp->wv_recv_mgmt(ni, m, subtype, rxs, rssi, nf);
- if (vap->iv_opmode == IEEE80211_M_IBSS &&
- vap->iv_state == IEEE80211_S_RUN &&
+ if (vap->iv_state == IEEE80211_S_RUN &&
(subtype == IEEE80211_FC0_SUBTYPE_BEACON ||
subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)) {
ni_tstamp = le64toh(ni->ni_tstamp.tsf);
struct wpi_tx_ring *ring;
struct mbuf *m1;
bus_dma_segment_t *seg, segs[WPI_MAX_SCATTER];
- int error, i, hdrlen, nsegs, totlen, pad;
+ uint8_t pad;
+ uint16_t hdrlen;
+ int error, i, nsegs, totlen;
WPI_TXQ_LOCK(sc);
if (__predict_false(sc->sc_running == 0)) {
/* wpi_stop() was called */
error = ENETDOWN;
- goto fail;
+ goto end;
}
wh = mtod(buf->m, struct ieee80211_frame *);
if (__predict_false(totlen < sizeof(struct ieee80211_frame_min))) {
error = EINVAL;
- goto fail;
+ goto end;
}
if (hdrlen & 3) {
if (error != 0 && error != EFBIG) {
device_printf(sc->sc_dev,
"%s: can't map mbuf (error %d)\n", __func__, error);
- goto fail;
+ goto end;
}
if (error != 0) {
/* Too many DMA segments, linearize mbuf. */
device_printf(sc->sc_dev,
"%s: could not defrag mbuf\n", __func__);
error = ENOBUFS;
- goto fail;
+ goto end;
}
buf->m = m1;
error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map,
buf->m, segs, &nsegs, BUS_DMA_NOWAIT);
if (__predict_false(error != 0)) {
+ /* XXX fix this (applicable to the iwn(4) too) */
+ /*
+ * NB: Do not return error;
+ * original mbuf does not exist anymore.
+ */
device_printf(sc->sc_dev,
"%s: can't map mbuf (error %d)\n", __func__,
error);
- goto fail;
+ if (ring->qid < WPI_CMD_QUEUE_NUM) {
+ if_inc_counter(buf->ni->ni_vap->iv_ifp,
+ IFCOUNTER_OERRORS, 1);
+ ieee80211_free_node(buf->ni);
+ }
+ m_freem(buf->m);
+ error = 0;
+ goto end;
}
}
WPI_TXQ_STATE_UNLOCK(sc);
}
- DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
-
- WPI_TXQ_UNLOCK(sc);
-
- return 0;
-
-fail: m_freem(buf->m);
-
- DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
+end: DPRINTF(sc, WPI_DEBUG_TRACE, error ? TRACE_STR_END_ERR : TRACE_STR_END,
+ __func__);
WPI_TXQ_UNLOCK(sc);
- return error;
+ return (error);
}
/*
struct wpi_buf tx_data;
struct wpi_cmd_data *tx = (struct wpi_cmd_data *)&tx_data.data;
uint32_t flags;
- uint16_t qos;
- uint8_t tid, type;
- int ac, error, swcrypt, rate, ismcast, totlen;
+ uint16_t ac, qos;
+ uint8_t tid, type, rate;
+ int swcrypt, ismcast, totlen;
wh = mtod(m, struct ieee80211_frame *);
type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
/* Retrieve key for TX. */
k = ieee80211_crypto_encap(ni, m);
- if (k == NULL) {
- error = ENOBUFS;
- goto fail;
- }
+ if (k == NULL)
+ return (ENOBUFS);
+
swcrypt = k->wk_flags & IEEE80211_KEY_SWCRYPT;
/* 802.11 header may have moved. */
if (wn->id == WPI_ID_UNDEFINED) {
device_printf(sc->sc_dev,
"%s: undefined node id\n", __func__);
- error = EINVAL;
- goto fail;
+ return (EINVAL);
}
tx->id = wn->id;
tx_data.ac = ac;
return wpi_cmd2(sc, &tx_data);
-
-fail: m_freem(m);
- return error;
}
static int
struct wpi_buf tx_data;
struct wpi_cmd_data *tx = (struct wpi_cmd_data *)&tx_data.data;
uint32_t flags;
- uint8_t type;
- int ac, rate, swcrypt, totlen;
+ uint8_t ac, type, rate;
+ int swcrypt, totlen;
wh = mtod(m, struct ieee80211_frame *);
type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
if (params->ibp_flags & IEEE80211_BPF_CRYPTO) {
/* Retrieve key for TX. */
k = ieee80211_crypto_encap(ni, m);
- if (k == NULL) {
- m_freem(m);
- return ENOBUFS;
- }
+ if (k == NULL)
+ return (ENOBUFS);
+
swcrypt = k->wk_flags & IEEE80211_KEY_SWCRYPT;
/* 802.11 header may have moved. */
}
static __inline int
-wpi_tx_ring_is_full(struct wpi_softc *sc, int ac)
+wpi_tx_ring_is_full(struct wpi_softc *sc, uint16_t ac)
{
struct wpi_tx_ring *ring = &sc->txq[ac];
int retval;
return retval;
}
-static __inline void
-wpi_handle_tx_failure(struct ieee80211_node *ni)
-{
- /* NB: m is reclaimed on tx failure */
- if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
- ieee80211_free_node(ni);
-}
-
static int
wpi_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
const struct ieee80211_bpf_params *params)
{
struct ieee80211com *ic = ni->ni_ic;
struct wpi_softc *sc = ic->ic_softc;
- int ac, error = 0;
+ uint16_t ac;
+ int error = 0;
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
WPI_TX_LOCK(sc);
if (sc->sc_running == 0 || wpi_tx_ring_is_full(sc, ac)) {
- m_freem(m);
error = sc->sc_running ? ENOBUFS : ENETDOWN;
goto unlock;
}
unlock: WPI_TX_UNLOCK(sc);
if (error != 0) {
- wpi_handle_tx_failure(ni);
+ m_freem(m);
+ ieee80211_free_node(ni);
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
return error;
{
struct wpi_softc *sc = ic->ic_softc;
struct ieee80211_node *ni;
- int ac, error;
+ uint16_t ac;
+ int error;
WPI_TX_LOCK(sc);
DPRINTF(sc, WPI_DEBUG_XMIT, "%s: called\n", __func__);
error = 0;
ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
if (wpi_tx_data(sc, m, ni) != 0) {
- wpi_handle_tx_failure(ni);
+ if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
+ ieee80211_free_node(ni);
+ m_freem(m);
}
DPRINTF(sc, WPI_DEBUG_XMIT, "%s: done\n", __func__);
* Send a command to the firmware.
*/
static int
-wpi_cmd(struct wpi_softc *sc, int code, const void *buf, size_t size,
+wpi_cmd(struct wpi_softc *sc, uint8_t code, const void *buf, uint16_t size,
int async)
{
struct wpi_tx_ring *ring = &sc->txq[WPI_CMD_QUEUE_NUM];
struct wpi_tx_cmd *cmd;
struct mbuf *m;
bus_addr_t paddr;
- int totlen, error;
+ uint16_t totlen;
+ int error;
WPI_TXQ_LOCK(sc);
if (async == 0)
WPI_LOCK_ASSERT(sc);
- DPRINTF(sc, WPI_DEBUG_CMD, "%s: cmd %s size %zu async %d\n",
+ DPRINTF(sc, WPI_DEBUG_CMD, "%s: cmd %s size %u async %d\n",
__func__, wpi_cmd_str(code), size, async);
desc = &ring->desc[ring->cur];
{
struct ieee80211com *ic = &sc->sc_ic;
struct wpi_mrr_setup mrr;
- int i, error;
+ uint8_t i;
+ int error;
/* CCK rates (not used with 802.11a). */
for (i = WPI_RIDX_CCK1; i <= WPI_RIDX_CCK11; i++) {
{
struct wpi_pmgt_cmd cmd;
const struct wpi_pmgt *pmgt;
- uint32_t max, skip_dtim;
- uint32_t reg;
+ uint32_t max, reg;
+ uint8_t skip_dtim;
int i;
DPRINTF(sc, WPI_DEBUG_PWRSAVE,
{
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
- int bintval = 0;
+ uint16_t bintval = 0;
/* bintval is in TU (1.024mS) */
if (vap != NULL)
struct wpi_scan_chan *chan;
struct ieee80211_frame *wh;
struct ieee80211_rateset *rs;
- uint16_t dwell_active, dwell_passive;
- uint8_t *buf, *frm;
- int bgscan, bintval, buflen, error, i, nssid;
+ uint16_t bintval, buflen, dwell_active, dwell_passive;
+ uint8_t *buf, *frm, i, nssid;
+ int bgscan, error;
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
device_printf(sc->sc_dev,
"%s: could not update beacon frame, error %d", __func__,
error);
+ m_freem(bcn->m);
}
/* Restore mbuf. */
* the NIC internal memory (no DMA transfer).
*/
static int
-wpi_load_bootcode(struct wpi_softc *sc, const uint8_t *ucode, int size)
+wpi_load_bootcode(struct wpi_softc *sc, const uint8_t *ucode, uint32_t size)
{
int error, ntries;
static int
wpi_hw_init(struct wpi_softc *sc)
{
- int chnl, ntries, error;
+ uint8_t chnl;
+ int ntries, error;
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
static void
wpi_hw_stop(struct wpi_softc *sc)
{
- int chnl, qid, ntries;
+ uint8_t chnl, qid;
+ int ntries;
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
wpi_reset_rx_ring(sc);
/* Reset all TX rings. */
- for (qid = 0; qid < WPI_NTXQUEUES; qid++)
+ for (qid = 0; qid < WPI_DRV_NTXQUEUES; qid++)
wpi_reset_tx_ring(sc, &sc->txq[qid]);
if (wpi_nic_lock(sc) == 0) {
uint32_t rxtimeout;
uint32_t txtimeout;
uint32_t intval[5];
- int skip_dtim;
+ uint8_t skip_dtim;
} wpi_pmgt[WPI_NDTIMRANGES][WPI_NPOWERLEVELS] = {
/* DTIM <= 10 */
{
struct wpi_tx_cmd *cmd;
struct wpi_tx_data data[WPI_TX_RING_COUNT];
bus_dma_tag_t data_dmat;
- int qid;
- int queued;
- int cur;
- int update;
+ uint8_t qid;
+ uint8_t cur;
+ int16_t queued;
+ int update:1;
};
struct wpi_rx_data {
uint32_t *desc;
struct wpi_rx_data data[WPI_RX_RING_COUNT];
bus_dma_tag_t data_dmat;
- int cur;
+ uint16_t cur;
int update;
};
struct ieee80211_node *ni;
struct mbuf *m;
size_t size;
- int code;
- int ac;
+ uint8_t code;
+ uint16_t ac;
};
struct wpi_vap {
struct wpi_buf wv_bcbuf;
struct mtx wv_mtx;
- uint32_t wv_gtk;
+ uint8_t wv_gtk;
#define WPI_VAP_KEY(kid) (1 << kid)
int (*wv_newstate)(struct ieee80211vap *,
struct wpi_dma_info shared_dma;
struct wpi_shared *shared;
- struct wpi_tx_ring txq[WPI_NTXQUEUES];
+ struct wpi_tx_ring txq[WPI_DRV_NTXQUEUES];
struct mtx txq_mtx;
struct mtx txq_state_mtx;
sc->sc_wrotebytes += bp->bio_length;
failprob = sc->sc_wfailprob;
break;
+ case BIO_DELETE:
+ sc->sc_deletes++;
+ break;
+ case BIO_GETATTR:
+ sc->sc_getattrs++;
+ break;
+ case BIO_FLUSH:
+ sc->sc_flushes++;
+ break;
+ case BIO_CMD0:
+ sc->sc_cmd0s++;
+ break;
+ case BIO_CMD1:
+ sc->sc_cmd1s++;
+ break;
+ case BIO_CMD2:
+ sc->sc_cmd2s++;
+ break;
}
mtx_unlock(&sc->sc_lock);
if (failprob > 0) {
sc->sc_wfailprob = wfailprob;
sc->sc_reads = 0;
sc->sc_writes = 0;
+ sc->sc_deletes = 0;
+ sc->sc_getattrs = 0;
+ sc->sc_flushes = 0;
+ sc->sc_cmd0s = 0;
+ sc->sc_cmd1s = 0;
+ sc->sc_cmd2s = 0;
sc->sc_readbytes = 0;
sc->sc_wrotebytes = 0;
mtx_init(&sc->sc_lock, "gnop lock", NULL, MTX_DEF);
sc = pp->geom->softc;
sc->sc_reads = 0;
sc->sc_writes = 0;
+ sc->sc_deletes = 0;
+ sc->sc_getattrs = 0;
+ sc->sc_flushes = 0;
+ sc->sc_cmd0s = 0;
+ sc->sc_cmd1s = 0;
+ sc->sc_cmd2s = 0;
sc->sc_readbytes = 0;
sc->sc_wrotebytes = 0;
}
sbuf_printf(sb, "%s<Error>%d</Error>\n", indent, sc->sc_error);
sbuf_printf(sb, "%s<Reads>%ju</Reads>\n", indent, sc->sc_reads);
sbuf_printf(sb, "%s<Writes>%ju</Writes>\n", indent, sc->sc_writes);
+ sbuf_printf(sb, "%s<Deletes>%ju</Deletes>\n", indent, sc->sc_deletes);
+ sbuf_printf(sb, "%s<Getattrs>%ju</Getattrs>\n", indent, sc->sc_getattrs);
+ sbuf_printf(sb, "%s<Flushes>%ju</Flushes>\n", indent, sc->sc_flushes);
+ sbuf_printf(sb, "%s<Cmd0s>%ju</Cmd0s>\n", indent, sc->sc_cmd0s);
+ sbuf_printf(sb, "%s<Cmd1s>%ju</Cmd1s>\n", indent, sc->sc_cmd1s);
+ sbuf_printf(sb, "%s<Cmd2s>%ju</Cmd2s>\n", indent, sc->sc_cmd2s);
sbuf_printf(sb, "%s<ReadBytes>%ju</ReadBytes>\n", indent,
sc->sc_readbytes);
sbuf_printf(sb, "%s<WroteBytes>%ju</WroteBytes>\n", indent,
u_int sc_wfailprob;
uintmax_t sc_reads;
uintmax_t sc_writes;
+ uintmax_t sc_deletes;
+ uintmax_t sc_getattrs;
+ uintmax_t sc_flushes;
+ uintmax_t sc_cmd0s;
+ uintmax_t sc_cmd1s;
+ uintmax_t sc_cmd2s;
uintmax_t sc_readbytes;
uintmax_t sc_wrotebytes;
struct mtx sc_lock;
newmod = module_lookupbyname(data->name);
if (newmod != NULL) {
MOD_XUNLOCK;
- printf("module_register: module %s already exists!\n",
- data->name);
+ printf("%s: cannot register %s from %s; already loaded from %s\n",
+ __func__, data->name, container->filename, newmod->file->filename);
return (EEXIST);
}
namelen = strlen(data->name) + 1;
newmod = malloc(sizeof(struct module) + namelen, M_MODULE, M_WAITOK);
- if (newmod == NULL) {
- MOD_XUNLOCK;
- return (ENOMEM);
- }
newmod->refs = 1;
newmod->id = nextid++;
newmod->name = (char *)(newmod + 1);
};
static int shm_use_phys;
-static int shm_allow_removed;
+static int shm_allow_removed = 1;
SYSCTL_ULONG(_kern_ipc, OID_AUTO, shmmax, CTLFLAG_RWTUN, &shminfo.shmmax, 0,
"Maximum shared memory segment size");
#
# bootargs=console=ttyS0,115200 root=31:02 rootfstype=jffs2 init=/sbin/init mtdparts=ath-nor0:256k(u-boot),64k(u-boot-env),6336k(rootfs),1408k(uImage),8256k(mib0),64k(ART)
+# The default flash layout isn't enough to fit a freebsd kernel
+# now, so the layout has been shuffled around.
+#
+# By default it's set to:
+# 256KB uboot, 64KB uboot-env, 6336KB rootfs, 1344KB kernel, 64KB cfg, 8256MB mib0, 64KB ART
+# With 'bootcmd=bootm 0x9f680000' in the environment.
+#
+# Instead, now let's make it:
+# 256KB uboot, 64KB uboot-env, 2048MB kernel, 6144MB rootfs, 7644KB mib0, 64KB cfg, 64KB ART
+# .. and then you change the boot env to be:
+# 'bootcmd=bootm 0x9f050000'
# 256KiB u-boot
hint.map.0.at="flash/spi0"
hint.map.1.name="u-boot-env"
hint.map.1.readonly=1
-# 6336KiB rootfs
+# 2048KiB kernel
hint.map.2.at="flash/spi0"
hint.map.2.start=0x00050000
-hint.map.2.end=0x00680000 # 6336k rootfs
-hint.map.2.name="rootfs"
+hint.map.2.end=0x00250000 # 2048k rootfs
+hint.map.2.name="kernel"
hint.map.2.readonly=1
-# 1344KiB uImage
+# 6144KiB rootfs
hint.map.3.at="flash/spi0"
-hint.map.3.start=0x00680000
-hint.map.3.end=0x007d0000 # 1408k uImage, 64k off the end..
-hint.map.3.name="uImage"
+hint.map.3.start=0x00250000
+hint.map.3.end=0x00850000
+hint.map.3.name="rootfs"
hint.map.3.readonly=1
-# 64KiB cfg
+# 7644KiB mib0
hint.map.4.at="flash/spi0"
-hint.map.4.start=0x007d0000
-hint.map.4.end=0x007e0000
-hint.map.4.name="cfg"
+hint.map.4.start=0x00850000
+hint.map.4.end=0x00fe0000
+hint.map.4.name="mib0"
hint.map.4.readonly=0
-# 8256 KiB mib0
+# 64KiB cfg
hint.map.5.at="flash/spi0"
-hint.map.5.start=0x007e0000
-hint.map.5.end=0x00ff0000 # 64k mib0
-hint.map.5.name="mib0"
-hint.map.5.readonly=1
+hint.map.5.start=0x00fe0000
+hint.map.5.end=0x00ff0000
+hint.map.5.name="cfg"
+hint.map.5.readonly=0
# 64KiB ART
hint.map.6.at="flash/spi0"
-hint.map.6.start=0x007f0000
+hint.map.6.start=0x00ff0000
hint.map.6.end=0x01000000 # 64k ART
hint.map.6.name="ART"
hint.map.6.readonly=1
# Used for the static uboot partition map
device geom_map
-# Boot off of the rootfs, as defined in the geom_map setup.
-# Probably, this should be a USB device as the memory available
-# compressed rootfs is simply too small for FreeBSD
-#options ROOTDEVNAME=\"ufs:map/rootfs.uncompress\"
-
-# Boot off of a uboot tftp ramdisk kernel image. Because the flash
-# on this unit is so small, this is the only way to do dev work.
-# For full deployment, you will *have* to use a usb storage device
-# as a rootfs and use the flash to hold the kernel only.
-options MD_ROOT # md device usable as a potential root device
-options MD_ROOT_SIZE=10240
-#makeoptions MFS_IMAGE=/tftpboot/mfsroot-tl-mr3020.img.ulzma
-options ROOTDEVNAME=\"ufs:md0.uncompress\"
+# With only 4MB of flash, we are stuck using USB
+# for the rootfs.
+options ROOTDEVNAME=\"ufs:da0\"
# Where the ART is - last 64k in the flash
# 0x9fff1000 ?
-hint.ath.0.eepromaddr=0x1fff0000
+hint.ath.0.eepromaddr=0x1fff1000
hint.ath.0.eepromsize=16384
+
+hint.ar71xx.0.eeprom_mac_addr=0x1f01fc00
# The board 16MiB flash layout in uboot env:
#
PPP_NO_SUID=
.endif
CONFS= ppp.conf
-CONFSDIR= ${ETCDIR}/ppp
+CONFSDIR= ${CONFIGDIR}/ppp
CONFSMODE= 600
.if ${MK_ATM} == "no"