1 /*
2 * Perform PPPoE discovery
3 *
4 * Copyright (C) 2000-2001 by Roaring Penguin Software Inc.
5 * Copyright (C) 2004 Marco d'Itri <md@linux.it>
6 *
7 * This program may be distributed according to the terms of the GNU
8 * General Public License, version 2 or (at your option) any later version.
9 *
10 */
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15 #include <errno.h>
16 #include <string.h>
17
18 #include "pppoe.h"
19
20 char *xstrdup(const char *s);
21 void usage(void);
22
die(int status)23 void die(int status)
24 {
25 exit(status);
26 }
27
main(int argc,char * argv[])28 int main(int argc, char *argv[])
29 {
30 int opt;
31 PPPoEConnection *conn;
32
33 conn = malloc(sizeof(PPPoEConnection));
34 if (!conn)
35 fatalSys("malloc");
36
37 memset(conn, 0, sizeof(PPPoEConnection));
38
39 while ((opt = getopt(argc, argv, "I:D:VUAS:C:h")) > 0) {
40 switch(opt) {
41 case 'S':
42 conn->serviceName = xstrdup(optarg);
43 break;
44 case 'C':
45 conn->acName = xstrdup(optarg);
46 break;
47 case 'U':
48 conn->useHostUniq = 1;
49 break;
50 case 'D':
51 conn->debugFile = fopen(optarg, "w");
52 if (!conn->debugFile) {
53 fprintf(stderr, "Could not open %s: %s\n",
54 optarg, strerror(errno));
55 exit(1);
56 }
57 fprintf(conn->debugFile, "pppoe-discovery %s\n", VERSION);
58 break;
59 case 'I':
60 conn->ifName = xstrdup(optarg);
61 break;
62 case 'A':
63 /* this is the default */
64 break;
65 case 'V':
66 case 'h':
67 usage();
68 exit(0);
69 default:
70 usage();
71 exit(1);
72 }
73 }
74
75 /* default interface name */
76 if (!conn->ifName)
77 conn->ifName = strdup("eth0");
78
79 conn->discoverySocket = -1;
80 conn->sessionSocket = -1;
81 conn->printACNames = 1;
82
83 discovery(conn);
84 exit(0);
85 }
86
rp_fatal(char const * str)87 void rp_fatal(char const *str)
88 {
89 char buf[1024];
90
91 printErr(str);
92 sprintf(buf, "pppoe-discovery: %.256s", str);
93 exit(1);
94 }
95
fatalSys(char const * str)96 void fatalSys(char const *str)
97 {
98 char buf[1024];
99 int i = errno;
100
101 sprintf(buf, "%.256s: %.256s", str, strerror(i));
102 printErr(buf);
103 sprintf(buf, "pppoe-discovery: %.256s: %.256s", str, strerror(i));
104 exit(1);
105 }
106
sysErr(char const * str)107 void sysErr(char const *str)
108 {
109 rp_fatal(str);
110 }
111
xstrdup(const char * s)112 char *xstrdup(const char *s)
113 {
114 register char *ret = strdup(s);
115 if (!ret)
116 sysErr("strdup");
117 return ret;
118 }
119
usage(void)120 void usage(void)
121 {
122 fprintf(stderr, "Usage: pppoe-discovery [options]\n");
123 fprintf(stderr, "\nVersion " VERSION "\n");
124 }
125