PppController.cpp revision d5573d34c8fac49e16b20cf144486125bf940086
1d5573d34c8fac49e16b20cf144486125bf940086San Mehat/*
2d5573d34c8fac49e16b20cf144486125bf940086San Mehat * Copyright (C) 2008 The Android Open Source Project
3d5573d34c8fac49e16b20cf144486125bf940086San Mehat *
4d5573d34c8fac49e16b20cf144486125bf940086San Mehat * Licensed under the Apache License, Version 2.0 (the "License");
5d5573d34c8fac49e16b20cf144486125bf940086San Mehat * you may not use this file except in compliance with the License.
6d5573d34c8fac49e16b20cf144486125bf940086San Mehat * You may obtain a copy of the License at
7d5573d34c8fac49e16b20cf144486125bf940086San Mehat *
8d5573d34c8fac49e16b20cf144486125bf940086San Mehat *      http://www.apache.org/licenses/LICENSE-2.0
9d5573d34c8fac49e16b20cf144486125bf940086San Mehat *
10d5573d34c8fac49e16b20cf144486125bf940086San Mehat * Unless required by applicable law or agreed to in writing, software
11d5573d34c8fac49e16b20cf144486125bf940086San Mehat * distributed under the License is distributed on an "AS IS" BASIS,
12d5573d34c8fac49e16b20cf144486125bf940086San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d5573d34c8fac49e16b20cf144486125bf940086San Mehat * See the License for the specific language governing permissions and
14d5573d34c8fac49e16b20cf144486125bf940086San Mehat * limitations under the License.
15d5573d34c8fac49e16b20cf144486125bf940086San Mehat */
16d5573d34c8fac49e16b20cf144486125bf940086San Mehat
17d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include <stdlib.h>
18d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include <errno.h>
19d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include <sys/socket.h>
20d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include <sys/stat.h>
21d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include <fcntl.h>
22d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include <netinet/in.h>
23d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include <arpa/inet.h>
24d5573d34c8fac49e16b20cf144486125bf940086San Mehat
25d5573d34c8fac49e16b20cf144486125bf940086San Mehat#define LOG_TAG "PppController"
26d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include <cutils/log.h>
27d5573d34c8fac49e16b20cf144486125bf940086San Mehat
28d5573d34c8fac49e16b20cf144486125bf940086San Mehat#include "PppController.h"
29d5573d34c8fac49e16b20cf144486125bf940086San Mehat
30d5573d34c8fac49e16b20cf144486125bf940086San Mehatextern "C" int logwrap(int argc, const char **argv, int background);
31d5573d34c8fac49e16b20cf144486125bf940086San Mehat
32d5573d34c8fac49e16b20cf144486125bf940086San Mehatstatic char IPTABLES_PATH[] = "/system/bin/iptables";
33d5573d34c8fac49e16b20cf144486125bf940086San Mehat
34d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController::PppController() {
35d5573d34c8fac49e16b20cf144486125bf940086San Mehat    mTtys = new TtyCollection();
36d5573d34c8fac49e16b20cf144486125bf940086San Mehat    mPid = 0;
37d5573d34c8fac49e16b20cf144486125bf940086San Mehat}
38d5573d34c8fac49e16b20cf144486125bf940086San Mehat
39d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController::~PppController() {
40d5573d34c8fac49e16b20cf144486125bf940086San Mehat    TtyCollection::iterator it;
41d5573d34c8fac49e16b20cf144486125bf940086San Mehat
42d5573d34c8fac49e16b20cf144486125bf940086San Mehat    for (it = mTtys->begin(); it != mTtys->end(); ++it) {
43d5573d34c8fac49e16b20cf144486125bf940086San Mehat        free(*it);
44d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
45d5573d34c8fac49e16b20cf144486125bf940086San Mehat    mTtys->clear();
46d5573d34c8fac49e16b20cf144486125bf940086San Mehat}
47d5573d34c8fac49e16b20cf144486125bf940086San Mehat
48d5573d34c8fac49e16b20cf144486125bf940086San Mehatint PppController::attachPppd(const char *tty, struct in_addr local,
49d5573d34c8fac49e16b20cf144486125bf940086San Mehat                              struct in_addr remote) {
50d5573d34c8fac49e16b20cf144486125bf940086San Mehat    pid_t pid;
51d5573d34c8fac49e16b20cf144486125bf940086San Mehat
52d5573d34c8fac49e16b20cf144486125bf940086San Mehat    if (mPid) {
53d5573d34c8fac49e16b20cf144486125bf940086San Mehat        LOGE("Multiple PPPD instances not currently supported");
54d5573d34c8fac49e16b20cf144486125bf940086San Mehat        errno = EBUSY;
55d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return -1;
56d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
57d5573d34c8fac49e16b20cf144486125bf940086San Mehat
58d5573d34c8fac49e16b20cf144486125bf940086San Mehat    if ((pid = fork()) < 0) {
59d5573d34c8fac49e16b20cf144486125bf940086San Mehat        LOGE("fork failed (%s)", strerror(errno));
60d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return -1;
61d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
62d5573d34c8fac49e16b20cf144486125bf940086San Mehat
63d5573d34c8fac49e16b20cf144486125bf940086San Mehat    if (!pid) {
64d5573d34c8fac49e16b20cf144486125bf940086San Mehat        char *l = strdup(inet_ntoa(local));
65d5573d34c8fac49e16b20cf144486125bf940086San Mehat        char *r = strdup(inet_ntoa(remote));
66d5573d34c8fac49e16b20cf144486125bf940086San Mehat        char dev[32];
67d5573d34c8fac49e16b20cf144486125bf940086San Mehat        char *lr;
68d5573d34c8fac49e16b20cf144486125bf940086San Mehat
69d5573d34c8fac49e16b20cf144486125bf940086San Mehat        asprintf(&lr, "%s:%s", l, r);
70d5573d34c8fac49e16b20cf144486125bf940086San Mehat
71d5573d34c8fac49e16b20cf144486125bf940086San Mehat        snprintf(dev, sizeof(dev), "/dev/%s", tty); // TODO: STOPSHIP Validate this
72d5573d34c8fac49e16b20cf144486125bf940086San Mehat
73d5573d34c8fac49e16b20cf144486125bf940086San Mehat        // TODO: Deal with pppd bailing out after 99999 seconds of being started
74d5573d34c8fac49e16b20cf144486125bf940086San Mehat        // but not getting a connection
75d5573d34c8fac49e16b20cf144486125bf940086San Mehat        if (execl("/system/bin/pppd", "/system/bin/pppd", "-detach", dev,
76d5573d34c8fac49e16b20cf144486125bf940086San Mehat                  "115200", lr, "debug", "lcp-max-configure", "99999", (char *) NULL)) {
77d5573d34c8fac49e16b20cf144486125bf940086San Mehat            LOGE("execl failed (%s)", strerror(errno));
78d5573d34c8fac49e16b20cf144486125bf940086San Mehat        }
79d5573d34c8fac49e16b20cf144486125bf940086San Mehat        LOGE("Should never get here!");
80d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return 0;
81d5573d34c8fac49e16b20cf144486125bf940086San Mehat    } else {
82d5573d34c8fac49e16b20cf144486125bf940086San Mehat        mPid = pid;
83d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
84d5573d34c8fac49e16b20cf144486125bf940086San Mehat    return 0;
85d5573d34c8fac49e16b20cf144486125bf940086San Mehat}
86d5573d34c8fac49e16b20cf144486125bf940086San Mehat
87d5573d34c8fac49e16b20cf144486125bf940086San Mehatint PppController::detachPppd(const char *tty) {
88d5573d34c8fac49e16b20cf144486125bf940086San Mehat
89d5573d34c8fac49e16b20cf144486125bf940086San Mehat    if (mPid == 0) {
90d5573d34c8fac49e16b20cf144486125bf940086San Mehat        LOGE("PPPD already stopped");
91d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return 0;
92d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
93d5573d34c8fac49e16b20cf144486125bf940086San Mehat
94d5573d34c8fac49e16b20cf144486125bf940086San Mehat    LOGD("Stopping PPPD services on port %s", tty);
95d5573d34c8fac49e16b20cf144486125bf940086San Mehat
96d5573d34c8fac49e16b20cf144486125bf940086San Mehat    kill(mPid, SIGTERM);
97d5573d34c8fac49e16b20cf144486125bf940086San Mehat    mPid = 0;
98d5573d34c8fac49e16b20cf144486125bf940086San Mehat    return 0;
99d5573d34c8fac49e16b20cf144486125bf940086San Mehat}
100d5573d34c8fac49e16b20cf144486125bf940086San Mehat
101d5573d34c8fac49e16b20cf144486125bf940086San MehatTtyCollection *PppController::getTtyList() {
102d5573d34c8fac49e16b20cf144486125bf940086San Mehat    return mTtys;
103d5573d34c8fac49e16b20cf144486125bf940086San Mehat}
104d5573d34c8fac49e16b20cf144486125bf940086San Mehat
105