File: main.cc

package info (click to toggle)
ftpgrab 0.1.2r-8
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, sarge
  • size: 376 kB
  • ctags: 335
  • sloc: cpp: 2,790; makefile: 26
file content (136 lines) | stat: -rw-r--r-- 3,069 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#ifndef _FGSTRING_H
#include "fgstring.h"
#endif

#ifndef _FGFILELIST_H
#include "fgfilelist.h"
#endif

#ifndef _FGLOGGER_H
#include "fglogger.h"
#endif

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>

#include <sys/utsname.h>

// Globals
#ifndef _FGGLOB_H
#include "fgglob.h"
#endif

FGString FGGlob::gHostName;
bool FGGlob::gLogDisabled = false;
int FGGlob::gMaxThreads = 5;
bool FGGlob::gVerbose = false;

void
usage(void)
{
  fprintf(stderr, "This is ftpgrab v0.1.2\n");
  fprintf(stderr, "Usage:\n");
  fprintf(stderr, "ftpgrab [-n]\n");
  fprintf(stderr, "-h             : Display this message\n");
  fprintf(stderr, "-n             : Do not output information to a log file\n");
  fprintf(stderr, "-l <filename>  : Output log to <filename> rather than default location\n");
  fprintf(stderr, "-r <filename>  : Use <filename> as rcfile rather than default\n");
  fprintf(stderr, "-t <num>       : Use up to <num> concurrent threads (1<=num<=50)\n");
  fprintf(stderr, "-v             : Output progress to console\n");
  fflush(stderr);
  exit(1);
}

int
main(int argc, char* const argv[])
{
  // Parse command line options
  char option;
  FGString rcFileName("ftpgrabrc");

  while ((option = getopt(argc, argv, "hnvl:r:t:")) != EOF) {
    switch (option) {
    case '?':
    case ':':
    case 'h':
      usage();
      break;
    case 'n':
      FGGlob::gLogDisabled = true;
      break;
    case 'l':
      FGLogger::SetLogName(optarg);
      break;
    case 'r':
      rcFileName = optarg;
      break;
    case 't':
      {
        int threads = atoi(optarg);
        if (threads < 1 || threads > 50) {
          usage();
        }
        FGGlob::gMaxThreads = threads;
      }
      break;
    case 'v':
      FGGlob::gVerbose = true;
      break;
    }
  }

  {
    // Initialize signal handling
    struct sigaction pipeAction;
    // Safety
    memset(&pipeAction, '\0', sizeof(pipeAction));
    pipeAction.sa_handler = SIG_IGN;
    pipeAction.sa_flags = 0;
    // Thanks to Christian T. Steigies
#if !defined(__alpha)
    pipeAction.sa_restorer = NULL;
#endif
    sigemptyset(&pipeAction.sa_mask);

    sigaction(SIGPIPE, &pipeAction, NULL);
  }

  {
    // Get the current hostname
    struct utsname machineDetails;
    uname(&machineDetails);

    FGGlob::gHostName = machineDetails.nodename;
  }

  try {
    (void) FGLogger::GetLogger();
  }
  catch (FGException& e) {
    fprintf(stderr, "Failed to initialize logger - bailing!\n");
    exit(1);
  }

  FGLogger& log = FGLogger::GetLogger();
  log.LogMsg("ftpgrab startup", FGLogger::kFGLLInfo);

  log.LogMsg("Attempting to parse config file", FGLogger::kFGLLVerbose);
  FGFileList list;
  try {
    list.LoadConfig(rcFileName);
  }
  catch (FGException& e) {
    log.LogException(e);
    log.LogMsg("Failed to parse config file - bailing", FGLogger::kFGLLErr);
    exit(1);
  }
  log.LogMsg("Sucessfully parsed config file", FGLogger::kFGLLVerbose);
  list.GetAllFiles();

  log.LogMsg("ftpgrab exiting", FGLogger::kFGLLInfo);

  exit(0);
}