18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Perform PPPoE discovery
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (C) 2000-2001 by Roaring Penguin Software Inc.
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (C) 2004 Marco d'Itri <md@linux.it>
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * This program may be distributed according to the terms of the GNU
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * General Public License, version 2 or (at your option) any later version.
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdio.h>
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdlib.h>
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <unistd.h>
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <errno.h>
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h>
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppoe.h"
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *xstrdup(const char *s);
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid usage(void);
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid die(int status)
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	exit(status);
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint main(int argc, char *argv[])
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int opt;
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    PPPoEConnection *conn;
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn = malloc(sizeof(PPPoEConnection));
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!conn)
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fatalSys("malloc");
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    memset(conn, 0, sizeof(PPPoEConnection));
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    while ((opt = getopt(argc, argv, "I:D:VUAS:C:h")) > 0) {
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	switch(opt) {
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'S':
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    conn->serviceName = xstrdup(optarg);
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'C':
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    conn->acName = xstrdup(optarg);
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'U':
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    conn->useHostUniq = 1;
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'D':
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    conn->debugFile = fopen(optarg, "w");
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (!conn->debugFile) {
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		fprintf(stderr, "Could not open %s: %s\n",
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			optarg, strerror(errno));
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		exit(1);
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    fprintf(conn->debugFile, "pppoe-discovery %s\n", VERSION);
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'I':
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    conn->ifName = xstrdup(optarg);
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'A':
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    /* this is the default */
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    break;
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'V':
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	case 'h':
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    usage();
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    exit(0);
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	default:
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    usage();
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    exit(1);
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    /* default interface name */
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!conn->ifName)
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	conn->ifName = strdup("eth0");
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn->discoverySocket = -1;
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn->sessionSocket = -1;
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    conn->printACNames = 1;
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    discovery(conn);
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    exit(0);
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid rp_fatal(char const *str)
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char buf[1024];
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    printErr(str);
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sprintf(buf, "pppoe-discovery: %.256s", str);
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    exit(1);
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid fatalSys(char const *str)
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    char buf[1024];
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    int i = errno;
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sprintf(buf, "%.256s: %.256s", str, strerror(i));
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    printErr(buf);
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    sprintf(buf, "pppoe-discovery: %.256s: %.256s", str, strerror(i));
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    exit(1);
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid sysErr(char const *str)
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    rp_fatal(str);
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *xstrdup(const char *s)
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    register char *ret = strdup(s);
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    if (!ret)
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	sysErr("strdup");
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return ret;
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid usage(void)
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fprintf(stderr, "Usage: pppoe-discovery [options]\n");
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    fprintf(stderr, "\nVersion " VERSION "\n");
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
125