options.c revision 8ad0dd2a5c5f23cd210aedba72a43e48026e7436
18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * options.c - handles option processing for PPP. 38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. 58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Redistribution and use in source and binary forms, with or without 78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * modification, are permitted provided that the following conditions 88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * are met: 98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice, this list of conditions and the following disclaimer. 128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice, this list of conditions and the following disclaimer in 158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the documentation and/or other materials provided with the 168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * distribution. 178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3. The name "Carnegie Mellon University" must not be used to 198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * endorse or promote products derived from this software without 208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * prior written permission. For permission or any legal 218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * details, please contact 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Office of Technology Transfer 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Carnegie Mellon University 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 5000 Forbes Avenue 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Pittsburgh, PA 15213-3890 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * (412) 268-4387, fax: (412) 268-7395 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * tech-transfer@andrew.cmu.edu 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 4. Redistributions of any form whatsoever must retain the following 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * acknowledgment: 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * "This product includes software developed by Computing Services 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * at Carnegie Mellon University (http://www.cmu.edu/computing/)." 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define RCSID "$Id: options.c,v 1.95 2004/11/09 22:33:35 paulus Exp $" 448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <ctype.h> 468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdio.h> 478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <errno.h> 488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <unistd.h> 498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <fcntl.h> 508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdlib.h> 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <syslog.h> 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h> 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <pwd.h> 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PLUGIN 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <dlfcn.h> 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PPP_FILTER 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <pcap.h> 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * DLT_PPP_WITH_DIRECTION is in current libpcap cvs, and should be in 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * libpcap-0.8.4. Until that is released, use DLT_PPP - but that means 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * we lose the inbound and outbound qualifiers. 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef DLT_PPP_WITH_DIRECTION 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define DLT_PPP_WITH_DIRECTION DLT_PPP 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd.h" 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pathnames.h" 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(ultrix) || defined(NeXT) 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *strdup __P((char *)); 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic const char rcsid[] = RCSID; 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct option_value { 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct option_value *next; 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project const char *source; 838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char value[1]; 848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Option variables and default values. 888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint debug = 0; /* Debug flag */ 908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint kdebugflag = 0; /* Tell kernel to print debug messages */ 918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint default_device = 1; /* Using /dev/tty or equivalent */ 928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar devnam[MAXPATHLEN]; /* Device name */ 938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool nodetach = 0; /* Don't detach from controlling tty */ 948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool updetach = 0; /* Detach once link is up */ 958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint maxconnect = 0; /* Maximum connect time */ 968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar user[MAXNAMELEN]; /* Username for PAP */ 978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar passwd[MAXSECRETLEN]; /* Password for PAP */ 988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool persist = 0; /* Reopen link after it goes down */ 998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar our_name[MAXNAMELEN]; /* Our name for authentication purposes */ 1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool demand = 0; /* do dial-on-demand */ 1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *ipparam = NULL; /* Extra parameter for ip up/down scripts */ 1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint idle_time_limit = 0; /* Disconnect if idle for this many seconds */ 1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint holdoff = 30; /* # seconds to pause before reconnecting */ 1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool holdoff_specified; /* true if a holdoff value has been given */ 1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint log_to_fd = 1; /* send log messages to this fd too */ 1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool log_default = 1; /* log_to_fd is default (stdout) */ 1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint maxfail = 10; /* max # of unsuccessful connection attempts */ 1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar linkname[MAXPATHLEN]; /* logical name for link */ 1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool tune_kernel; /* may alter kernel settings */ 1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint connect_delay = 1000; /* wait this many ms after connect script */ 1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint req_unit = -1; /* requested interface unit */ 1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool multilink = 0; /* Enable multilink operation */ 1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *bundle_name = NULL; /* bundle name for multilink */ 1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool dump_options; /* print out option values */ 1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool dryrun; /* print out option values and exit */ 1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *domain; /* domain name set by domain option */ 1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint child_wait = 5; /* # seconds to wait for children at exit */ 1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef MAXOCTETS 1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectunsigned int maxoctets = 0; /* default - no limit */ 1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint maxoctets_dir = 0; /* default - sum of traffic */ 1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint maxoctets_timeout = 1; /* default 1 second */ 1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern option_t auth_options[]; 1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern struct stat devstat; 1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PPP_FILTER 1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct bpf_program pass_filter;/* Filter program for packets to pass */ 1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct bpf_program active_filter; /* Filter program for link-active pkts */ 1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *current_option; /* the name of the option being parsed */ 1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint privileged_option; /* set iff the current option came from root */ 1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectchar *option_source; /* string saying where the option came from */ 1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint option_priority = OPRIO_CFGFILE; /* priority of the current options */ 1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectbool devnam_fixed; /* can no longer change device name */ 1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int logfile_fd = -1; /* fd opened for log file */ 1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char logfile_name[MAXPATHLEN]; /* name of log file */ 1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Prototypes 1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int setdomain __P((char **)); 1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int readfile __P((char **)); 1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int callfile __P((char **)); 1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int showversion __P((char **)); 1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int showhelp __P((char **)); 1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void usage __P((void)); 1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int setlogfile __P((char **)); 1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PLUGIN 1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int loadplugin __P((char **)); 1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PPP_FILTER 1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int setpassfilter __P((char **)); 1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int setactivefilter __P((char **)); 1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef MAXOCTETS 1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int setmodir __P((char **)); 1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic option_t *find_option __P((const char *name)); 1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int process_option __P((option_t *, char *, char **)); 1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int n_arguments __P((option_t *)); 1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int number_option __P((char *, u_int32_t *, int)); 1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Structure to store extra lists of options. 1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstruct option_list { 1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *options; 1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct option_list *next; 1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic struct option_list *extra_options = NULL; 1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Valid arguments. 1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectoption_t general_options[] = { 1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "debug", o_int, &debug, 1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Increase debugging level", OPT_INC | OPT_NOARG | 1 }, 1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "-d", o_int, &debug, 1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Increase debugging level", 1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_ALIAS | OPT_INC | OPT_NOARG | 1 }, 1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "kdebug", o_int, &kdebugflag, 1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Set kernel driver debug level", OPT_PRIO }, 1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "nodetach", o_bool, &nodetach, 1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Don't detach from controlling tty", OPT_PRIO | 1 }, 1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "-detach", o_bool, &nodetach, 1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Don't detach from controlling tty", OPT_ALIAS | OPT_PRIOSUB | 1 }, 1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "updetach", o_bool, &updetach, 1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Detach from controlling tty once link is up", 2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIOSUB | OPT_A2CLR | 1, &nodetach }, 2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "holdoff", o_int, &holdoff, 2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Set time in seconds before retrying connection", 2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO, &holdoff_specified }, 2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "idle", o_int, &idle_time_limit, 2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Set time in seconds before disconnecting idle link", OPT_PRIO }, 2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "maxconnect", o_int, &maxconnect, 2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Set connection time limit", 2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO | OPT_LLIMIT | OPT_NOINCR | OPT_ZEROINF }, 2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "domain", o_special, (void *)setdomain, 2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Add given domain name to hostname", 2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO | OPT_PRIV | OPT_A2STRVAL, &domain }, 2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "file", o_special, (void *)readfile, 2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Take options from a file", OPT_NOPRINT }, 2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "call", o_special, (void *)callfile, 2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Take options from a privileged file", OPT_NOPRINT }, 2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "persist", o_bool, &persist, 2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Keep on reopening connection after close", OPT_PRIO | 1 }, 2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "nopersist", o_bool, &persist, 2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Turn off persist option", OPT_PRIOSUB }, 2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "demand", o_bool, &demand, 2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Dial on demand", OPT_INITONLY | 1, &persist }, 2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "--version", o_special_noarg, (void *)showversion, 2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Show version number" }, 2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "--help", o_special_noarg, (void *)showhelp, 2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Show brief listing of options" }, 2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "-h", o_special_noarg, (void *)showhelp, 2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Show brief listing of options", OPT_ALIAS }, 2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "logfile", o_special, (void *)setlogfile, 2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Append log messages to this file", 2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, &logfile_name }, 2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "logfd", o_int, &log_to_fd, 2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Send log messages to this file descriptor", 2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIOSUB | OPT_A2CLR, &log_default }, 2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "nolog", o_int, &log_to_fd, 2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Don't send log messages to any file", 2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIOSUB | OPT_NOARG | OPT_VAL(-1) }, 2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "nologfd", o_int, &log_to_fd, 2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Don't send log messages to any file descriptor", 2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIOSUB | OPT_ALIAS | OPT_NOARG | OPT_VAL(-1) }, 2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "linkname", o_string, linkname, 2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Set logical name for link", 2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXPATHLEN }, 2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "maxfail", o_int, &maxfail, 2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Maximum number of unsuccessful connection attempts to allow", 2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO }, 2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "ktune", o_bool, &tune_kernel, 2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Alter kernel settings as necessary", OPT_PRIO | 1 }, 2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "noktune", o_bool, &tune_kernel, 2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Don't alter kernel settings", OPT_PRIOSUB }, 2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "connect-delay", o_int, &connect_delay, 2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Maximum time (in ms) to wait after connect script finishes", 2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO }, 2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "unit", o_int, &req_unit, 2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "PPP interface unit number to use if possible", 2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO | OPT_LLIMIT, 0, 0 }, 2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "dump", o_bool, &dump_options, 2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Print out option values after parsing all options", 1 }, 2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "dryrun", o_bool, &dryrun, 2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Stop after parsing, printing, and checking options", 1 }, 2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "child-timeout", o_int, &child_wait, 2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Number of seconds to wait for child processes at exit", 2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO }, 2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef HAVE_MULTILINK 2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "multilink", o_bool, &multilink, 2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Enable multilink operation", OPT_PRIO | 1 }, 2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "mp", o_bool, &multilink, 2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Enable multilink operation", OPT_PRIOSUB | OPT_ALIAS | 1 }, 2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "nomultilink", o_bool, &multilink, 2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Disable multilink operation", OPT_PRIOSUB | 0 }, 2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "nomp", o_bool, &multilink, 2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Disable multilink operation", OPT_PRIOSUB | OPT_ALIAS | 0 }, 2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "bundle", o_string, &bundle_name, 2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Bundle name for multilink", OPT_PRIO }, 2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* HAVE_MULTILINK */ 2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PLUGIN 2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "plugin", o_special, (void *)loadplugin, 2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Load a plug-in module into pppd", OPT_PRIV | OPT_A2LIST }, 2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PPP_FILTER 3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "pass-filter", 1, setpassfilter, 3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "set filter for packets to pass", OPT_PRIO }, 3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "active-filter", 1, setactivefilter, 3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "set filter for active pkts", OPT_PRIO }, 3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef MAXOCTETS 3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "maxoctets", o_int, &maxoctets, 3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Set connection traffic limit", 3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_PRIO | OPT_LLIMIT | OPT_NOINCR | OPT_ZEROINF }, 3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "mo", o_int, &maxoctets, 3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Set connection traffic limit", 3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project OPT_ALIAS | OPT_PRIO | OPT_LLIMIT | OPT_NOINCR | OPT_ZEROINF }, 3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "mo-direction", o_special, setmodir, 3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Set direction for limit traffic (sum,in,out,max)" }, 3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { "mo-timeout", o_int, &maxoctets_timeout, 3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "Check for traffic limit every N seconds", OPT_PRIO | OPT_LLIMIT | 1 }, 3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project { NULL } 3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}; 3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef IMPLEMENTATION 3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define IMPLEMENTATION "" 3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic char *usage_string = "\ 3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectpppd version %s\n\ 3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectUsage: %s [ options ], where options are:\n\ 3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project <device> Communicate over the named device\n\ 3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project <speed> Set the baud rate to <speed>\n\ 3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project <loc>:<rem> Set the local and/or remote interface IP\n\ 3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project addresses. Either one may be omitted.\n\ 3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project asyncmap <n> Set the desired async map to hex <n>\n\ 3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project auth Require authentication from peer\n\ 3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project connect <p> Invoke shell command <p> to set up the serial line\n\ 3378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project crtscts Use hardware RTS/CTS flow control\n\ 3388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project defaultroute Add default route through interface\n\ 3398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project file <f> Take options from file <f>\n\ 3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project modem Use modem control lines\n\ 3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project mru <n> Set MRU value to <n> for negotiation\n\ 3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectSee pppd(8) for more options.\n\ 3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project"; 3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * parse_args - parse a string of arguments from the command line. 3478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectparse_args(argc, argv) 3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int argc; 3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *arg; 3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int n; 3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project privileged_option = privileged; 3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_source = "command line"; 3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_priority = OPRIO_CMDLINE; 3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (argc > 0) { 3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project arg = *argv++; 3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project --argc; 3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt = find_option(arg); 3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt == NULL) { 3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("unrecognized option '%s'", arg); 3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project usage(); 3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project n = n_arguments(opt); 3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (argc < n) { 3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("too few parameters for option %s", arg); 3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!process_option(opt, arg, argv)) 3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project argc -= n; 3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project argv += n; 3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * options_from_file - Read a string of options from a file, 3848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and interpret them. 3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 3868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 3878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectoptions_from_file(filename, must_exist, check_prot, priv) 3888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *filename; 3898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int must_exist; 3908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int check_prot; 3918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int priv; 3928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 3938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project FILE *f; 3948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i, newline, ret, err; 3958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 3968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int oldpriv, n; 3978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *oldsource; 3988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *argv[MAXARGS]; 3998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char args[MAXARGS][MAXWORDLEN]; 4008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char cmd[MAXWORDLEN]; 4018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (check_prot) 4038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project seteuid(getuid()); 4048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project f = fopen(filename, "r"); 4058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project err = errno; 4068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (check_prot) 4078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project seteuid(0); 4088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (f == NULL) { 4098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project errno = err; 4108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!must_exist) { 4118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (err != ENOENT && err != ENOTDIR) 4128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project warn("Warning: can't open options file %s: %m", filename); 4138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 4148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("Can't open options file %s: %m", filename); 4168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 4178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project oldpriv = privileged_option; 4208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project privileged_option = priv; 4218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project oldsource = option_source; 4228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_source = strdup(filename); 4238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (option_source == NULL) 4248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_source = "file"; 4258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ret = 0; 4268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (getword(f, cmd, &newline, filename)) { 4278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt = find_option(cmd); 4288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt == NULL) { 4298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("In file %s: unrecognized option '%s'", 4308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project filename, cmd); 4318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto err; 4328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project n = n_arguments(opt); 4348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i = 0; i < n; ++i) { 4358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!getword(f, args[i], &newline, filename)) { 4368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error( 4378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "In file %s: too few parameters for option '%s'", 4388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project filename, cmd); 4398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto err; 4408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project argv[i] = args[i]; 4428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!process_option(opt, cmd, argv)) 4448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto err; 4458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 4468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ret = 1; 4478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecterr: 4498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fclose(f); 4508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project privileged_option = oldpriv; 4518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_source = oldsource; 4528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ret; 4538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 4548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 4568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * options_from_user - See if the use has a ~/.ppprc file, 4578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and if so, interpret options from it. 4588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 4598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 4608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectoptions_from_user() 4618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 4628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *user, *path, *file; 4638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int ret; 4648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct passwd *pw; 4658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project size_t pl; 4668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pw = getpwuid(getuid()); 4688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (pw == NULL || (user = pw->pw_dir) == NULL || user[0] == 0) 4698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 4708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project file = _PATH_USEROPT; 4718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pl = strlen(user) + strlen(file) + 2; 4728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project path = malloc(pl); 4738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (path == NULL) 4748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("init file name"); 4758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project slprintf(path, pl, "%s/%s", user, file); 4768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_priority = OPRIO_CFGFILE; 4778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ret = options_from_file(path, 0, 1, privileged); 4788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project free(path); 4798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ret; 4808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 4818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 4838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * options_for_tty - See if an options file exists for the serial 4848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * device, and if so, interpret options from it. 4858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * We only allow the per-tty options file to override anything from 4868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the command line if it is something that the user can't override 4878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * once it has been set by root; this is done by giving configuration 4888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * files a lower priority than the command line. 4898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 4908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 4918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectoptions_for_tty() 4928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 4938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *dev, *path, *p; 4948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int ret; 4958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project size_t pl; 4968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 4978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dev = devnam; 4988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((p = strstr(dev, "/dev/")) != NULL) 4998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dev = p + 5; 5008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (dev[0] == 0 || strcmp(dev, "tty") == 0) 5018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; /* don't look for /etc/ppp/options.tty */ 5028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pl = strlen(_PATH_TTYOPT) + strlen(dev) + 1; 5038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project path = malloc(pl); 5048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (path == NULL) 5058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("tty init file name"); 5068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project slprintf(path, pl, "%s%s", _PATH_TTYOPT, dev); 5078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* Turn slashes into dots, for Solaris case (e.g. /dev/term/a) */ 5088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (p = path + strlen(_PATH_TTYOPT); *p != 0; ++p) 5098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (*p == '/') 5108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *p = '.'; 5118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_priority = OPRIO_CFGFILE; 5128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ret = options_from_file(path, 0, 0, 1); 5138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project free(path); 5148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ret; 5158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 5168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 5178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 5188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * options_from_list - process a string of options in a wordlist. 5198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 5208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 5218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectoptions_from_list(w, priv) 5228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct wordlist *w; 5238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int priv; 5248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 5258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *argv[MAXARGS]; 5268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 5278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i, n, ret = 0; 5288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct wordlist *w0; 5298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 5308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project privileged_option = priv; 5318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_source = "secrets file"; 5328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_priority = OPRIO_SECFILE; 5338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 5348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (w != NULL) { 5358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt = find_option(w->word); 5368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt == NULL) { 5378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("In secrets file: unrecognized option '%s'", 5388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project w->word); 5398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto err; 5408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 5418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project n = n_arguments(opt); 5428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project w0 = w; 5438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i = 0; i < n; ++i) { 5448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project w = w->next; 5458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (w == NULL) { 5468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error( 5478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project "In secrets file: too few parameters for option '%s'", 5488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project w0->word); 5498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto err; 5508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 5518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project argv[i] = w->word; 5528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 5538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!process_option(opt, w0->word, argv)) 5548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto err; 5558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project w = w->next; 5568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 5578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ret = 1; 5588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 5598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projecterr: 5608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ret; 5618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 5628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 5638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 5648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * match_option - see if this option matches an option_t structure. 5658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 5668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 5678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectmatch_option(name, opt, dowild) 5688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *name; 5698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 5708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int dowild; 5718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 5728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*match) __P((char *, char **, int)); 5738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 5748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (dowild != (opt->type == o_wild)) 5758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 5768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!dowild) 5778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return strcmp(name, opt->name) == 0; 5788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project match = (int (*) __P((char *, char **, int))) opt->addr; 5798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (*match)(name, NULL, 0); 5808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 5818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 5828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 5838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * find_option - scan the option lists for the various protocols 5848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * looking for an entry with the given name. 5858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * This could be optimized by using a hash table. 5868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 5878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic option_t * 5888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectfind_option(name) 5898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project const char *name; 5908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 5918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 5928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct option_list *list; 5938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i, dowild; 5948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 5958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (dowild = 0; dowild <= 1; ++dowild) { 5968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (opt = general_options; opt->name != NULL; ++opt) 5978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (match_option(name, opt, dowild)) 5988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return opt; 5998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (opt = auth_options; opt->name != NULL; ++opt) 6008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (match_option(name, opt, dowild)) 6018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return opt; 6028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (list = extra_options; list != NULL; list = list->next) 6038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (opt = list->options; opt->name != NULL; ++opt) 6048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (match_option(name, opt, dowild)) 6058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return opt; 6068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (opt = the_channel->options; opt->name != NULL; ++opt) 6078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (match_option(name, opt, dowild)) 6088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return opt; 6098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i = 0; protocols[i] != NULL; ++i) 6108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt = protocols[i]->options) != NULL) 6118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (; opt->name != NULL; ++opt) 6128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (match_option(name, opt, dowild)) 6138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return opt; 6148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 6158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return NULL; 6168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 6178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 6188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 6198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * process_option - process one new-style option. 6208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 6218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 6228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectprocess_option(opt, cmd, argv) 6238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 6248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *cmd; 6258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 6268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 6278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_int32_t v; 6288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int iv, a; 6298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *sv; 6308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*parser) __P((char **)); 6318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int (*wildp) __P((char *, char **, int)); 6328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *optopt = (opt->type == o_wild)? "": " option"; 6338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int prio = option_priority; 6348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *mainopt = opt; 6358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 6368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project current_option = opt->name; 6378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_PRIVFIX) && privileged_option) 6388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project prio += OPRIO_ROOT; 6398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (mainopt->flags & OPT_PRIOSUB) 6408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project --mainopt; 6418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (mainopt->flags & OPT_PRIO) { 6428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (prio < mainopt->priority) { 6438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* new value doesn't override old */ 6448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (prio == OPRIO_CMDLINE && mainopt->priority > OPRIO_ROOT) { 6458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s%s set in %s cannot be overridden\n", 6468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->name, optopt, mainopt->source); 6478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 6488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 6498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 6508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 6518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (prio > OPRIO_ROOT && mainopt->priority == OPRIO_CMDLINE) 6528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project warn("%s%s from %s overrides command line", 6538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->name, optopt, option_source); 6548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 6558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 6568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_INITONLY) && phase != PHASE_INITIALIZE) { 6578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s%s cannot be changed after initialization", 6588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->name, optopt); 6598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 6608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 6618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_PRIV) && !privileged_option) { 6628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("using the %s%s requires root privilege", 6638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->name, optopt); 6648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 6658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 6668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_ENABLE) && *(bool *)(opt->addr2) == 0) { 6678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s%s is disabled", opt->name, optopt); 6688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 6698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 6708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_DEVEQUIV) && devnam_fixed) { 6718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("the %s%s may not be changed in %s", 6728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->name, optopt, option_source); 6738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 6748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 6758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 6768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project switch (opt->type) { 6778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_bool: 6788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project v = opt->flags & OPT_VALUE; 6798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(bool *)(opt->addr) = v; 6808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->addr2 && (opt->flags & OPT_A2COPY)) 6818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(bool *)(opt->addr2) = v; 6828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (opt->addr2 && (opt->flags & OPT_A2CLR)) 6838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(bool *)(opt->addr2) = 0; 6848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (opt->addr2 && (opt->flags & OPT_A2CLRB)) 6858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(u_char *)(opt->addr2) &= ~v; 6868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else if (opt->addr2 && (opt->flags & OPT_A2OR)) 6878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(u_char *)(opt->addr2) |= v; 6888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 6898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 6908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_int: 6918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project iv = 0; 6928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_NOARG) == 0) { 6938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!int_option(*argv, &iv)) 6948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 6958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((((opt->flags & OPT_LLIMIT) && iv < opt->lower_limit) 6968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project || ((opt->flags & OPT_ULIMIT) && iv > opt->upper_limit)) 6978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project && !((opt->flags & OPT_ZEROOK && iv == 0))) { 6988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *zok = (opt->flags & OPT_ZEROOK)? " zero or": ""; 6998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project switch (opt->flags & OPT_LIMITS) { 7008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case OPT_LLIMIT: 7018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s value must be%s >= %d", 7028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->name, zok, opt->lower_limit); 7038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 7048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case OPT_ULIMIT: 7058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s value must be%s <= %d", 7068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->name, zok, opt->upper_limit); 7078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 7088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case OPT_LIMITS: 7098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s value must be%s between %d and %d", 7108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->name, zok, opt->lower_limit, opt->upper_limit); 7118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 7128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 7148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project a = opt->flags & OPT_VALUE; 7178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (a >= 128) 7188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project a -= 256; /* sign extend */ 7198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project iv += a; 7208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_INC) 7218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project iv += *(int *)(opt->addr); 7228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_NOINCR) && !privileged_option) { 7238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int oldv = *(int *)(opt->addr); 7248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_ZEROINF) ? 7258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (oldv != 0 && (iv == 0 || iv > oldv)) : (iv > oldv)) { 7268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s value cannot be increased", opt->name); 7278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 7288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(int *)(opt->addr) = iv; 7318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->addr2 && (opt->flags & OPT_A2COPY)) 7328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(int *)(opt->addr2) = iv; 7338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 7348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_uint32: 7368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_NOARG) { 7378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project v = opt->flags & OPT_VALUE; 7388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (v & 0x80) 7398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project v |= 0xffffff00U; 7408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else if (!number_option(*argv, &v, 16)) 7418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 7428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_OR) 7438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project v |= *(u_int32_t *)(opt->addr); 7448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(u_int32_t *)(opt->addr) = v; 7458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->addr2 && (opt->flags & OPT_A2COPY)) 7468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(u_int32_t *)(opt->addr2) = v; 7478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 7488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_string: 7508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_STATIC) { 7518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strlcpy((char *)(opt->addr), *argv, opt->upper_limit); 7528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 7538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project sv = strdup(*argv); 7548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sv == NULL) 7558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("option argument"); 7568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(char **)(opt->addr) = sv; 7578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 7598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_special_noarg: 7618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_special: 7628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project parser = (int (*) __P((char **))) opt->addr; 7638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!(*parser)(argv)) 7648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 7658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_A2LIST) { 7668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct option_value *ovp, **pp; 7678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ovp = malloc(sizeof(*ovp) + strlen(*argv)); 7698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (ovp != 0) { 7708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strcpy(ovp->value, *argv); 7718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ovp->source = option_source; 7728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ovp->next = NULL; 7738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pp = (struct option_value **) &opt->addr2; 7748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (*pp != 0) 7758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pp = &(*pp)->next; 7768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *pp = ovp; 7778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 7808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_wild: 7828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project wildp = (int (*) __P((char *, char **, int))) opt->addr; 7838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!(*wildp)(cmd, argv, 1)) 7848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 7858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 7868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 7878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->addr2 && (opt->flags & (OPT_A2COPY|OPT_ENABLE 7898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project |OPT_A2PRINTER|OPT_A2STRVAL|OPT_A2LIST|OPT_A2OR)) == 0) 7908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *(bool *)(opt->addr2) = !(opt->flags & OPT_A2CLR); 7918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project mainopt->source = option_source; 7938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project mainopt->priority = prio; 7948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project mainopt->winner = opt - mainopt; 7958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 7978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 7988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 7998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 8008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * override_value - if the option priorities would permit us to 8018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * override the value of option, return 1 and update the priority 8028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and source of the option value. Otherwise returns 0. 8038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 8048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 8058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectoverride_value(option, priority, source) 8068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project const char *option; 8078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int priority; 8088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project const char *source; 8098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 8108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 8118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 8128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt = find_option(option); 8138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt == NULL) 8148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 8158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (opt->flags & OPT_PRIOSUB) 8168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project --opt; 8178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_PRIO) && priority < opt->priority) 8188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 8198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->priority = priority; 8208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->source = source; 8218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project opt->winner = -1; 8228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 8238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 8248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 8258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 8268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * n_arguments - tell how many arguments an option takes 8278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 8288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 8298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectn_arguments(opt) 8308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 8318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 8328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (opt->type == o_bool || opt->type == o_special_noarg 8338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project || (opt->flags & OPT_NOARG))? 0: 1; 8348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 8358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 8368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 8378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * add_options - add a list of options to the set we grok. 8388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 8398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 8408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectadd_options(opt) 8418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 8428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 8438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct option_list *list; 8448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 8458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project list = malloc(sizeof(*list)); 8468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (list == 0) 8478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("option list entry"); 8488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project list->options = opt; 8498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project list->next = extra_options; 8508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project extra_options = list; 8518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 8528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 8538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 8548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * check_options - check that options are valid and consistent. 8558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 8568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 8578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectcheck_options() 8588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 8598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (logfile_fd >= 0 && logfile_fd != log_to_fd) 8608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project close(logfile_fd); 8618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 8628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 8638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 8648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * print_option - print out an option and its value 8658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 8668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 8678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectprint_option(opt, mainopt, printer, arg) 8688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt, *mainopt; 8698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*printer) __P((void *, char *, ...)); 8708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void *arg; 8718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 8728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i, v; 8738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *p; 8748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 8758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_NOPRINT) 8768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return; 8778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project switch (opt->type) { 8788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_bool: 8798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project v = opt->flags & OPT_VALUE; 8808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (*(bool *)opt->addr != v) 8818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* this can happen legitimately, e.g. lock 8828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option turned off for default device */ 8838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 8848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "%s", opt->name); 8858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 8868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_int: 8878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project v = opt->flags & OPT_VALUE; 8888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (v >= 128) 8898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project v -= 256; 8908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project i = *(int *)opt->addr; 8918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_NOARG) { 8928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "%s", opt->name); 8938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (i != v) { 8948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_INC) { 8958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (; i > v; i -= v) 8968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, " %s", opt->name); 8978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else 8988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, " # oops: %d not %d\n", 8998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project i, v); 9008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 9018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 9028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "%s %d", opt->name, i); 9038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 9048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 9058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_uint32: 9068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "%s", opt->name); 9078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_NOARG) == 0) 9088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, " %x", *(u_int32_t *)opt->addr); 9098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 9108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 9118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_string: 9128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_HIDE) { 9138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project p = "??????"; 9148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 9158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project p = (char *) opt->addr; 9168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_STATIC) == 0) 9178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project p = *(char **)p; 9188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 9198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "%s %q", opt->name, p); 9208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 9218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 9228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_special: 9238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_special_noarg: 9248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case o_wild: 9258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->type != o_wild) { 9268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "%s", opt->name); 9278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (n_arguments(opt) == 0) 9288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 9298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, " "); 9308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 9318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->flags & OPT_A2PRINTER) { 9328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*oprt) __P((option_t *, 9338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void ((*)__P((void *, char *, ...))), 9348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void *)); 9358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project oprt = (void (*) __P((option_t *, 9368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void ((*)__P((void *, char *, ...))), 9378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void *)))opt->addr2; 9388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (*oprt)(opt, printer, arg); 9398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else if (opt->flags & OPT_A2STRVAL) { 9408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project p = (char *) opt->addr2; 9418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((opt->flags & OPT_STATIC) == 0) 9428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project p = *(char **)p; 9438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer("%q", p); 9448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else if (opt->flags & OPT_A2LIST) { 9458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct option_value *ovp; 9468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 9478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ovp = (struct option_value *) opt->addr2; 9488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (;;) { 9498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "%q", ovp->value); 9508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((ovp = ovp->next) == NULL) 9518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 9528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "\t\t# (from %s)\n%s ", 9538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ovp->source, opt->name); 9548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 9558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 9568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "xxx # [don't know how to print value]"); 9578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 9588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 9598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 9608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project default: 9618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "# %s value (type %d\?\?)", opt->name, opt->type); 9628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 9638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 9648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "\t\t# (from %s)\n", mainopt->source); 9658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 9668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 9678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 9688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * print_option_list - print out options in effect from an 9698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * array of options. 9708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 9718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 9728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectprint_option_list(opt, printer, arg) 9738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_t *opt; 9748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*printer) __P((void *, char *, ...)); 9758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void *arg; 9768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 9778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (opt->name != NULL) { 9788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (opt->priority != OPRIO_DEFAULT 9798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project && opt->winner != (short int) -1) 9808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project print_option(opt + opt->winner, opt, printer, arg); 9818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project do { 9828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ++opt; 9838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } while (opt->flags & OPT_PRIOSUB); 9848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 9858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 9868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 9878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 9888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * print_options - print out what options are in effect. 9898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 9908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 9918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectprint_options(printer, arg) 9928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*printer) __P((void *, char *, ...)); 9938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void *arg; 9948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 9958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct option_list *list; 9968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i; 9978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 9988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project printer(arg, "pppd options in effect:\n"); 9998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project print_option_list(general_options, printer, arg); 10008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project print_option_list(auth_options, printer, arg); 10018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (list = extra_options; list != NULL; list = list->next) 10028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project print_option_list(list->options, printer, arg); 10038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project print_option_list(the_channel->options, printer, arg); 10048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i = 0; protocols[i] != NULL; ++i) 10058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project print_option_list(protocols[i]->options, printer, arg); 10068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 10078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 10088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 10098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * usage - print out a message telling how to use the program. 10108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 10118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void 10128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectusage() 10138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 10148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (phase == PHASE_INITIALIZE) 10158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fprintf(stderr, usage_string, VERSION, progname); 10168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 10178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 10188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 10198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * showhelp - print out usage message and exit. 10208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 10218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 10228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectshowhelp(argv) 10238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 10248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 10258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (phase == PHASE_INITIALIZE) { 10268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project usage(); 10278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project exit(0); 10288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 10298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 10308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 10318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 10328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 10338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * showversion - print out the version number and exit. 10348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 10358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 10368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectshowversion(argv) 10378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 10388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 10398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (phase == PHASE_INITIALIZE) { 10408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fprintf(stderr, "pppd version %s\n", VERSION); 10418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project exit(0); 10428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 10438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 10448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 10458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 10468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 10478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * option_error - print a message about an error in an option. 10488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The message is logged, and also sent to 10498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * stderr if phase == PHASE_INITIALIZE. 10508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 10518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 10528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectoption_error __V((char *fmt, ...)) 10538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 10548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project va_list args; 10558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char buf[1024]; 10568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 10578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if defined(__STDC__) 10588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project va_start(args, fmt); 10598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#else 10608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *fmt; 10618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project va_start(args); 10628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fmt = va_arg(args, char *); 10638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 10648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vslprintf(buf, sizeof(buf), fmt, args); 10658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project va_end(args); 10668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (phase == PHASE_INITIALIZE) 10678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fprintf(stderr, "%s: %s\n", progname, buf); 10688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project syslog(LOG_ERR, "%s", buf); 10698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef ANDROID_CHANGES 10708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project error("%s", buf); 10718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 10728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 10738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 10748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#if 0 10758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 10768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * readable - check if a file is readable by the real user. 10778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 10788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 10798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectreadable(fd) 10808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int fd; 10818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 10828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project uid_t uid; 10838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i; 10848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct stat sbuf; 10858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 10868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project uid = getuid(); 10878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (uid == 0) 10888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 10898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (fstat(fd, &sbuf) != 0) 10908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 10918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sbuf.st_uid == uid) 10928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return sbuf.st_mode & S_IRUSR; 10938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sbuf.st_gid == getgid()) 10948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return sbuf.st_mode & S_IRGRP; 10958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i = 0; i < ngroups; ++i) 10968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (sbuf.st_gid == groups[i]) 10978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return sbuf.st_mode & S_IRGRP; 10988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return sbuf.st_mode & S_IROTH; 10998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 11008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 11018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 11038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Read a word from a file. 11048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Words are delimited by white-space or by quotes (" or '). 11058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Quotes, white-space and \ may be escaped with \. 11068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * \<newline> is ignored. 11078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 11098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectgetword(f, word, newlinep, filename) 11108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project FILE *f; 11118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *word; 11128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int *newlinep; 11138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *filename; 11148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 11158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int c, len, escape; 11168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int quoted, comment; 11178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int value, digit, got, n; 11188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define isoctal(c) ((c) >= '0' && (c) < '8') 11208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *newlinep = 0; 11228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project len = 0; 11238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project escape = 0; 11248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project comment = 0; 11258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * First skip white-space and comments. 11288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (;;) { 11308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc(f); 11318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == EOF) 11328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 11338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * A newline means the end of a comment; backslash-newline 11368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * is ignored. Note that we cannot have escape && comment. 11378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == '\n') { 11398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!escape) { 11408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *newlinep = 1; 11418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project comment = 0; 11428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else 11438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project escape = 0; 11448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project continue; 11458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 11468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Ignore characters other than newline in a comment. 11498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (comment) 11518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project continue; 11528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * If this character is escaped, we have a word start. 11558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (escape) 11578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 11588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * If this is the escape character, look at the next character. 11618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == '\\') { 11638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project escape = 1; 11648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project continue; 11658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 11668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * If this is the start of a comment, ignore the rest of the line. 11698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == '#') { 11718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project comment = 1; 11728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project continue; 11738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 11748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * A non-whitespace character is the start of a word. 11778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!isspace(c)) 11798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 11808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 11818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Save the delimiter for quoted strings. 11848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!escape && (c == '"' || c == '\'')) { 11868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project quoted = c; 11878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc(f); 11888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else 11898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project quoted = 0; 11908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 11918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Process characters until the end of the word. 11938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 11948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (c != EOF) { 11958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (escape) { 11968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 11978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * This character is escaped: backslash-newline is ignored, 11988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * various other characters indicate particular values 11998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * as for C backslash-escapes. 12008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 12018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project escape = 0; 12028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == '\n') { 12038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc(f); 12048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project continue; 12058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project got = 0; 12088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project switch (c) { 12098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case 'a': 12108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = '\a'; 12118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case 'b': 12138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = '\b'; 12148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case 'f': 12168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = '\f'; 12178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case 'n': 12198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = '\n'; 12208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case 'r': 12228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = '\r'; 12238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case 's': 12258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = ' '; 12268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project case 't': 12288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = '\t'; 12298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project default: 12328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (isoctal(c)) { 12338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 12348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * \ddd octal sequence 12358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 12368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = 0; 12378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (n = 0; n < 3 && isoctal(c); ++n) { 12388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = (value << 3) + (c & 07); 12398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc(f); 12408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project got = 1; 12428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == 'x') { 12468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 12478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * \x<hex_string> sequence 12488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 12498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = 0; 12508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc(f); 12518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (n = 0; n < 2 && isxdigit(c); ++n) { 12528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project digit = toupper(c) - '0'; 12538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (digit > 10) 12548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project digit += '0' + 10 - 'A'; 12558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = (value << 4) + digit; 12568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc (f); 12578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project got = 1; 12598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 12638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Otherwise the character stands for itself. 12648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 12658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project value = c; 12668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 12708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Store the resulting character for the escape sequence. 12718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 12728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (len < MAXWORDLEN-1) 12738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project word[len] = value; 12748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ++len; 12758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!got) 12778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc(f); 12788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project continue; 12798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 12838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Not escaped: see if we've reached the end of the word. 12848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 12858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (quoted) { 12868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == quoted) 12878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 12898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (isspace(c) || c == '#') { 12908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ungetc (c, f); 12918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 12928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 12948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 12958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 12968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Backslash starts an escape sequence. 12978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 12988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == '\\') { 12998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project escape = 1; 13008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc(f); 13018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project continue; 13028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 13038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 13058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * An ordinary character: store it in the word and get another. 13068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 13078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (len < MAXWORDLEN-1) 13088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project word[len] = c; 13098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ++len; 13108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project c = getc(f); 13128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 13138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 13158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * End of the word: check for errors. 13168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 13178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (c == EOF) { 13188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (ferror(f)) { 13198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (errno == 0) 13208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project errno = EIO; 13218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("Error reading %s: %m", filename); 13228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project die(1); 13238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 13248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 13258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * If len is zero, then we didn't find a word before the 13268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * end of the file. 13278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 13288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (len == 0) 13298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 13308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 13318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project /* 13338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Warn if the word was too long, and append a terminating null. 13348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 13358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (len >= MAXWORDLEN) { 13368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("warning: word in file %s too long (%.20s...)", 13378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project filename, word); 13388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project len = MAXWORDLEN - 1; 13398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 13408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project word[len] = 0; 13418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 13438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#undef isoctal 13458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 13478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 13498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * number_option - parse an unsigned numeric parameter for an option. 13508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 13518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 13528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectnumber_option(str, valp, base) 13538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *str; 13548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_int32_t *valp; 13558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int base; 13568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 13578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *ptr; 13588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *valp = strtoul(str, &ptr, base); 13608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (ptr == str) { 13618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("invalid numeric parameter '%s' for %s option", 13628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project str, current_option); 13638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 13648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 13658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 13668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 13678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 13708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * int_option - like number_option, but valp is int *, 13718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the base is assumed to be 0, and *valp is not changed 13728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * if there is an error. 13738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 13748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint 13758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint_option(str, valp) 13768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *str; 13778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int *valp; 13788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 13798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project u_int32_t v; 13808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!number_option(str, &v, 0)) 13828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 13838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *valp = (int) v; 13848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 13858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 13868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 13898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The following procedures parse options. 13908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 13918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 13928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 13938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * readfile - take commands from a file. 13948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 13958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 13968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectreadfile(argv) 13978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 13988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 13998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return options_from_file(*argv, 1, 1, privileged_option); 14008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 14018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 14038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * callfile - take commands from /etc/ppp/peers/<name>. 14048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Name may not contain /../, start with / or ../, or end in /.. 14058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 14068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 14078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectcallfile(argv) 14088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 14098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 14108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *fname, *arg, *p; 14118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int l, ok; 14128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project arg = *argv; 14148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ok = 1; 14158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (arg[0] == '/' || arg[0] == 0) 14168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ok = 0; 14178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project else { 14188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (p = arg; *p != 0; ) { 14198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (p[0] == '.' && p[1] == '.' && (p[2] == '/' || p[2] == 0)) { 14208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ok = 0; 14218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project break; 14228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 14238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project while (*p != '/' && *p != 0) 14248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ++p; 14258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (*p == '/') 14268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ++p; 14278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 14288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 14298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!ok) { 14308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("call option value may not contain .. or start with /"); 14318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 14328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 14338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project l = strlen(arg) + strlen(_PATH_PEERFILES) + 1; 14358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if ((fname = (char *) malloc(l)) == NULL) 14368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("call file name"); 14378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project slprintf(fname, l, "%s%s", _PATH_PEERFILES, arg); 14388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ok = options_from_file(fname, 1, 1, 1); 14408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project free(fname); 14428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ok; 14438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 14448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PPP_FILTER 14468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 14478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * setpassfilter - Set the pass filter for packets 14488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 14498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 14508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectsetpassfilter(argv) 14518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 14528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 14538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pcap_t *pc; 14548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int ret = 0; 14558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pc = pcap_open_dead(DLT_PPP_WITH_DIRECTION, 65535); 14578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (pcap_compile(pc, &pass_filter, *argv, 1, netmask) == -1) { 14588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("error in pass-filter expression: %s\n", 14598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pcap_geterr(pc)); 14608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ret = 1; 14618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 14628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pcap_close(pc); 14638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ret; 14658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 14668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 14688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * setactivefilter - Set the active filter for packets 14698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 14708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 14718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectsetactivefilter(argv) 14728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 14738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 14748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pcap_t *pc; 14758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int ret = 0; 14768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pc = pcap_open_dead(DLT_PPP_WITH_DIRECTION, 65535); 14788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (pcap_compile(pc, &active_filter, *argv, 1, netmask) == -1) { 14798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("error in active-filter expression: %s\n", 14808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pcap_geterr(pc)); 14818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project ret = 1; 14828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 14838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project pcap_close(pc); 14848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return ret; 14868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 14878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 14888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 14898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 14908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * setdomain - Set domain name to append to hostname 14918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 14928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 14938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectsetdomain(argv) 14948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 14958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 14968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project gethostname(hostname, MAXNAMELEN); 14978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (**argv != 0) { 14988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (**argv != '.') 14998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strncat(hostname, ".", MAXNAMELEN - strlen(hostname)); 15008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project domain = hostname + strlen(hostname); 15018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strncat(hostname, *argv, MAXNAMELEN - strlen(hostname)); 15028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 15038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project hostname[MAXNAMELEN-1] = 0; 15048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (1); 15058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 15068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 15078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 15088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectsetlogfile(argv) 15098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 15108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 15118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int fd, err; 15128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 15138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!privileged_option) 15148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project seteuid(getuid()); 15158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fd = open(*argv, O_WRONLY | O_APPEND | O_CREAT | O_EXCL, 0644); 15168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (fd < 0 && errno == EEXIST) 15178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project fd = open(*argv, O_WRONLY | O_APPEND); 15188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project err = errno; 15198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (!privileged_option) 15208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project seteuid(0); 15218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (fd < 0) { 15228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project errno = err; 15238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("Can't open log file %s: %m", *argv); 15248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 15258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 15268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strlcpy(logfile_name, *argv, sizeof(logfile_name)); 15278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (logfile_fd >= 0) 15288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project close(logfile_fd); 15298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project logfile_fd = fd; 15308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project log_to_fd = fd; 15318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project log_default = 0; 15328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 15338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 15348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 15358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef MAXOCTETS 15368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 15378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectsetmodir(argv) 15388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 15398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 15408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if(*argv == NULL) 15418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 15428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if(!strcmp(*argv,"in")) { 15438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project maxoctets_dir = PPP_OCTETS_DIRECTION_IN; 15448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else if (!strcmp(*argv,"out")) { 15458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project maxoctets_dir = PPP_OCTETS_DIRECTION_OUT; 15468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else if (!strcmp(*argv,"max")) { 15478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project maxoctets_dir = PPP_OCTETS_DIRECTION_MAXOVERAL; 15488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else { 15498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project maxoctets_dir = PPP_OCTETS_DIRECTION_SUM; 15508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 15518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 15528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 15538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 15548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 15558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef PLUGIN 15568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic int 15578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectloadplugin(argv) 15588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char **argv; 15598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 15608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *arg = *argv; 15618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void *handle; 15628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project const char *err; 15638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project void (*init) __P((void)); 15648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project char *path = arg; 15658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project const char *vers; 15668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 15678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (strchr(arg, '/') == 0) { 15688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project const char *base = _PATH_PLUGIN; 15698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int l = strlen(base) + strlen(arg) + 2; 15708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project path = malloc(l); 15718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (path == 0) 15728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project novm("plugin file path"); 15738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strlcpy(path, base, l); 15748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strlcat(path, "/", l); 15758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project strlcat(path, arg, l); 15768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 15778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project handle = dlopen(path, RTLD_GLOBAL | RTLD_NOW); 15788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (handle == 0) { 15798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project err = dlerror(); 15808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (err != 0) 15818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s", err); 15828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("Couldn't load plugin %s", arg); 15838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto err; 15848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 15858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project init = (void (*)(void))dlsym(handle, "plugin_init"); 15868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (init == 0) { 15878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("%s has no initialization entry point", arg); 15888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto errclose; 15898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 15908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project vers = (const char *) dlsym(handle, "pppd_version"); 15918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (vers == 0) { 15928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project warn("Warning: plugin %s has no version information", arg); 15938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } else if (strcmp(vers, VERSION) != 0) { 15948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project option_error("Plugin %s is for pppd version %s, this is %s", 15958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project arg, vers, VERSION); 15968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project goto errclose; 15978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project } 15988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project info("Plugin %s loaded.", arg); 15998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project (*init)(); 16008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 1; 16018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 16028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project errclose: 16038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project dlclose(handle); 16048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project err: 16058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project if (path != arg) 16068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project free(path); 16078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return 0; 16088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 16098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif /* PLUGIN */ 1610