From: Steve Dickson <SteveD@redhat.com>
To: Jeff Layton <jlayton@redhat.com>
Cc: Chuck Lever <chuck.lever@oracle.com>, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 03/10] nfs-utils: convert rpc.nfsd to use xlog()
Date: Wed, 03 Jun 2009 16:25:20 -0400 [thread overview]
Message-ID: <4A26DC30.6050407@RedHat.com> (raw)
In-Reply-To: <20090603162214.2aeed744-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
Jeff Layton wrote:
> On Wed, 3 Jun 2009 16:01:24 -0400
> Chuck Lever <chuck.lever@oracle.com> wrote:
>
>> On Jun 3, 2009, at 3:52 PM, Jeff Layton wrote:
>>
>>> ...and add a --debug option to make nfsd log messages to stderr.
>>>
>>> rpc.nfsd is usually run out of init scripts in which case logging to
>>> syslog makes more sense. Make that the default and add a switch that
>>> makes log messages go to stderr. Eventually however nfsd has to close
>>> stderr, at which point the program switches to logging to syslog
>>> unconditionally.
>>>
>>> For now, stderr gets closed rather early, so --debug isn't terribly
>>> helpful. Later patches will make rpc.nfsd delay closing of stderr
>>> longer
>>> which should make it more useful.
>>>
>>> Signed-off-by: Jeff Layton <jlayton@redhat.com>
>>> ---
>>> support/nfs/nfssvc.c | 46 +++++++++++++++++-------------------
>>> utils/nfsd/nfsd.c | 63 ++++++++++++++++++++++++++++++
>>> +-------------------
>>> 2 files changed, 61 insertions(+), 48 deletions(-)
>>>
>>> diff --git a/support/nfs/nfssvc.c b/support/nfs/nfssvc.c
>>> index 33c15a7..3e6bd31 100644
>>> --- a/support/nfs/nfssvc.c
>>> +++ b/support/nfs/nfssvc.c
>>> @@ -16,10 +16,9 @@
>>> #include <unistd.h>
>>> #include <fcntl.h>
>>> #include <errno.h>
>>> -#include <syslog.h>
>>> -
>>>
>>> #include "nfslib.h"
>>> +#include "xlog.h"
>>>
>>> #define NFSD_PORTS_FILE "/proc/fs/nfsd/portlist"
>>> #define NFSD_VERS_FILE "/proc/fs/nfsd/versions"
>>> @@ -57,13 +56,13 @@ nfssvc_setfds(int port, unsigned int ctlbits,
>>> char *haddr)
>>> if (NFSCTL_UDPISSET(ctlbits)) {
>>> udpfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
>>> if (udpfd < 0) {
>>> - syslog(LOG_ERR, "nfssvc: unable to create UPD socket: "
>>> - "errno %d (%s)\n", errno, strerror(errno));
>>> + xlog(L_ERROR, "unable to create UDP socket: "
>>> + "errno %d (%m)", errno);
>>> exit(1);
>>> }
>>> if (bind(udpfd, (struct sockaddr *)&sin, sizeof(sin)) < 0){
>>> - syslog(LOG_ERR, "nfssvc: unable to bind UPD socket: "
>>> - "errno %d (%s)\n", errno, strerror(errno));
>>> + xlog(L_ERROR, "unable to bind UDP socket: "
>>> + "errno %d (%m)", errno);
>>> exit(1);
>>> }
>>> }
>>> @@ -71,32 +70,32 @@ nfssvc_setfds(int port, unsigned int ctlbits,
>>> char *haddr)
>>> if (NFSCTL_TCPISSET(ctlbits)) {
>>> tcpfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
>>> if (tcpfd < 0) {
>>> - syslog(LOG_ERR, "nfssvc: unable to createt tcp socket: "
>>> - "errno %d (%s)\n", errno, strerror(errno));
>>> + xlog(L_ERROR, "unable to createt tcp socket: "
>>> + "errno %d (%m)", errno);
>>> exit(1);
>>> }
>>> if (setsockopt(tcpfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) <
>>> 0) {
>>> - syslog(LOG_ERR, "nfssvc: unable to set SO_REUSEADDR: "
>>> - "errno %d (%s)\n", errno, strerror(errno));
>>> + xlog(L_ERROR, "unable to set SO_REUSEADDR: "
>>> + "errno %d (%m)", errno);
>>> exit(1);
>>> }
>>> if (bind(tcpfd, (struct sockaddr *)&sin, sizeof(sin)) < 0){
>>> - syslog(LOG_ERR, "nfssvc: unable to bind TCP socket: "
>>> - "errno %d (%s)\n", errno, strerror(errno));
>>> + xlog(L_ERROR, "unable to bind TCP socket: "
>>> + "errno %d (%m)", errno);
>>> exit(1);
>>> }
>>> if (listen(tcpfd, 64) < 0){
>>> - syslog(LOG_ERR, "nfssvc: unable to create listening socket: "
>>> - "errno %d (%s)\n", errno, strerror(errno));
>>> + xlog(L_ERROR, "unable to create listening socket: "
>>> + "errno %d (%m)", errno);
>>> exit(1);
>>> }
>>> }
>>> if (udpfd >= 0) {
>>> snprintf(buf, BUFSIZ,"%d\n", udpfd);
>>> if (write(fd, buf, strlen(buf)) != strlen(buf)) {
>>> - syslog(LOG_ERR,
>>> - "nfssvc: writing fds to kernel failed: errno %d (%s)",
>>> - errno, strerror(errno));
>>> + xlog(L_ERROR,
>>> + "writing fds to kernel failed: errno %d (%m)",
>>> + errno);
>>> }
>>> close(fd);
>>> fd = -1;
>>> @@ -106,9 +105,9 @@ nfssvc_setfds(int port, unsigned int ctlbits,
>>> char *haddr)
>>> fd = open(NFSD_PORTS_FILE, O_WRONLY);
>>> snprintf(buf, BUFSIZ,"%d\n", tcpfd);
>>> if (write(fd, buf, strlen(buf)) != strlen(buf)) {
>>> - syslog(LOG_ERR,
>>> - "nfssvc: writing fds to kernel failed: errno %d (%s)",
>>> - errno, strerror(errno));
>>> + xlog(L_ERROR,
>>> + "writing fds to kernel failed: errno %d (%m)",
>>> + errno);
>>> }
>>> }
>>> close(fd);
>>> @@ -139,10 +138,9 @@ nfssvc_versbits(unsigned int ctlbits, int
>>> minorvers4)
>>> minorvers4 > 0 ? '+' : '-',
>>> n);
>>> snprintf(ptr+off, BUFSIZ - off, "\n");
>>> - if (write(fd, buf, strlen(buf)) != strlen(buf)) {
>>> - syslog(LOG_ERR, "nfssvc: Setting version failed: errno %d (%s)",
>>> - errno, strerror(errno));
>>> - }
>>> + if (write(fd, buf, strlen(buf)) != strlen(buf))
>>> + xlog(L_ERROR, "Setting version failed: errno %d (%m)", errno);
>>> +
>>> close(fd);
>>>
>>> return;
>>> diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c
>>> index c7bd003..6dfea67 100644
>>> --- a/utils/nfsd/nfsd.c
>>> +++ b/utils/nfsd/nfsd.c
>>> @@ -18,13 +18,13 @@
>>> #include <string.h>
>>> #include <errno.h>
>>> #include <getopt.h>
>>> -#include <syslog.h>
>>> #include <netdb.h>
>>> #include <sys/socket.h>
>>> #include <netinet/in.h>
>>> #include <arpa/inet.h>
>>>
>>> #include "nfslib.h"
>>> +#include "xlog.h"
>>>
>>> static void usage(const char *);
>>>
>>> @@ -37,6 +37,7 @@ static struct option longopts[] =
>>> { "no-udp", 0, 0, 'U' },
>>> { "port", 1, 0, 'P' },
>>> { "port", 1, 0, 'p' },
>>> + { "debug", 0, 0, 'd' },
>>> { NULL, 0, 0, 0 }
>>> };
>>> unsigned int protobits = NFSCTL_ALLBITS;
>>> @@ -50,7 +51,7 @@ main(int argc, char **argv)
>>> int count = 1, c, error, port, fd, found_one;
>>> struct servent *ent;
>>> struct hostent *hp;
>>> - char *p;
>>> + char *p, *progname;
>>>
>>> ent = getservbyname ("nfs", "udp");
>>> if (ent != NULL)
>>> @@ -58,8 +59,22 @@ main(int argc, char **argv)
>>> else
>>> port = 2049;
>>>
>>> - while ((c = getopt_long(argc, argv, "H:hN:p:P:TU", longopts,
>>> NULL)) != EOF) {
>>> + progname = strdup(basename(argv[0]));
>>> + if (!progname) {
>>> + fprintf(stderr, "%s: unable to allocate memory.\n", argv[0]);
>>> + exit(1);
>>> + }
>>> +
>>> + xlog_syslog(1);
>>> + xlog_stderr(0);
>>> +
>>> + while ((c = getopt_long(argc, argv, "dH:hN:p:P:TU", longopts,
>>> NULL)) != EOF) {
>>> switch(c) {
>>> + case 'd':
>>> + xlog_config(D_ALL, 1);
>>> + xlog_syslog(0);
>>> + xlog_stderr(1);
>>> + break;
>>> case 'H':
>>> if (inet_addr(optarg) != INADDR_NONE) {
>>> haddr = strdup(optarg);
>>> @@ -67,8 +82,8 @@ main(int argc, char **argv)
>>> haddr = inet_ntoa((*(struct in_addr*)(hp->h_addr_list[0])));
>>> } else {
>>> fprintf(stderr, "%s: Unknown hostname: %s\n",
>>> - argv[0], optarg);
>>> - usage(argv [0]);
>>> + progname, optarg);
>>> + usage(progname);
>>> }
>>> break;
>>> case 'P': /* XXX for nfs-server compatibility */
>>> @@ -76,8 +91,8 @@ main(int argc, char **argv)
>>> port = atoi(optarg);
>>> if (port <= 0 || port > 65535) {
>>> fprintf(stderr, "%s: bad port number: %s\n",
>>> - argv[0], optarg);
>>> - usage(argv [0]);
>>> + progname, optarg);
>>> + usage(progname);
>>> }
>>> break;
>>> case 'N':
>>> @@ -105,14 +120,17 @@ main(int argc, char **argv)
>>> default:
>>> fprintf(stderr, "Invalid argument: '%c'\n", c);
>>> case 'h':
>>> - usage(argv[0]);
>>> + usage(progname);
>>> }
>>> }
>>> +
>>> + xlog_open(progname);
>>> +
>>> /*
>>> * Do some sanity checking, if the ctlbits are set
>>> */
>>> if (!NFSCTL_UDPISSET(protobits) && !NFSCTL_TCPISSET(protobits)) {
>>> - fprintf(stderr, "invalid protocol specified\n");
>>> + xlog(L_ERROR, "invalid protocol specified");
>>> exit(1);
>>> }
>>> found_one = 0;
>>> @@ -121,12 +139,12 @@ main(int argc, char **argv)
>>> found_one = 1;
>>> }
>>> if (!found_one) {
>>> - fprintf(stderr, "no version specified\n");
>>> + xlog(L_ERROR, "no version specified");
>>> exit(1);
>>> }
>>>
>>> if (NFSCTL_VERISSET(versbits, 4) && !NFSCTL_TCPISSET(protobits)) {
>>> - fprintf(stderr, "version 4 requires the TCP protocol\n");
>>> + xlog(L_ERROR, "version 4 requires the TCP protocol");
>>> exit(1);
>>> }
>>> if (haddr == NULL) {
>>> @@ -135,17 +153,15 @@ main(int argc, char **argv)
>>> }
>>>
>>> if (chdir(NFS_STATEDIR)) {
>>> - fprintf(stderr, "%s: chdir(%s) failed: %s\n",
>>> - argv [0], NFS_STATEDIR, strerror(errno));
>>> + xlog(L_ERROR, "chdir(%s) failed: %m", NFS_STATEDIR);
>>> exit(1);
>>> }
>>>
>>> if (optind < argc) {
>>> if ((count = atoi(argv[optind])) < 0) {
>>> /* insane # of servers */
>>> - fprintf(stderr,
>>> - "%s: invalid server count (%d), using 1\n",
>>> - argv[0], count);
>>> + xlog(L_ERROR, "invalid server count (%d), using 1",
>>> + count);
>>> count = 1;
>>> }
>>> }
>>> @@ -155,21 +171,20 @@ main(int argc, char **argv)
>>> everything before spawning kernel threads. --Chip */
>>> fd = open("/dev/null", O_RDWR);
>>> if (fd == -1)
>>> - perror("/dev/null");
>>> + xlog(L_ERROR, "Unable to open /dev/null: %m");
>>> else {
>>> (void) dup2(fd, 0);
>>> (void) dup2(fd, 1);
>>> (void) dup2(fd, 2);
>>> }
>>> + xlog_syslog(1);
>>> + xlog_stderr(0);
>>> closeall(3);
>>>
>>> - openlog("nfsd", LOG_PID, LOG_DAEMON);
>>> - if ((error = nfssvc(port, count, versbits, minorvers4, protobits,
>>> haddr)) < 0) {
>>> - int e = errno;
>>> - syslog(LOG_ERR, "nfssvc: %s", strerror(e));
>>> - closelog();
>>> - }
>>> + if ((error = nfssvc(port, count, versbits, minorvers4, protobits,
>>> haddr)) < 0)
>>> + xlog(L_ERROR, "nfssvc (%m)");
>> Nit: Maybe get rid of the "nfssvc" here as well?
Hmm... I would think this needs to be a
xlog(LOG_ERR, "nfssvc: errno %d (%s)", e, strerror(e));
>>
>
> Well, the "nfssvc" here tells us that the nfssvc() call returned an
> error. Later patches will clean that up when I break up the nfssvc()
> interface. That said though, there's a bug there. %m isn't appropriate
> since errno isn't being set. Whoops!
>
>>>
>>> + free(progname);
>> You go to the trouble of freeing progname here, but you exit in some
>> cases in the code above without freeing. I usually copy argv[0] into
>> a static buffer to avoid all that strdup(3) bother.
>>
>
> Six of one, half dozen of another. I try to be good about freeing
> memory that's been allocated in case this code gets reorganized in the
> future. The existing code is pretty bad about it, but it doesn't
> matter much since this program isn't long running.
>
> As far as allocating a static buffer for it, the problem there is that
> you don't know how big a buffer you'll need. Using strdup means less
> memory is being used.
Since this is not a long standing daemon (i.e. it exits) and as
long as the free() does cause a problem.. I don't see a problem with it..
steved.
next prev parent reply other threads:[~2009-06-03 20:28 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-03 19:52 [PATCH 00/10] nfs-utils: add IPv6 support to rpc.nfsd (try #5) Jeff Layton
2009-06-03 19:52 ` [PATCH 01/10] nfs-utils: don't link libexport.a and libmisc.a to nfsd Jeff Layton
2009-06-03 19:52 ` [PATCH 02/10] nfs-utils: clean up option parsing in nfsd.c Jeff Layton
2009-06-03 19:52 ` [PATCH 03/10] nfs-utils: convert rpc.nfsd to use xlog() Jeff Layton
2009-06-03 20:01 ` Chuck Lever
2009-06-03 20:22 ` Jeff Layton
[not found] ` <20090603162214.2aeed744-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2009-06-03 20:25 ` Steve Dickson [this message]
2009-06-03 20:31 ` Jeff Layton
[not found] ` <7968D2B9-3E31-4E0D-9D0B-309D757A0014@oracle.com>
2009-06-04 20:25 ` Jeff Layton
[not found] ` <20090604162534.15db803a-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2009-06-04 20:38 ` Chuck Lever
2009-06-03 19:52 ` [PATCH 04/10] nfs-utils: clean up NFSCTL_* macros for handling protocol bits Jeff Layton
2009-06-03 19:52 ` [PATCH 05/10] nfs-utils: move check for active knfsd to helper function Jeff Layton
2009-06-04 20:00 ` Chuck Lever
2009-06-04 20:29 ` Jeff Layton
2009-06-03 19:52 ` [PATCH 06/10] nfs-utils: convert nfssvc_setfds to use getaddrinfo Jeff Layton
2009-06-04 20:17 ` Chuck Lever
2009-06-04 20:36 ` Jeff Layton
2009-06-03 19:52 ` [PATCH 07/10] nfs-utils: break up the nfssvc interface Jeff Layton
2009-06-03 19:52 ` [PATCH 08/10] nfs-utils: add IPv6 support to nfssvc_setfds Jeff Layton
2009-06-03 20:08 ` Chuck Lever
2009-06-03 20:16 ` Steve Dickson
[not found] ` <4A26DA3B.3090404-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
2009-06-03 20:20 ` Steve Dickson
2009-06-03 20:24 ` Chuck Lever
2009-06-04 21:00 ` Chuck Lever
2009-06-03 19:52 ` [PATCH 09/10] nfs-utils: add IPv6 support to nfsd Jeff Layton
2009-06-03 19:52 ` [PATCH 10/10] nfs-utils: update the nfsd manpage Jeff Layton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A26DC30.6050407@RedHat.com \
--to=steved@redhat.com \
--cc=chuck.lever@oracle.com \
--cc=jlayton@redhat.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox