bfb8706b0b1e2e8415a8783ec2d13d58e97cc9dc
[ppp.git] / pppd / plugins / rp-pppoe / pppoe-discovery.c
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
23 void die(int status)
24 {
25         exit(status);
26 }
27
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
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
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
107 void sysErr(char const *str)
108 {
109     rp_fatal(str);
110 }
111
112 char *xstrdup(const char *s)
113 {
114     register char *ret = strdup(s);
115     if (!ret)
116         sysErr("strdup");
117     return ret;
118 }
119
120 void usage(void)
121 {
122     fprintf(stderr, "Usage: pppoe-discovery [options]\n");
123     fprintf(stderr, "\nVersion " VERSION "\n");
124 }