| Index: chrome/browser/sync/notifier/base/linux/async_network_alive_linux.cc
|
| ===================================================================
|
| --- chrome/browser/sync/notifier/base/linux/async_network_alive_linux.cc (revision 46353)
|
| +++ chrome/browser/sync/notifier/base/linux/async_network_alive_linux.cc (working copy)
|
| @@ -1,144 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/sync/notifier/base/async_network_alive.h"
|
| -
|
| -#include <sys/socket.h>
|
| -#include <asm/types.h>
|
| -#include <linux/netlink.h>
|
| -#include <linux/rtnetlink.h>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/platform_file.h"
|
| -#include "talk/base/physicalsocketserver.h"
|
| -
|
| -using base::kInvalidPlatformFileValue;
|
| -
|
| -namespace notifier {
|
| -
|
| -class AsyncNetworkAliveLinux : public AsyncNetworkAlive {
|
| - public:
|
| - AsyncNetworkAliveLinux() {
|
| - if (pipe(exit_pipe_) == -1) {
|
| - PLOG(ERROR) << "Could not create pipe for exit signal.";
|
| - exit_pipe_[0] = kInvalidPlatformFileValue;
|
| - exit_pipe_[1] = kInvalidPlatformFileValue;
|
| - }
|
| - }
|
| -
|
| - virtual ~AsyncNetworkAliveLinux() {
|
| - if (exit_pipe_[1] != kInvalidPlatformFileValue) {
|
| - // Ensure that we've signalled the thread to quit.
|
| - char data = 0;
|
| - if (write(exit_pipe_[1], &data, 1) == -1) {
|
| - PLOG(WARNING) << "Error sending error signal to AsyncNetworkAliveLinux";
|
| - }
|
| - close(exit_pipe_[1]);
|
| - exit_pipe_[1] = kInvalidPlatformFileValue;
|
| - }
|
| - if (exit_pipe_[0] != kInvalidPlatformFileValue) {
|
| - close(exit_pipe_[0]);
|
| - exit_pipe_[0] = kInvalidPlatformFileValue;
|
| - }
|
| - }
|
| -
|
| - protected:
|
| - // SignalThread Interface
|
| - virtual void DoWork() {
|
| - if (exit_pipe_[0] == kInvalidPlatformFileValue) {
|
| - PLOG(ERROR) << "No exit flag to listen for.";
|
| - // If we don't have an exit flag to listen for, set the error flag and
|
| - // abort.
|
| - error_ = true;
|
| - return;
|
| - }
|
| -
|
| - // This function listens for changes to network interfaces, and link state.
|
| - // It's copied from syncapi.cc.
|
| - struct sockaddr_nl socket_address;
|
| -
|
| - memset(&socket_address, 0, sizeof(socket_address));
|
| - socket_address.nl_family = AF_NETLINK;
|
| - socket_address.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;
|
| -
|
| - // NETLINK_ROUTE is the protocol used to update the kernel routing table.
|
| - int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
|
| - bind(fd, (struct sockaddr *) &socket_address, sizeof(socket_address));
|
| -
|
| - fd_set rdfs;
|
| - FD_ZERO(&rdfs);
|
| - FD_SET(fd, &rdfs);
|
| - FD_SET(exit_pipe_[0], &rdfs);
|
| -
|
| - int max_fd = fd > exit_pipe_[0] ? fd : exit_pipe_[0];
|
| -
|
| - int result = select(max_fd + 1, &rdfs, NULL, NULL, NULL);
|
| -
|
| - if (result <= 0) {
|
| - error_ = true;
|
| - PLOG(ERROR) << "select() returned unexpected result " << result;
|
| - close(fd);
|
| - close(exit_pipe_[0]);
|
| - exit_pipe_[0] = kInvalidPlatformFileValue;
|
| - return;
|
| - }
|
| -
|
| - // Since we received a change from the socket, read the change in.
|
| - if (FD_ISSET(fd, &rdfs)) {
|
| - char buf[4096];
|
| - struct iovec iov = { buf, sizeof(buf) };
|
| - struct sockaddr_nl sa;
|
| -
|
| - struct msghdr msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
|
| - recvmsg(fd, &msg, 0);
|
| - }
|
| -
|
| - close(fd);
|
| -
|
| - // If exit_pipe was written to, we must be shutting down.
|
| - if (exit_pipe_[0] == kInvalidPlatformFileValue ||
|
| - FD_ISSET(exit_pipe_[0], &rdfs)) {
|
| - alive_ = false;
|
| - error_ = true;
|
| - close(exit_pipe_[0]);
|
| - exit_pipe_[0] = kInvalidPlatformFileValue;
|
| - return;
|
| - }
|
| -
|
| - // If there is an active connection, check that talk.google.com:5222
|
| - // is reachable.
|
| - talk_base::PhysicalSocketServer physical;
|
| - scoped_ptr<talk_base::Socket> socket(physical.CreateSocket(SOCK_STREAM));
|
| - if (socket->Connect(talk_base::SocketAddress("talk.google.com", 5222))) {
|
| - alive_ = false;
|
| - } else {
|
| - alive_ = true;
|
| - }
|
| -
|
| - close(exit_pipe_[0]);
|
| - exit_pipe_[0] = kInvalidPlatformFileValue;
|
| - }
|
| -
|
| - virtual void OnWorkStop() {
|
| - if (exit_pipe_[1] != kInvalidPlatformFileValue) {
|
| - char data = 0;
|
| - // We can't ignore the return value on write(), since that generates a
|
| - // compile warning. However, since we're exiting, there's nothing we can
|
| - // do if this fails except to log it.
|
| - if (write(exit_pipe_[1], &data, 1) == -1) {
|
| - PLOG(WARNING) << "Error sending error signal to AsyncNetworkAliveLinux";
|
| - }
|
| - }
|
| - }
|
| -
|
| - private:
|
| - int exit_pipe_[2];
|
| - DISALLOW_COPY_AND_ASSIGN(AsyncNetworkAliveLinux);
|
| -};
|
| -
|
| -AsyncNetworkAlive* AsyncNetworkAlive::Create() {
|
| - return new AsyncNetworkAliveLinux();
|
| -}
|
| -
|
| -} // namespace notifier
|
|
|