AC_DEFINE(RESTRICTED_STATD, 1, [Define this if you want to enable various security checks in statd. These checks basically keep anyone but lockd from using this service.])
fi
AC_SUBST(secure_statd)
-AC_ARG_ENABLE(rquotad,
- [AC_HELP_STRING([--enable-rquotad],
- [enable rquotad @<:@default=yes@:>@])],
- enable_rquotad=$enableval,
- enable_rquotad=yes)
- if test "$enable_rquotad" = yes; then
- RQUOTAD=rquotad
- else
- RQUOTAD=
- fi
- AM_CONDITIONAL(CONFIG_RQUOTAD, [test "$enable_rquotad" = "yes"])
AC_ARG_WITH(rpcgen,
[AC_HELP_STRING([--with-rpcgen=internal], [use internal rpcgen instead of system one])],
rpcgen_path=$withval,
utils/mountd/Makefile
utils/nfsd/Makefile
utils/nfsstat/Makefile
- utils/rquotad/Makefile
utils/showmount/Makefile
utils/statd/Makefile])
AC_OUTPUT
OPTDIRS =
-if CONFIG_RQUOTAD
-OPTDIRS += rquotad
-endif
-
if CONFIG_NFSV4
OPTDIRS += idmapd
endif
+++ /dev/null
-## Process this file with automake to produce Makefile.in
-
-
-GENFILES_XDR = rquota_xdr.c
-GENFILES_H = rquota.h
-
-BUILT_SOURCES = $(GENFILES_H)
-
-GENFILES = $(GENFILES_XDR) $(GENFILES_H)
-man8_MANS = rquotad.man
-
-RPCPREFIX = rpc.
-KPREFIX = @kprefix@
-sbin_PROGRAMS = rquotad
-
-EXTRA_DIST = rquota.x $(man8_MANS) NEW README.okir
-
-rquotad_SOURCES = rquota_server.c rquota_svc.c rquota_xdr.c quotactl.c \
- hasquota.c mntent.h rquota.h
-rquotad_LDADD = ../../support/export/libexport.a \
- ../../support/nfs/libnfs.a \
- ../../support/misc/libmisc.a \
- $(LIBBSD) $(LIBWRAP) $(LIBNSL)
-rquotad_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS) \
- -I$(top_srcdir)/support/export
-
-MAINTAINERCLEANFILES = Makefile.in
-
-if CONFIG_RPCGEN
-RPCGEN = $(top_builddir)/tools/rpcgen/rpcgen
-$(RPCGEN):
- make -C $(top_srcdir)/tools/rpcgen all
-else
-RPCGEN = @RPCGEN_PATH@
-endif
-
-$(GENFILES_XDR): %_xdr.c: %.x $(RPCGEN)
- test -f $@ && rm -rf $@ || true
- $(RPCGEN) -c -o $@ $<
-
-
-$(GENFILES_H): %.h: %.x $(RPCGEN)
- test -f $@ && rm -rf $@ || true
- $(RPCGEN) -h -o $@ $<
-
-CLEANFILES = $(GENFILES)
-
-#######################################################################
-# The following allows the current practice of having
-# daemons renamed during the install to include RPCPREFIX
-# and the KPREFIX
-# This could all be done much easier with program_transform_name
-# ( program_transform_name = s/^/$(RPCPREFIX)$(KPREFIX)/ )
-# but that also renames the man pages, which the current
-# practice does not do.
-install-exec-hook:
- (cd $(DESTDIR)$(sbindir) && \
- for p in $(sbin_PROGRAMS); do \
- mv -f $$p$(EXEEXT) $(RPCPREFIX)$(KPREFIX)$$p$(EXEEXT) ;\
- done)
-uninstall-hook:
- (cd $(DESTDIR)$(sbindir) && \
- for p in $(sbin_PROGRAMS); do \
- rm -f $(RPCPREFIX)$(KPREFIX)$$p$(EXEEXT) ;\
- done)
-
-
-# XXX This makes some assumptions about what automake does.
-# XXX But there is no install-man-hook or install-man-local.
-install-man: install-man8 install-man-links
-uninstall-man: uninstall-man8 uninstall-man-links
-
-install-man-links:
- (cd $(DESTDIR)$(man8dir) && \
- for m in $(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS); do \
- inst=`echo $$m | sed -e 's/man$$/8/'`; \
- rm -f $(RPCPREFIX)$$inst ; \
- $(LN_S) $$inst $(RPCPREFIX)$$inst ; \
- done)
-
-uninstall-man-links:
- (cd $(DESTDIR)$(man8dir) && \
- for m in $(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS); do \
- inst=`echo $$m | sed -e 's/man$$/8/'`; \
- rm -f $(RPCPREFIX)$$inst ; \
- done)
-
+++ /dev/null
-This is Marco van Wieringen's rpc.rquotad in quotas-1.70 from
-
-ftp://ftp.cistron.nl/pub/people/mvw/quota
+++ /dev/null
-
-This is Marco van Wieringen's rpc.rquotad from quotas-1.55.
-
+++ /dev/null
-/*
- * QUOTA An implementation of the diskquota system for the LINUX
- * operating system. QUOTA is implemented using the BSD systemcall
- * interface as the means of communication with the user level.
- * Should work for all filesystems because of integration into the
- * VFS layer of the operating system.
- * This is based on the Melbourne quota system wich uses both user and
- * group quota files.
- *
- * Determines if a filesystem has quota enabled and how the quotafile
- * is named.
- *
- * Version: $Id: hasquota.c,v 2.6 1996/11/17 16:59:46 mvw Exp mvw $
- *
- * Author: Marco van Wieringen <mvw@planets.elm.net>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#define _LINUX_QUOTA_VERSION 1
-
-#include <sys/types.h>
-#include <sys/quota.h>
-#include <limits.h>
-#include <string.h>
-#include "mntent.h"
-#include "xmalloc.h"
-
-#undef min
-#define min(x,y) ((x) < (y)) ? (x) : (y)
-
-#define CORRECT_FSTYPE(type) \
-((!strcmp(type,MNTTYPE_EXT2)) || (!strcmp(type,MNTTYPE_EXT3)))
-
-char *qfextension[] = INITQFNAMES;
-
-/*
- * Check to see if a particular quota is to be enabled.
- */
-int
-hasquota(struct mntent *mnt, int type, char **qfnamep)
-{
- char *qfname = QUOTAFILENAME;
- char *option, *pathname;
-
- if (!CORRECT_FSTYPE(mnt->mnt_type))
- return (0);
-
- if (((type == USRQUOTA) && (option = hasmntopt(mnt, MNTOPT_USRQUOTA)) != (char *)0) ||
- ((type == GRPQUOTA) && (option = hasmntopt(mnt, MNTOPT_GRPQUOTA)) != (char *)0)) {
- if ((pathname = strchr(option, '=')) == (char *)0) {
- *qfnamep=xmalloc(strlen(mnt->mnt_dir)+strlen(qfname)+strlen(qfextension[type])+3);
- (void) sprintf(*qfnamep, "%s%s%s.%s", mnt->mnt_dir,
- (mnt->mnt_dir[strlen(mnt->mnt_dir) - 1] == '/') ? "" : "/",
- qfname, qfextension[type]);
- } else {
- if ((option = strchr(++pathname, ',')) != (char *)NULL) {
- int len=option-pathname;
- *qfnamep=xmalloc(len);
- memcpy(*qfnamep, pathname, len-1);
- (*qfnamep) [len-1] = '\0';
- }
- else {
- *qfnamep=xstrdup(pathname);
- }
- }
- return (1);
- } else
- return (0);
-}
+++ /dev/null
-#ifndef _MNTENT_H
-#define _MNTENT_H
-
-#include <features.h>
-
-#define MNTTAB "/etc/fstab"
-#define MOUNTED "/etc/mtab"
-
-#define MNTMAXSTR 512
-
-#define MNTTYPE_COHERENT "coherent" /* Coherent file system */
-#define MNTTYPE_EXT "ext" /* Extended file system */
-#define MNTTYPE_EXT2 "ext2" /* Second Extended file system */
-#define MNTTYPE_EXT3 "ext3" /* Journaled Second Extended file system */
-#define MNTTYPE_HPFS "hpfs" /* OS/2's high performance file system */
-#define MNTTYPE_ISO9660 "iso9660" /* ISO CDROM file system */
-#define MNTTYPE_MINIX "minix" /* MINIX file system */
-#define MNTTYPE_MSDOS "msdos" /* MS-DOS file system */
-#define MNTTYPE_SYSV "sysv" /* System V file system */
-#define MNTTYPE_UMSDOS "umsdos" /* U MS-DOS file system */
-#define MNTTYPE_XENIX "xenix" /* Xenix file system */
-#define MNTTYPE_XIAFS "xiafs" /* Frank Xia's file system */
-#define MNTTYPE_NFS "nfs" /* Network file system */
-#define MNTTYPE_PROC "proc" /* Linux process file system */
-#define MNTTYPE_IGNORE "ignore" /* Ignore this entry */
-#define MNTTYPE_SWAP "swap" /* Swap device */
-
-/* generic mount options */
-#define MNTOPT_DEFAULTS "defaults" /* use all default opts */
-#define MNTOPT_RO "ro" /* read only */
-#define MNTOPT_RW "rw" /* read/write */
-#define MNTOPT_SUID "suid" /* set uid allowed */
-#define MNTOPT_NOSUID "nosuid" /* no set uid allowed */
-#define MNTOPT_NOAUTO "noauto" /* don't auto mount */
-
-/* ext2 and msdos options */
-#define MNTOPT_CHECK "check" /* filesystem check level */
-
-/* ext2 specific options */
-#define MNTOPT_BSDDF "bsddf" /* disable MINIX compatibility disk free counting */
-#define MNTOPT_BSDGROUPS "bsdgroups" /* set BSD group usage */
-#define MNTOPT_ERRORS "errors" /* set behaviour on error */
-#define MNTOPT_GRPID "grpid" /* set BSD group usage */
-#define MNTOPT_MINIXDF "minixdf" /* enable MINIX compatibility disk free counting */
-#define MNTOPT_NOCHECK "nocheck" /* reset filesystem checks */
-#define MNTOPT_NOGRPID "nogrpid" /* set SYSV group usage */
-#define MNTOPT_RESGID "resgid" /* group to consider like root for reserved blocks */
-#define MNTOPT_RESUID "resuid" /* user to consider like root for reserved blocks */
-#define MNTOPT_SB "sb" /* set used super block */
-#define MNTOPT_SYSVGROUPS "sysvgroups" /* set SYSV group usage */
-
-/* options common to hpfs, isofs, and msdos */
-#define MNTOPT_CONV "conv" /* convert specified types of data */
-#define MNTOPT_GID "gid" /* use given gid */
-#define MNTOPT_UID "uid" /* use given uid */
-#define MNTOPT_UMASK "umask" /* use given umask, not isofs */
-
-/* hpfs specific options */
-#define MNTOPT_CASE "case" /* case conversation */
-
-/* isofs specific options */
-#define MNTOPT_BLOCK "block" /* use given block size */
-#define MNTOPT_CRUFT "cruft" /* ??? */
-#define MNTOPT_MAP "map" /* ??? */
-#define MNTOPT_NOROCK "norock" /* not rockwell format ??? */
-
-/* msdos specific options */
-#define MNTOPT_FAT "fat" /* set FAT size */
-#define MNTOPT_QUIET "quiet" /* ??? */
-
-/* swap specific options */
-
-/* options common to ext, ext2, minix, xiafs, sysv, xenix, coherent */
-#define MNTOPT_NOQUOTA "noquota" /* don't use any quota on this partition */
-#define MNTOPT_USRQUOTA "usrquota" /* use userquota on this partition */
-#define MNTOPT_GRPQUOTA "grpquota" /* use groupquota on this partition */
-#define MNTOPT_RSQUASH "rsquash" /* threat root as an ordinary user */
-
-/* none defined yet */
-
-__BEGIN_DECLS
-
-struct mntent{
- char *mnt_fsname;
- char *mnt_dir;
- char *mnt_type;
- char *mnt_opts;
- int mnt_freq;
- int mnt_passno;
-};
-
-__END_DECLS
-
-#define __need_file
-#include <stdio.h>
-
-__BEGIN_DECLS
-
-extern FILE *setmntent __P ((__const char *__filep,
- __const char *__type));
-extern struct mntent
- *getmntent __P ((FILE *__filep));
-extern int addmntent __P ((FILE *__filep,
- __const struct mntent *__mnt));
-extern char *hasmntopt __P ((__const struct mntent *__mnt,
- __const char *__opt));
-extern int endmntent __P ((FILE *__filep));
-
-extern int hasquota __P ((struct mntent *, int, char **));
-
-__END_DECLS
-
-#endif /* _MNTENT_H */
+++ /dev/null
-/*
- * QUOTA An implementation of the diskquota system for the LINUX
- * operating system. QUOTA is implemented using the BSD systemcall
- * interface as the means of communication with the user level.
- * Should work for all filesystems because of integration into the
- * VFS layer of the operating system.
- * This is based on the Melbourne quota system wich uses both user and
- * group quota files.
- *
- * System call interface.
- *
- * Version: $Id: quotactl.c,v 2.3 1995/07/23 09:58:06 mvw Exp mvw $
- *
- * Author: Marco van Wieringen <mvw@planets.ow.nl> <mvw@tnix.net>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/syscall.h>
-
-int quotactl(int cmd, const char * special, int id, caddr_t addr)
-{
- return syscall(SYS_quotactl, cmd, special, id, addr);
-}
+++ /dev/null
-/* @(#)rquota.x 2.1 88/08/01 4.0 RPCSRC */
-/* @(#)rquota.x 1.2 87/09/20 Copyr 1987 Sun Micro */
-
-/*
- * Remote quota protocol
- * Requires unix authentication
- */
-
-#ifdef RPC_CLNT
-%#include <string.h>
-#endif
-
-const RQ_PATHLEN = 1024;
-
-struct getquota_args {
- string gqa_pathp<RQ_PATHLEN>; /* path to filesystem of interest */
- int gqa_uid; /* Inquire about quota for uid */
-};
-
-struct ext_getquota_args {
- string gqa_pathp<RQ_PATHLEN>; /* path to filesystem of interest */
- int gqa_type; /* Type of quota info is needed about */
- int gqa_id; /* Inquire about quota for id */
-};
-
-/*
- * remote quota structure
- */
-struct rquota {
- int rq_bsize; /* block size for block counts */
- bool rq_active; /* indicates whether quota is active */
- unsigned int rq_bhardlimit; /* absolute limit on disk blks alloc */
- unsigned int rq_bsoftlimit; /* preferred limit on disk blks */
- unsigned int rq_curblocks; /* current block count */
- unsigned int rq_fhardlimit; /* absolute limit on allocated files */
- unsigned int rq_fsoftlimit; /* preferred file limit */
- unsigned int rq_curfiles; /* current # allocated files */
- unsigned int rq_btimeleft; /* time left for excessive disk use */
- unsigned int rq_ftimeleft; /* time left for excessive files */
-};
-
-enum gqr_status {
- Q_OK = 1, /* quota returned */
- Q_NOQUOTA = 2, /* noquota for uid */
- Q_EPERM = 3 /* no permission to access quota */
-};
-
-union getquota_rslt switch (gqr_status status) {
-case Q_OK:
- rquota gqr_rquota; /* valid if status == Q_OK */
-case Q_NOQUOTA:
- void;
-case Q_EPERM:
- void;
-};
-
-program RQUOTAPROG {
- version RQUOTAVERS {
- /*
- * Get all quotas
- */
- getquota_rslt
- RQUOTAPROC_GETQUOTA(getquota_args) = 1;
-
- /*
- * Get active quotas only
- */
- getquota_rslt
- RQUOTAPROC_GETACTIVEQUOTA(getquota_args) = 2;
- } = 1;
- version EXT_RQUOTAVERS {
- /*
- * Get all quotas
- */
- getquota_rslt
- RQUOTAPROC_GETQUOTA(ext_getquota_args) = 1;
-
- /*
- * Get active quotas only
- */
- getquota_rslt
- RQUOTAPROC_GETACTIVEQUOTA(ext_getquota_args) = 2;
- } = 2;
-} = 100011;
+++ /dev/null
-/*
- * QUOTA An implementation of the diskquota system for the LINUX
- * operating system. QUOTA is implemented using the BSD systemcall
- * interface as the means of communication with the user level.
- * Should work for all filesystems because of integration into the
- * VFS layer of the operating system.
- * This is based on the Melbourne quota system wich uses both user and
- * group quota files.
- *
- * This part does the lookup of the info.
- *
- * Version: $Id: rquota_server.c,v 2.9 1996/11/17 16:59:46 mvw Exp mvw $
- *
- * Author: Marco van Wieringen <mvw@planets.elm.net>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <rpc/rpc.h>
-#include "rquota.h"
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-/* Unfortunately we cannot trust sys/quota.h to have
- * what we need, either the old interface could be missing
- * (SLES9) or the new (SLES8 and others).
- * So we will just put it explicitly below
- */
-#if 0
-#include <sys/quota.h>
-#endif
-#include <sys/mount.h>
-#include <dirent.h>
-#include <paths.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include "mntent.h"
-#include "xmalloc.h"
-
-#define TYPE_EXTENDED 0x01
-#define ACTIVE 0x02
-
-#ifndef MNTTYPE_AUTOFS
-#define MNTTYPE_AUTOFS "autofs"
-#endif
-
-#ifndef BLOCK_SIZE
-#define BLOCK_SIZE 1024
-#endif
-
-#define MAXQUOTAS 2
-#define USRQUOTA 0 /* element used for user quotas */
-#define GRPQUOTA 1 /* element used for group quotas */
-
-struct dqblk {
- u_int32_t dqb_bhardlimit; /* absolute limit on disk blks alloc */
- u_int32_t dqb_bsoftlimit; /* preferred limit on disk blks */
- u_int32_t dqb_curblocks; /* current block count */
- u_int32_t dqb_ihardlimit; /* maximum # allocated inodes */
- u_int32_t dqb_isoftlimit; /* preferred inode limit */
- u_int32_t dqb_curinodes; /* current # allocated inodes */
- time_t dqb_btime; /* time limit for excessive disk use */
- time_t dqb_itime; /* time limit for excessive files */
-};
-
-struct if_dqblk {
- u_int64_t dqb_bhardlimit;
- u_int64_t dqb_bsoftlimit;
- u_int64_t dqb_curspace;
- u_int64_t dqb_ihardlimit;
- u_int64_t dqb_isoftlimit;
- u_int64_t dqb_curinodes;
- u_int64_t dqb_btime;
- u_int64_t dqb_itime;
- u_int32_t dqb_valid;
-};
-
-#define SUBCMDMASK 0x00ff
-#define SUBCMDSHIFT 8
-#define QCMD(cmd, type) (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
-
-#define Q_GETQUOTA 0x0300 /* get limits and usage */
-#define Q_SETQUOTA 0x0400 /* set limits and usage */
-
-#define Q_GETFMT 0x800004 /* get quota format used on given filesystem */
-#define Q_GETQUOTA_NEW 0x800007 /* get user quota structure */
-#define Q_SETQUOTA_NEW 0x800008 /* set user quota structure */
-#define dqoff(UID) ((loff_t)((UID) * sizeof (struct dqblk)))
-
-extern int quotactl (int __cmd, const char *__special, int __id,
- caddr_t __addr) __THROW;
-/*
- * Global unix authentication credentials.
- */
-extern struct authunix_parms *unix_cred;
-
-int in_group (gid_t *gids, u_int len, gid_t gid)
-{
- int cnt = 0;
-
- while (cnt < len) {
- if (gids[cnt] == gid)
- return 1;
- cnt++;
- }
- return 0;
-}
-
-getquota_rslt *getquotainfo(int flags, caddr_t *argp, struct svc_req *rqstp)
-{
- static getquota_rslt result;
- union {
- getquota_args *args;
- ext_getquota_args *ext_args;
- } arguments;
- FILE *fp;
- struct mntent *mnt;
- char *pathname, *qfpathname;
- int fd, err, id, type;
- struct stat stm, stn;
- struct rquota *rquota;
- struct if_dqblk dqb;
-
- /*
- * First check authentication.
- */
- if (flags & TYPE_EXTENDED) {
- arguments.ext_args = (ext_getquota_args *)argp;
- id = arguments.ext_args->gqa_id;
- type = arguments.ext_args->gqa_type;
- pathname = arguments.ext_args->gqa_pathp;
-
- if (type == USRQUOTA && unix_cred->aup_uid && unix_cred->aup_uid != id) {
- result.status = Q_EPERM;
- return(&result);
- }
-
- if (type == GRPQUOTA && unix_cred->aup_uid && unix_cred->aup_gid != id &&
- !in_group((gid_t *)unix_cred->aup_gids, unix_cred->aup_len, id)) {
- result.status = Q_EPERM;
- return(&result);
- }
- } else {
- arguments.args = (getquota_args *)argp;
- id = arguments.args->gqa_uid;
- type = USRQUOTA;
- pathname = arguments.args->gqa_pathp;
-
- if (unix_cred->aup_uid && unix_cred->aup_uid != id) {
- result.status = Q_EPERM;
- return(&result);
- }
- }
-
- fp = setmntent(MNTTAB, "r");
- while ((mnt = getmntent(fp)) != (struct mntent *)0) {
- if (stat(mnt->mnt_dir, &stm) == -1)
- continue;
-
- if (stat(pathname, &stn) == -1)
- break;
- else if (stm.st_dev != stn.st_dev)
- continue;
-
- if (mnt->mnt_fsname [0] != '/'
- || strcasecmp (mnt->mnt_type, MNTTYPE_NFS) == 0
- || strcasecmp (mnt->mnt_type, MNTTYPE_AUTOFS) == 0
- || strcasecmp (mnt->mnt_type, MNTTYPE_SWAP) == 0
- || strcasecmp (mnt->mnt_type, MNTTYPE_IGNORE) == 0)
- break;
-
- /* All blocks reported are in BLOCK_SIZE. */
- result.getquota_rslt_u.gqr_rquota.rq_bsize = BLOCK_SIZE;
-
- if (hasquota(mnt, type, &qfpathname)) {
- int fmt;
- if (quotactl(QCMD(Q_GETFMT, type), mnt->mnt_fsname, 0, (caddr_t)&fmt)==0) {
- /* new style interface
- * Don't bother trying to read from the file
- */
- err = quotactl(QCMD(Q_GETQUOTA_NEW, type),
- mnt->mnt_fsname, id, (caddr_t)&dqb);
- if (err) memset(&dqb, 0, sizeof(dqb));
- } else {
- /* old style */
- struct dqblk dq_dqb;
-
- if ((err = quotactl(QCMD(Q_GETQUOTA, type), mnt->mnt_fsname,
- id, (caddr_t)&dq_dqb)) == -1
- && !(flags & ACTIVE)) {
- if ((fd = open(qfpathname, O_RDONLY)) < 0)
- {
- free(qfpathname);
- continue;
- }
- lseek(fd, (long) dqoff(id), L_SET);
- switch (read(fd, &dq_dqb, sizeof(struct dqblk))) {
- case 0:/* EOF */
- /*
- * Convert implicit 0 quota (EOF) into an
- * explicit one (zero'ed dqblk)
- */
- memset((caddr_t)&dq_dqb, 0, sizeof(struct dqblk));
- break;
- case sizeof(struct dqblk): /* OK */
- break;
- default: /* ERROR */
- close(fd);
- free(qfpathname);
- continue;
- }
- close(fd);
- }
- dqb.dqb_bhardlimit = dq_dqb.dqb_bhardlimit;
- dqb.dqb_bsoftlimit = dq_dqb.dqb_bsoftlimit;
- dqb.dqb_curspace = dq_dqb.dqb_curblocks * 1024;
- dqb.dqb_ihardlimit = dq_dqb.dqb_ihardlimit;
- dqb.dqb_isoftlimit = dq_dqb.dqb_isoftlimit;
- dqb.dqb_curinodes = dq_dqb.dqb_curinodes;
- dqb.dqb_btime = dq_dqb.dqb_btime;
- dqb.dqb_itime = dq_dqb.dqb_itime;
- }
- free(qfpathname);
- endmntent(fp);
-
- if (err && (flags & ACTIVE)) {
- result.status = Q_NOQUOTA;
- return(&result);
- }
-
- result.status = Q_OK;
- result.getquota_rslt_u.gqr_rquota.rq_active = (err == 0) ? TRUE : FALSE;
- /*
- * Make a copy of the info into the last part of the remote quota
- * struct might not be exactly the same on all architectures...
- */
-
- rquota = &result.getquota_rslt_u.gqr_rquota;
- rquota->rq_bhardlimit = dqb.dqb_bhardlimit;
- rquota->rq_bsoftlimit = dqb.dqb_bsoftlimit;;
- rquota->rq_curblocks = dqb.dqb_curspace/1024;
- rquota->rq_fhardlimit = dqb.dqb_ihardlimit;
- rquota->rq_fsoftlimit = dqb.dqb_isoftlimit;
- rquota->rq_curfiles = dqb.dqb_curinodes;
- rquota->rq_btimeleft = dqb.dqb_btime;
- rquota->rq_ftimeleft = dqb.dqb_itime;
-
- return(&result);
- }
- }
- endmntent(fp);
-
- result.status = Q_NOQUOTA;
- return(&result);
-}
-
-getquota_rslt *rquotaproc_getquota_1_svc(getquota_args *argp, struct svc_req *rqstp)
-{
- return(getquotainfo(0, (caddr_t *)argp, rqstp));
-}
-
-getquota_rslt *rquotaproc_getactivequota_1_svc(getquota_args *argp, struct svc_req *rqstp)
-{
- return(getquotainfo(ACTIVE, (caddr_t *)argp, rqstp));
-}
-
-getquota_rslt *rquotaproc_getquota_2_svc(ext_getquota_args *argp, struct svc_req *rqstp)
-{
- return(getquotainfo(TYPE_EXTENDED, (caddr_t *)argp, rqstp));
-}
-
-getquota_rslt *rquotaproc_getactivequota_2_svc(ext_getquota_args *argp, struct svc_req *rqstp)
-{
- return(getquotainfo(TYPE_EXTENDED | ACTIVE, (caddr_t *)argp, rqstp));
-}
+++ /dev/null
-/*
- * QUOTA An implementation of the diskquota system for the LINUX
- * operating system. QUOTA is implemented using the BSD systemcall
- * interface as the means of communication with the user level.
- * Should work for all filesystems because of integration into the
- * VFS layer of the operating system.
- * This is based on the Melbourne quota system wich uses both user and
- * group quota files.
- *
- * This part accepts the rquota rpc-requests.
- *
- * Version: $Id: rquota_svc.c,v 2.6 1996/11/17 16:59:46 mvw Exp mvw $
- *
- * Author: Marco van Wieringen <mvw@planets.elm.net>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_TCP_WRAPPER
-#include "tcpwrapper.h"
-#endif
-
-#include <unistd.h>
-#include <errno.h>
-#include <rpc/rpc.h>
-#include "rquota.h"
-#include <stdlib.h>
-#include <rpc/pmap_clnt.h>
-#include <string.h>
-#include <memory.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <syslog.h>
-#include <signal.h>
-#include <getopt.h>
-#include <rpcmisc.h>
-#include <nfslib.h>
-
-#ifdef __STDC__
-#define SIG_PF void(*)(int)
-#endif
-
-static struct option longopts[] =
-{
- { "help", 0, 0, 'h' },
- { "version", 0, 0, 'v' },
- { "port", 1, 0, 'p' },
- { NULL, 0, 0, 0 }
-};
-
-/*
- * Global authentication credentials.
- */
-struct authunix_parms *unix_cred;
-
-static void rquotaprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
-{
- union {
- getquota_args rquotaproc_getquota_1_arg;
- getquota_args rquotaproc_getactivequota_1_arg;
- } argument;
- char *result;
- xdrproc_t xdr_argument, xdr_result;
- char *(*local)(char *, struct svc_req *);
-
-#ifdef HAVE_TCP_WRAPPER
- /* remote host authorization check */
- if (!check_default("rquotad", svc_getcaller(transp),
- rqstp->rq_proc, RQUOTAPROG)) {
- svcerr_auth (transp, AUTH_FAILED);
- return;
- }
-#endif
-
- /*
- * Don't bother authentication for NULLPROC.
- */
- if (rqstp->rq_proc == NULLPROC) {
- (void) svc_sendreply(transp, (xdrproc_t) xdr_void, (char *)NULL);
- return;
- }
-
- /*
- * First get authentication.
- */
- switch (rqstp->rq_cred.oa_flavor) {
- case AUTH_UNIX:
- unix_cred = (struct authunix_parms *)rqstp->rq_clntcred;
- break;
- case AUTH_NULL:
- default:
- svcerr_weakauth(transp);
- return;
- }
-
- switch (rqstp->rq_proc) {
- case RQUOTAPROC_GETQUOTA:
- xdr_argument = (xdrproc_t) xdr_getquota_args;
- xdr_result = (xdrproc_t) xdr_getquota_rslt;
- local = (char *(*)(char *, struct svc_req *)) rquotaproc_getquota_1_svc;
- break;
-
- case RQUOTAPROC_GETACTIVEQUOTA:
- xdr_argument = (xdrproc_t) xdr_getquota_args;
- xdr_result = (xdrproc_t) xdr_getquota_rslt;
- local = (char *(*)(char *, struct svc_req *)) rquotaproc_getactivequota_1_svc;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
-
- (void) memset((char *)&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, xdr_argument, (caddr_t) &argument)) {
- svcerr_decode(transp);
- return;
- }
- result = (*local)((char *)&argument, rqstp);
- if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
- svcerr_systemerr(transp);
- }
-
- if (!svc_freeargs(transp, xdr_argument, (caddr_t) &argument)) {
- syslog(LOG_ERR, "unable to free arguments");
- exit(1);
- }
- return;
-}
-
-static void rquotaprog_2(struct svc_req *rqstp, register SVCXPRT *transp)
-{
- union {
- ext_getquota_args rquotaproc_getquota_2_arg;
- ext_getquota_args rquotaproc_getactivequota_2_arg;
- } argument;
- char *result;
- xdrproc_t xdr_argument, xdr_result;
- char *(*local)(char *, struct svc_req *);
-
-#ifdef HAVE_TCP_WRAPPER
- /* remote host authorization check */
- if (!check_default("rquotad", svc_getcaller(transp),
- rqstp->rq_proc, RQUOTAPROG)) {
- svcerr_auth (transp, AUTH_FAILED);
- return;
- }
-#endif
-
- /*
- * Don't bother authentication for NULLPROC.
- */
- if (rqstp->rq_proc == NULLPROC) {
- (void) svc_sendreply(transp, (xdrproc_t) xdr_void, (char *)NULL);
- return;
- }
-
- /*
- * First get authentication.
- */
- switch (rqstp->rq_cred.oa_flavor) {
- case AUTH_UNIX:
- unix_cred = (struct authunix_parms *)rqstp->rq_clntcred;
- break;
- case AUTH_NULL:
- default:
- svcerr_weakauth(transp);
- return;
- }
-
- switch (rqstp->rq_proc) {
- case RQUOTAPROC_GETQUOTA:
- xdr_argument = (xdrproc_t) xdr_ext_getquota_args;
- xdr_result = (xdrproc_t) xdr_getquota_rslt;
- local = (char *(*)(char *, struct svc_req *)) rquotaproc_getquota_2_svc;
- break;
-
- case RQUOTAPROC_GETACTIVEQUOTA:
- xdr_argument = (xdrproc_t) xdr_ext_getquota_args;
- xdr_result = (xdrproc_t) xdr_getquota_rslt;
- local = (char *(*)(char *, struct svc_req *)) rquotaproc_getactivequota_2_svc;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
-
- (void) memset((char *)&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, xdr_argument, (caddr_t) &argument)) {
- svcerr_decode(transp);
- return;
- }
- result = (*local)((char *)&argument, rqstp);
- if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
- svcerr_systemerr(transp);
- }
-
- if (!svc_freeargs(transp, xdr_argument, (caddr_t) &argument)) {
- syslog(LOG_ERR, "unable to free arguments");
- exit(1);
- }
- return;
-}
-
-static void
-usage(const char *prog, int n)
-{
- fprintf(stderr, "Usage: %s [-p|--port port] [-h|-?|--help] [-v|--version]\n", prog);
- exit(n);
-}
-
-static void
-killer (int sig)
-{
- (void) pmap_unset(RQUOTAPROG, RQUOTAVERS);
- (void) pmap_unset(RQUOTAPROG, EXT_RQUOTAVERS);
- syslog(LOG_ERR, "caught signal %d, un-registering and exiting.", sig);
-}
-
-int main(int argc, char **argv)
-{
- register SVCXPRT *transp;
- int c;
- int port = 0;
- struct sigaction sa;
-
- (void) pmap_unset(RQUOTAPROG, RQUOTAVERS);
- (void) pmap_unset(RQUOTAPROG, EXT_RQUOTAVERS);
-
- openlog("rquota", LOG_PID, LOG_DAEMON);
-
- while ((c = getopt_long(argc, argv, "hp:v", longopts, NULL)) != EOF) {
- switch (c) {
- case '?':
- case 'h':
- usage(argv[0], 0);
- break;
- case 'p':
- port = atoi(optarg);
- if (port < 1 || port > 65535) {
- fprintf(stderr, "%s: bad port number: %s\n",
- argv[0], optarg);
- usage(argv[0], 1);
- }
- break;
- case 'v':
- printf("rquotad %s\n", VERSION);
- exit(0);
- default:
- usage(argv[0], 1);
- }
- }
-
- if (chdir(NFS_STATEDIR)) {
- fprintf(stderr, "%s: chdir(%s) failed: %s\n",
- argv [0], NFS_STATEDIR, strerror(errno));
-
- exit(1);
- }
-
- /* WARNING: the following works on Linux and SysV, but not BSD! */
- sa.sa_handler = SIG_IGN;
- sa.sa_flags = 0;
- sigemptyset(&sa.sa_mask);
- sigaction(SIGCHLD, &sa, NULL);
-
- sa.sa_handler = killer;
- sigaction(SIGHUP, &sa, NULL);
- sigaction(SIGINT, &sa, NULL);
- sigaction(SIGTERM, &sa, NULL);
-
- if (port)
- transp = svcudp_create(makesock(port, IPPROTO_UDP));
- else
- transp = svcudp_create(svcudp_socket (RQUOTAPROG, 1));
- if (transp == NULL) {
- syslog(LOG_ERR, "cannot create udp service.");
- exit(1);
- }
- if (!svc_register(transp, RQUOTAPROG, RQUOTAVERS, rquotaprog_1, IPPROTO_UDP)) {
- syslog(LOG_ERR, "unable to register (RQUOTAPROG, RQUOTAVERS, udp).");
- exit(1);
- }
- if (!svc_register(transp, RQUOTAPROG, EXT_RQUOTAVERS, rquotaprog_2, IPPROTO_UDP)) {
- syslog(LOG_ERR, "unable to register (RQUOTAPROG, EXT_RQUOTAVERS, udp).");
- exit(1);
- }
-
- daemon(1,1);
- svc_run();
-
- syslog(LOG_ERR, "svc_run returned");
- exit(1);
- /* NOTREACHED */
-}
+++ /dev/null
-.\"@(#)rquotad.8"
-.TH RQUOTAD 8 "8 Mar 2001"
-.SH NAME
-rquotad, rpc.rquotad \- remote quota server
-.SH SYNOPSIS
-.B /usr/etc/rpc.rquotad [-p " port "] "
-.SH DESCRIPTION
-.LP
-.IX "rquotad daemon" "" "\fLrquotad\fP \(em remote quota server"
-.IX daemons "rquotad daemon" "" "\fLrquotad\fP \(em remote quota server"
-.IX "user quotas" "rquotad daemon" "" "\fLrquotad\fP \(em remote quota server"
-.IX "disk quotas" "rquotad daemon" "" "\fLrquotad\fP \(em remote quota server"
-.IX "quotas" "rquotad daemon" "" "\fLrquotad\fP \(em remote quota server"
-.IX "file system" "rquotad daemon" "" "\fLrquotad\fP \(em remote quota server"
-.IX "remote procedure call services" "rquotad" "" "\fLrquotad\fP \(em remote quota server"
-.BR rquotad
-is an
-.BR rpc (3N)
-server which returns quotas for a user of a local file system
-which is mounted by a remote machine over the
-.SM NFS\s0.
-The results are used by
-.BR quota (1)
-to display user quotas for remote file systems.
-
-The
-.BR rquotad
-daemon is normally started at boottime from the
-.BR rc.net
-script (on systems with BSD'ish scripts, e.g. Slackware), or from the
-.BR nfs
-script in
-.BR /etc/rc.d/init.d/
-or
-.BR /etc/init.d/
-(on systems with SysV'ish scripts, e.g. RedHat, SuSE, etc).
-
-.SH OPTIONS
-.TP
-.BI "\-p," "" " \-\-port " port
-specify a port for
-.BR rpc.rquotad
-to listen on. By default,
-.BR rpc.rquotad
-will ask
-.BR portmap (8)
-to assign it a port number. As of this writing, there is not
-a standard port number that
-.BR portmap
-always or usually assigns. Specifying
-a port may be useful when implementing a firewall.
-
-.SH TCP_WRAPPERS SUPPORT
-This
-.BR rpc.rquotad
-version is protected by the
-.BR tcp_wrapper
-library. You have to give the clients access to
-.BR rpc.rquotad
-if they should be allowed to use it. To allow connects from clients of
-the .bar.com domain you could use the following line in /etc/hosts.allow:
-
-mountd: .bar.com
-
-You have to use the daemon name
-.BR rquotad
-for the daemon name (even if the binary has a different name).
-
-For further information please have a look at the
-.BR tcpd (8)
-and
-.BR hosts_access (5)
-manual pages.
-
-.SH FILES
-.BR quota.user ,
-.BR quota.group
--- quota files locate in the file system's root
-.PD
-.SH "SEE ALSO"
-.BR quota (8),
-.BR rpc (3N),
-.BR nfs (5),
-.BR services (5),
-.BR portmap(8),
-.BR inetd (8)