📄 mod_load.c.in
字号:
/* * ProFTPD: mod_load -- a module for refusing connections based on system load * * Copyright (c) 2001-2005 TJ Saunders * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * As a special exemption, TJ Saunders and other respective copyright holders * give permission to link this program with OpenSSL, and distribute the * resulting executable, without including the source code for OpenSSL in the * source distribution. * * This is mod_load, contrib software for proftpd 1.2.x and above. * For more information contact TJ Saunders <tj@castaglia.org>. * * Based on the getloadavg.c file included in GNU make-3.79, which carries * the following copyright: * * Copyright (C) 1985, 86, 87, 88, 89, 91, 92, 93, 1994, 1995, 1997 * Free Software Foundation, Inc. * * $Id: mod_load.c.in,v 1.3 2005/01/06 23:39:59 castaglia Exp $ * $Libraries: @MODULE_LIBS@ $ */#include "conf.h"#include "privs.h"#include "mod_load.h"#define MOD_LOAD_VERSION "mod_load/1.0.1"/* Make sure the version of proftpd is as necessary. */#if PROFTPD_VERSION_NUMBER < 0x0001030001# error "ProFTPD 1.3.0rc1 or later required"#endif/* Support code. Most of this is from getloadavg.c */#if defined (unix) || defined (__unix)# include <sys/param.h>#endif#ifndef HAVE_GETLOADAVG# if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT)# define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0)# endif# if !defined (BSD) && defined (ultrix)# define BSD# endif# ifdef NeXT# undef BSD# undef FSCALE# endif# ifdef __GNU__# undef BSD# undef FSCALE# endif /* __GNU__ */# if defined (HPUX) && !defined (hpux)# define hpux# endif# if defined (__hpux) && !defined (hpux)# define hpux# endif# if defined (__sun) && !defined (sun)# define sun# endif# if defined(hp300) && !defined(hpux)# define MORE_BSD# endif# if defined(ultrix) && defined(mips)# define decstation# endif# if defined (__SVR4) && !defined (SVR4)# define SVR4# endif# if (defined(sun) && defined(SVR4)) || defined (SOLARIS2)# define SUNOS_5# endif# if defined (__osf__) && (defined (__alpha) || defined (__alpha__))# define OSF_ALPHA# include <sys/mbuf.h># include <sys/socket.h># include <net/route.h># include <sys/table.h># endif# if defined (__osf__) && (defined (mips) || defined (__mips__))# define OSF_MIPS# include <sys/table.h># endif# if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES)# define tek4300# endif# ifndef LOAD_AVE_TYPE# ifdef MORE_BSD# define LOAD_AVE_TYPE long# endif# ifdef sun# define LOAD_AVE_TYPE long# endif# ifdef decstation# define LOAD_AVE_TYPE long# endif# ifdef _SEQUENT_# define LOAD_AVE_TYPE long# endif# ifdef sgi# define LOAD_AVE_TYPE long# endif# ifdef SVR4# define LOAD_AVE_TYPE long# endif# ifdef sony_news# define LOAD_AVE_TYPE long# endif# ifdef sequent# define LOAD_AVE_TYPE long# endif# ifdef OSF_ALPHA# define LOAD_AVE_TYPE long# endif# if defined (ardent) && defined (titan)# define LOAD_AVE_TYPE long# endif# ifdef tek4300# define LOAD_AVE_TYPE long# endif# if defined(alliant) && defined(i860) /* Alliant FX/2800 */# define LOAD_AVE_TYPE long# endif# ifdef _AIX# define LOAD_AVE_TYPE long# endif# ifdef convex# define LOAD_AVE_TYPE double# ifndef LDAV_CVT# define LDAV_CVT(n) (n)# endif# endif# endif /* No LOAD_AVE_TYPE. */# ifdef OSF_ALPHA# undef FSCALE# define FSCALE 1024.0# endif# if defined(alliant) && defined(i860) /* Alliant FX/2800 */# undef FSCALE# define FSCALE 100.0# endif# ifndef FSCALE# ifdef MORE_BSD# define FSCALE 2048.0# endif# if defined(MIPS) || defined(SVR4) || defined(decstation)# define FSCALE 256# endif# if defined (sgi) || defined (sequent)# undef FSCALE# define FSCALE 1000.0# endif# if defined (ardent) && defined (titan)# define FSCALE 65536.0# endif# ifdef tek4300# define FSCALE 100.0# endif# ifdef _AIX# define FSCALE 65536.0# endif# endif /* Not FSCALE. */# if !defined (LDAV_CVT) && defined (FSCALE)# define LDAV_CVT(n) (((double) (n)) / FSCALE)# endif# ifndef NLIST_STRUCT# ifdef MORE_BSD# define NLIST_STRUCT# endif# ifdef sun# define NLIST_STRUCT# endif# ifdef decstation# define NLIST_STRUCT# endif# ifdef hpux# define NLIST_STRUCT# endif# if defined (_SEQUENT_) || defined (sequent)# define NLIST_STRUCT# endif# ifdef sgi# define NLIST_STRUCT# endif# ifdef SVR4# define NLIST_STRUCT# endif# ifdef sony_news# define NLIST_STRUCT# endif# ifdef OSF_ALPHA# define NLIST_STRUCT# endif# if defined (ardent) && defined (titan)# define NLIST_STRUCT# endif# ifdef tek4300# define NLIST_STRUCT# endif# ifdef butterfly# define NLIST_STRUCT# endif# if defined(alliant) && defined(i860) /* Alliant FX/2800 */# define NLIST_STRUCT# endif# ifdef _AIX# define NLIST_STRUCT# endif# endif /* defined (NLIST_STRUCT) */# if defined(sgi) || (defined(mips) && !defined(BSD))# define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))# endif# if !defined (KERNEL_FILE) && defined (sequent)# define KERNEL_FILE "/dynix"# endif# if !defined (KERNEL_FILE) && defined (hpux)# define KERNEL_FILE "/hp-ux"# endif# if !defined(KERNEL_FILE) && (defined(_SEQUENT_) || defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || (defined (ardent) && defined (titan)))# define KERNEL_FILE "/unix"# endif# if !defined (LDAV_SYMBOL) && defined (alliant)# define LDAV_SYMBOL "_Loadavg"# endif# if !defined(LDAV_SYMBOL) && ((defined(hpux) && !defined(hp9000s300)) || defined(_SEQUENT_) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX))# define LDAV_SYMBOL "avenrun"# endif# ifdef HAVE_UNISTD_H# include <unistd.h># endif# include <stdio.h># if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL))# define LOAD_AVE_TYPE double# endif# ifdef LOAD_AVE_TYPE# ifndef VMS# ifndef __linux__# ifndef NLIST_STRUCT# include <a.out.h># else /* NLIST_STRUCT */# include <nlist.h># endif /* NLIST_STRUCT */# ifdef SUNOS_5# include <fcntl.h># include <kvm.h># include <kstat.h># endif# if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)# include <sys/pstat.h># endif# ifndef KERNEL_FILE# define KERNEL_FILE "/vmunix"# endif /* KERNEL_FILE */# ifndef LDAV_SYMBOL# define LDAV_SYMBOL "_avenrun"# endif /* LDAV_SYMBOL */# endif /* __linux__ */# else /* VMS */# ifndef eunice# include <iodef.h># include <descrip.h># else /* eunice */# include <vms/iodef.h># endif /* eunice */# endif /* VMS */# ifndef LDAV_CVT# define LDAV_CVT(n) ((double) (n))# endif /* !LDAV_CVT */# endif /* LOAD_AVE_TYPE */# if defined(__GNU__) && !defined (NeXT)# define NeXT# define host_self mach_host_self# endif# ifdef NeXT# ifdef HAVE_MACH_MACH_H# include <mach/mach.h># else# include <mach.h># endif# endif /* NeXT */# ifdef sgi# include <sys/sysmp.h># endif /* sgi */# ifdef UMAX# include <stdio.h># include <signal.h># include <sys/time.h># include <sys/wait.h># include <sys/syscall.h># ifdef UMAX_43# include <machine/cpu.h># include <inq_stats/statistics.h># include <inq_stats/sysstats.h># include <inq_stats/cpustats.h># include <inq_stats/procstats.h># else /* Not UMAX_43. */# include <sys/sysdefs.h># include <sys/statistics.h># include <sys/sysstats.h># include <sys/cpudefs.h># include <sys/cpustats.h># include <sys/procstats.h># endif /* Not UMAX_43. */# endif /* UMAX */# ifdef DGUX# include <sys/dg_sys_info.h># endif# if defined(HAVE_FCNTL_H) || defined(_POSIX_VERSION)# include <fcntl.h># else# include <sys/file.h># endif# ifdef NeXTstatic processor_set_t default_set;static int getloadavg_initialized;# endif /* NeXT */# ifdef UMAXstatic unsigned int cpus = 0;static unsigned int samples;# endif /* UMAX */# ifdef DGUXstatic struct dg_sys_info_load_info load_info; /* what-a-mouthful! */# endif /* DGUX */# if !defined(HAVE_LIBKSTAT) && defined(LOAD_AVE_TYPE) && !defined(__linux__)/* File descriptor open to /dev/kmem or VMS load ave driver. */static int channel;/* Nonzero iff channel is valid. */static int getloadavg_initialized;/* Offset in kmem to seek to read load average, or 0 means invalid. */static long offset;# if !defined(VMS) && !defined(sgi) && !defined(__linux__)static struct nlist nl[2];# endif /* Not VMS or sgi */# ifdef SUNOS_5static kvm_t *kd;# endif /* SUNOS_5 */# endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT *//* Put the 1 minute, 5 minute and 15 minute load averages into the first * NELEM elements of LOADAVG. Return the number written (never more than 3, * but may be less than NELEM), or -1 if an error occurred. */static int getloadavg(double *loadavg, int nelem) { int elem = 0; /* Return value. */# ifdef NO_GET_LOAD_AVG# define LDAV_DONE /* Set errno to zero to indicate that there was no particular error; this function just can't work at all on this system. */ errno = 0; elem = -1;# endif# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT)/* Use libkstat because we don't have to be root. */# define LDAV_DONE kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *kn; kc = kstat_open (); if (kc == 0) return -1; ksp = kstat_lookup (kc, "unix", 0, "system_misc"); if (ksp == 0 ) return -1; if (kstat_read (kc, ksp, 0) == -1) return -1; kn = kstat_data_lookup (ksp, "avenrun_1min"); if (kn == 0) { /* Return -1 if no load average information is available. */ nelem = 0; elem = -1; } if (nelem >= 1) loadavg[elem++] = (double) kn->value.ul/FSCALE; if (nelem >= 2) { kn = kstat_data_lookup (ksp, "avenrun_5min"); if (kn != 0) { loadavg[elem++] = (double) kn->value.ul/FSCALE; if (nelem >= 3) { kn = kstat_data_lookup (ksp, "avenrun_15min"); if (kn != 0) loadavg[elem++] = (double) kn->value.ul/FSCALE; } } } kstat_close (kc);# endif /* HAVE_LIBKSTAT */# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)/* Use pstat_getdynamic() because we don't have to be root. */# define LDAV_DONE# undef LOAD_AVE_TYPE struct pst_dynamic dyn_info; if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0) return -1; if (nelem > 0) loadavg[elem++] = dyn_info.psd_avg_1_min; if (nelem > 1) loadavg[elem++] = dyn_info.psd_avg_5_min; if (nelem > 2) loadavg[elem++] = dyn_info.psd_avg_15_min;# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */# if !defined (LDAV_DONE) && defined (__linux__)# define LDAV_DONE# undef LOAD_AVE_TYPE# ifndef LINUX_LDAV_FILE# define LINUX_LDAV_FILE "/proc/loadavg"# endif char ldavgbuf[40]; double load_ave[3]; int fd, count; fd = open (LINUX_LDAV_FILE, O_RDONLY); if (fd == -1) return -1; count = read (fd, ldavgbuf, 40); (void) close (fd); if (count <= 0) return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -