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