ftpcount.c
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:4k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /*
  2.  * ProFTPD - FTP server daemon
  3.  * Copyright (c) 1997, 1998 Public Flood Software
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
  18.  */
  19. /* Shows "who" is online via proftpd.  Uses the /var/run/proftpd*
  20.  * log files
  21.  * $Id: ftpcount.c,v 1.3 1999/09/17 07:31:45 macgyver Exp $
  22.  */
  23. #include "conf.h"
  24. #ifdef HAVE_GETOPT_H
  25. # include <getopt.h>
  26. #endif
  27. static char *percent_complete(unsigned long size, unsigned long done)
  28. {
  29.   static char sbuf[32];
  30.   if(done < size) {
  31.     snprintf(sbuf, sizeof(sbuf), "%.0f",
  32.      ((double)done / (double)size) * 100.0);
  33.     sbuf[sizeof(sbuf) - 1] = '';
  34.   } else {
  35.     sstrncpy(sbuf, "100", sizeof(sbuf));
  36.   }
  37.   
  38.   return sbuf;
  39. }
  40. static char *idle_time(time_t *i)
  41. {
  42.   time_t now;
  43.   long l;
  44.   static char sbuf[7];
  45.   if(!i || !*i)
  46.     return "-";
  47.   else {
  48.     time(&now);
  49.     l = now - *i;
  50.     if(l < 3600) 
  51.       snprintf(sbuf, sizeof(sbuf), "%ldm%lds",(l / 60),(l % 60));
  52.     else
  53.       snprintf(sbuf, sizeof(sbuf), "%ldh%ldm",(l / 3600),
  54.       ((l - (l / 3600) * 3600) / 60));
  55.   }
  56.   return sbuf;
  57. }
  58. struct option_help {
  59.   char *long_opt,*short_opt,*desc;
  60. } opts_help[] = {
  61.   { "--help","-h", NULL },
  62.   { "--verbose","-v","display add'l information for each connection" },
  63.   { "--path","-p","specify full path to scoreboard directory" },
  64.   { NULL }
  65. };
  66. struct option opts[] = {
  67.   { "help",    0, NULL, 'h' },
  68.   { "verbose", 0, NULL, 'v' },
  69.   { "path",    1, NULL, 'p' },
  70.   { NULL,      0, NULL, 0   }
  71. };
  72. void show_usage(const char *progname, int exit_code)
  73. {
  74.   struct option_help *h;
  75.   printf("usage: %s [options]n",progname);
  76.   for(h = opts_help; h->long_opt; h++) {
  77.     printf("  %s,%sn",h->long_opt,h->short_opt);
  78.     if(!h->desc)
  79.       printf("    display %s usagen",progname);
  80.     else
  81.       printf("    %sn",h->desc);
  82.   }
  83.   exit(exit_code);
  84. }
  85. int main(int argc, char **argv)
  86. {
  87.   logrun_t *l;
  88.   pid_t oldpid = 0,mpid;
  89.   int c = 0,tot = 0;
  90.   int verbose = 0;
  91.   char *cp,*progname = *argv;
  92.   if((cp = rindex(progname,'/')) != NULL)
  93.     progname = cp+1;
  94.   opterr = 0;
  95.   while((c = getopt_long(argc,argv,"hp:v",opts,NULL)) != -1) {
  96.     switch(c) {
  97.     case 'h':
  98.       show_usage(progname,0);
  99.     case 'v':
  100.       verbose++; break;
  101.     case 'p':
  102.       log_run_setpath(optarg);
  103.       break;
  104.     case '?':
  105.       fprintf(stderr,"unknown option: %cn",(char)optopt);
  106.       show_usage(progname,1);
  107.     }
  108.   }
  109.   /* sanity check on scoreboard path */
  110.   if(log_run_checkpath() < 0) {
  111.     fprintf(stderr,"%s: %sn",log_run_getpath(),strerror(errno));
  112.     fprintf(stderr,"(Perhaps you need to specify the scoreboard path with --path, or changen");
  113.     fprintf(stderr," the compile-time default directory?)n");
  114.     exit(1);
  115.   }
  116.   c = 0;
  117.   while((l = log_read_run(&mpid)) != NULL) {
  118.     if(errno)
  119.       break;
  120.     if(!c++ || oldpid != mpid) {
  121.       if(tot)
  122.         printf("   -  %d usersnn",tot);
  123.       if(!mpid)
  124.         printf("inetd FTP connections:n");
  125.       else
  126.         printf("Master proftpd process %d:n",(int)mpid);
  127.       oldpid = mpid; tot = 0;
  128.     }
  129.     if(!strcmp(progname,"ftpwho")) {
  130.       if(l->transfer_size)
  131.         printf("%5d %-6s (%s%%) %sn",(int)l->pid,idle_time(&l->idle_since),
  132.                percent_complete(l->transfer_size,l->transfer_complete),
  133.                l->op);
  134.       else
  135.         printf("%5d %-6s %sn",(int)l->pid,idle_time(&l->idle_since),l->op);
  136.       if(verbose) {
  137.         if(l->address[0])
  138.           printf("             (host: %s)n",l->address);
  139.         if(l->cwd[0])
  140.           printf("              (cwd: %s)n",l->cwd);
  141.       }
  142.     }
  143.     tot++;
  144.   }
  145.   if(tot)
  146.     printf("   -  -      %d usersnn",tot);
  147.   return 0;
  148. }