X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fnfsd%2Fnfssvc.c;h=7ecaea9e76cc26eee99037a9897794ceafbe4017;hp=0a7546a3c6f53544f65b65a564dc16a4f7308577;hb=4c477855cd025a18ac9decaf1bc9002aaae75689;hpb=6f25394cb5651e7e44cc3fc0b2b4b2ccba8c3625 diff --git a/utils/nfsd/nfssvc.c b/utils/nfsd/nfssvc.c index 0a7546a..7ecaea9 100644 --- a/utils/nfsd/nfssvc.c +++ b/utils/nfsd/nfssvc.c @@ -24,28 +24,51 @@ #define NFSD_VERS_FILE "/proc/fs/nfsd/versions" #define NFSD_THREAD_FILE "/proc/fs/nfsd/threads" +/* + * declaring a common static scratch buffer here keeps us from having to + * continually thrash the stack. The value of 128 bytes here is really just a + * SWAG and can be increased if necessary. It ought to be enough for the + * routines below however. + */ +char buf[128]; + +/* + * Are there already sockets configured? If not, then it is safe to try to + * open some and pass them through. + * + * Note: If the user explicitly asked for 'udp', then we should probably check + * if that is open, and should open it if not. However we don't yet. All + * sockets have to be opened when the first daemon is started. + */ +int +nfssvc_inuse(void) +{ + int fd, n; + + fd = open(NFSD_PORTS_FILE, O_RDONLY); + + /* problem opening file, assume that nothing is configured */ + if (fd < 0) + return 0; + + n = read(fd, buf, sizeof(buf)); + close(fd); + + xlog(D_GENERAL, "knfsd is currently %s", (n > 0) ? "up" : "down"); + + return (n > 0); +} + static void nfssvc_setfds(int port, unsigned int ctlbits, char *haddr) { - int fd, n, on=1; - char buf[BUFSIZ]; + int fd, on=1; int udpfd = -1, tcpfd = -1; struct sockaddr_in sin; - fd = open(NFSD_PORTS_FILE, O_RDONLY); - if (fd < 0) - return; - n = read(fd, buf, BUFSIZ); - close(fd); - if (n != 0) + if (nfssvc_inuse()) return; - /* there are no ports currently open, so it is safe to - * try to open some and pass them through. - * Note: If the user explicitly asked for 'udp', then - * we should probably check if that is open, and should - * open it if not. However we don't yet. All sockets - * have to be opened when the first daemon is started. - */ + fd = open(NFSD_PORTS_FILE, O_WRONLY); if (fd < 0) return; @@ -91,7 +114,7 @@ nfssvc_setfds(int port, unsigned int ctlbits, char *haddr) } } if (udpfd >= 0) { - snprintf(buf, BUFSIZ,"%d\n", udpfd); + snprintf(buf, sizeof(buf), "%d\n", udpfd); if (write(fd, buf, strlen(buf)) != strlen(buf)) { xlog(L_ERROR, "writing fds to kernel failed: errno %d (%m)", @@ -103,7 +126,7 @@ nfssvc_setfds(int port, unsigned int ctlbits, char *haddr) if (tcpfd >= 0) { if (fd < 0) fd = open(NFSD_PORTS_FILE, O_WRONLY); - snprintf(buf, BUFSIZ,"%d\n", tcpfd); + snprintf(buf, sizeof(buf), "%d\n", tcpfd); if (write(fd, buf, strlen(buf)) != strlen(buf)) { xlog(L_ERROR, "writing fds to kernel failed: errno %d (%m)", @@ -118,7 +141,7 @@ static void nfssvc_versbits(unsigned int ctlbits, int minorvers4) { int fd, n, off; - char buf[BUFSIZ], *ptr; + char *ptr; ptr = buf; off = 0; @@ -128,17 +151,17 @@ nfssvc_versbits(unsigned int ctlbits, int minorvers4) for (n = NFSD_MINVERS; n <= NFSD_MAXVERS; n++) { if (NFSCTL_VERISSET(ctlbits, n)) - off += snprintf(ptr+off, BUFSIZ - off, "+%d ", n); + off += snprintf(ptr+off, sizeof(buf) - off, "+%d ", n); else - off += snprintf(ptr+off, BUFSIZ - off, "-%d ", n); + off += snprintf(ptr+off, sizeof(buf) - off, "-%d ", n); } n = minorvers4 >= 0 ? minorvers4 : -minorvers4; if (n >= NFSD_MINMINORVERS4 && n <= NFSD_MAXMINORVERS4) - off += snprintf(ptr+off, BUFSIZ - off, "%c4.%d", + off += snprintf(ptr+off, sizeof(buf) - off, "%c4.%d", minorvers4 > 0 ? '+' : '-', n); xlog(D_GENERAL, "Writing version string to kernel: %s", buf); - snprintf(ptr+off, BUFSIZ - off, "\n"); + snprintf(ptr+off, sizeof(buf) - off, "\n"); if (write(fd, buf, strlen(buf)) != strlen(buf)) xlog(L_ERROR, "Setting version failed: errno %d (%m)", errno); @@ -168,9 +191,8 @@ nfssvc(int port, int nrservs, unsigned int versbits, int minorvers4, * Just write the number in. * Cannot handle port number yet, but does anyone care? */ - char buf[20]; int n; - snprintf(buf, 20,"%d\n", nrservs); + snprintf(buf, sizeof(buf), "%d\n", nrservs); n = write(fd, buf, strlen(buf)); close(fd); if (n != strlen(buf))