source: pwntcha/trunk/src/main.c @ 391

Last change on this file since 391 was 391, checked in by Sam Hocevar, 18 years ago
  • check for getopt_long; work with simple getopt.
  • Property svn:keywords set to Id
File size: 3.9 KB
Line 
1/*
2 * main.c: main function
3 * $Id: main.c 391 2005-01-03 23:13:01Z sam $
4 *
5 * Copyright: (c) 2004 Sam Hocevar <sam@zoy.org>
6 *   This program is free software; you can redistribute it and/or
7 *   modify it under the terms of the Do What The Fuck You Want To
8 *   Public License as published by Banlu Kemiyatorn. See
9 *   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
10 */
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <getopt.h>
16
17#include "config.h"
18#include "common.h"
19
20#ifdef HAVE_GETOPT_LONG
21#   define MOREINFO "Try `%s --help' for more information.\n"
22#else
23#   define MOREINFO "Try `%s -h' for more information.\n"
24#endif
25
26int main(int argc, char *argv[])
27{
28    char *mode = "auto";
29
30    int c;
31    int digit_optind = 0;
32
33    for(;;)
34    {
35        int this_option_optind = optind ? optind : 1;
36#ifdef HAVE_GETOPT_LONG
37        int option_index = 0;
38        static struct option long_options[] =
39        {
40            { "mode", 1, 0, 'm' },
41            { "help", 0, 0, 'h' },
42            { "version", 0, 0, 'v' },
43            { 0, 0, 0, 0 }
44        };
45
46        c = getopt_long(argc, argv, "hm:v", long_options, &option_index);
47#else
48        c = getopt(argc, argv, "hm:v");
49#endif
50        if(c == -1)
51            break;
52
53        switch(c)
54        {
55        case 'h': /* --help */
56            printf("Usage: %s [OPTION]... FILE...\n", argv[0]);
57#ifdef HAVE_GETOPT_LONG
58            printf("  -m, --mode      force operating mode\n");
59            printf("  -h, --help      display this help and exit\n");
60            printf("  -v, --version   output version information and exit\n");
61#else
62            printf("  -m     force operating mode\n");
63            printf("  -h     display this help and exit\n");
64            printf("  -v     output version information and exit\n");
65#endif
66            return 0;
67        case 'm': /* --mode */
68            mode = optarg;
69            break;
70        case 'v': /* --version */
71            printf("pwntcha (captcha decoder) %s\n", VERSION);
72            printf("Written by Sam Hocevar.\n");
73            printf("\n");
74            printf("Copyright (C) 2004-2005 Sam Hocevar <sam@zoy.org>\n");
75            printf("This is free software; see the source for copying conditions.  There is NO\n");
76            printf("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
77            return 0;
78        case '?':
79            printf(MOREINFO, argv[0]);
80            return 1;
81        default:
82            printf("%s: invalid option -- %i\n", argv[0], c);
83            printf(MOREINFO, argv[0]);
84            return 1;
85        }
86    }
87
88    if(optind >= argc)
89    {
90        printf("%s: too few arguments\n", argv[0]);
91        printf(MOREINFO, argv[0]);
92        return 1;
93    }
94
95    for(; optind < argc; optind++)
96    {
97        char *input = argv[optind], *result;
98        struct image *img;
99
100        img = image_load(argv[optind]);
101        if(!img)
102        {
103            fprintf(stderr, "%s: cannot load %s\n", argv[0], input);
104            printf("\n");
105            continue;
106        }
107
108        if(!strcmp(mode, "test"))
109            result = decode_test(img);
110        else if(!strcmp(mode, "phpbb"))
111            result = decode_phpbb(img);
112        else if(!strcmp(mode, "slashdot"))
113            result = decode_slashdot(img);
114        else
115        {
116            if(img->width == 320 && img->height == 50)
117                result = decode_phpbb(img);
118            else if(img->height == 69)
119                result = decode_slashdot(img);
120            else
121            {
122                fprintf(stderr, "%s: could not guess captcha type\n", argv[0]);
123                printf("\n");
124                image_free(img);
125                continue;
126            }
127        }
128
129        image_free(img);
130
131        if(!result)
132        {
133            fprintf(stderr, "%s: sorry, decoding failed\n", argv[0]);
134            printf("\n");
135            continue;
136        }
137
138        printf("%s\n", result);
139        free(result);
140    }
141
142    return 0;
143}
144
Note: See TracBrowser for help on using the repository browser.