Skip to content

Commit

Permalink
libsysutils: New C++ system convenience library
Browse files Browse the repository at this point in the history
        This library contains re-usable classes for common
    system level daemons. Initial consumers of this library
    are 'nexus' and 'vold2'

Signed-off-by: San Mehat <san@google.com>
  • Loading branch information
San Mehat committed May 6, 2009
1 parent 770354d commit 168415b
Show file tree
Hide file tree
Showing 14 changed files with 711 additions and 0 deletions.
1 change: 1 addition & 0 deletions Android.mk
Expand Up @@ -21,6 +21,7 @@ else
include $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
adb \
libcutils \
libsysutils \
liblog \
libnetutils \
libpixelflinger \
Expand Down
37 changes: 37 additions & 0 deletions include/sysutils/FrameworkCommand.h
@@ -0,0 +1,37 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __FRAMEWORK_CMD_HANDLER_H
#define __FRAMEWORK_CMD_HANDLER_H

#include "../../../frameworks/base/include/utils/List.h"


class FrameworkCommand {
private:
const char *mCommand;

public:

FrameworkCommand(const char *cmd);
virtual ~FrameworkCommand() { }

virtual int runCommand(char *data);

const char *getCommand() { return mCommand; }
};

typedef android::List<FrameworkCommand *> FrameworkCommandCollection;
#endif
37 changes: 37 additions & 0 deletions include/sysutils/FrameworkListener.h
@@ -0,0 +1,37 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _FRAMEWORKSOCKETLISTENER_H
#define _FRAMEWORKSOCKETLISTENER_H

#include "SocketListener.h"
#include "FrameworkCommand.h"

class FrameworkListener : public SocketListener {
private:
FrameworkCommandCollection *mCommands;

public:
FrameworkListener(const char *socketName);
virtual ~FrameworkListener() {}

protected:
void registerCmd(FrameworkCommand *cmd);
virtual bool onDataAvailable(int socket);

private:
void dispatchCommand(char *cmd);
};
#endif
40 changes: 40 additions & 0 deletions include/sysutils/FrameworkManager.h
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _FRAMEWORKMANAGER_H
#define _FRAMEWORKMANAGER_H

#include <pthread.h>

class FrameworkListener;

class FrameworkManager {
int mDoorbell; // Socket used to accept connections from framework
int mFwSock; // Socket used to communicate with framework
const char *mSocketName;

FrameworkListener *mListener;

pthread_mutex_t mWriteMutex;

public:
FrameworkManager(FrameworkListener *Listener);
virtual ~FrameworkManager() {}

int run();
int sendMsg(char *msg);
int sendMsg(char *msg, char *data);
};
#endif
44 changes: 44 additions & 0 deletions include/sysutils/NetlinkEvent.h
@@ -0,0 +1,44 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _NETLINKEVENT_H
#define _NETLINKEVENT_H

#define NL_PARAMS_MAX 32

class NetlinkEvent {
int mSeq;
char *mPath;
int mAction;
char *mSubsystem;
char *mParams[NL_PARAMS_MAX];

public:
const static int NlActionUnknown;
const static int NlActionAdd;
const static int NlActionRemove;
const static int NlActionChange;

NetlinkEvent();
virtual ~NetlinkEvent();

bool decode(char *buffer, int size);
const char *findParam(const char *paramName);

const char *getSubsystem() { return mSubsystem; }
int getAction() { return mAction; }
};

#endif
32 changes: 32 additions & 0 deletions include/sysutils/NetlinkListener.h
@@ -0,0 +1,32 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _NETLINKLISTENER_H
#define _NETLINKLISTENER_H

#include "SocketListener.h"

class NetlinkEvent;

class NetlinkListener : public SocketListener {
char mBuffer[64 * 1024];

public:
NetlinkListener(int socket);
virtual ~NetlinkListener() {}
protected:
virtual bool onDataAvailable(int socket);
};
#endif
35 changes: 35 additions & 0 deletions include/sysutils/SocketListener.h
@@ -0,0 +1,35 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _SOCKETLISTENER_H
#define _SOCKETLISTENER_H

class SocketListener {
int mSock;
int mCsock;
int mAcceptClients;
const char *mSocketName;

public:
SocketListener(const char *socketName, bool acceptClients);
SocketListener(int socketFd, bool acceptClients);

virtual ~SocketListener() {}
virtual int run();

protected:
virtual bool onDataAvailable(int socket);
};
#endif
21 changes: 21 additions & 0 deletions libsysutils/Android.mk
@@ -0,0 +1,21 @@
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
src/FrameworkManager.cpp \
src/SocketListener.cpp \
src/FrameworkListener.cpp \
src/NetlinkListener.cpp \
src/NetlinkEvent.cpp \
src/FrameworkCommand.cpp \

LOCAL_MODULE:= libsysutils

LOCAL_C_INCLUDES := $(KERNEL_HEADERS)

LOCAL_CFLAGS :=

LOCAL_SHARED_LIBRARIES := libcutils

include $(BUILD_SHARED_LIBRARY)
32 changes: 32 additions & 0 deletions libsysutils/src/FrameworkCommand.cpp
@@ -0,0 +1,32 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <errno.h>

#define LOG_TAG "FrameworkCommand"

#include <cutils/log.h>

#include <sysutils/FrameworkCommand.h>

FrameworkCommand::FrameworkCommand(const char *cmd) {
mCommand = cmd;
}

int FrameworkCommand::runCommand(char *data) {
LOGW("Command %s has no run handler!", getCommand());
errno = ENOSYS;
return -1;
}
76 changes: 76 additions & 0 deletions libsysutils/src/FrameworkListener.cpp
@@ -0,0 +1,76 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <errno.h>

#define LOG_TAG "FrameworkListener"

#include <cutils/log.h>

#include <sysutils/FrameworkListener.h>
#include <sysutils/FrameworkCommand.h>

FrameworkListener::FrameworkListener(const char *socketName) :
SocketListener(socketName, true) {
mCommands = new FrameworkCommandCollection();
}

bool FrameworkListener::onDataAvailable(int socket) {
char buffer[101];
int len;

if ((len = read(socket, buffer, sizeof(buffer) -1)) < 0) {
LOGE("read() failed (%s)", strerror(errno));
return errno;
} else if (!len) {
LOGW("Lost connection to client");
return false;
}

int start = 0;
int i;

buffer[len] = '\0';

for (i = 0; i < len; i++) {
if (buffer[i] == '\0') {
dispatchCommand(buffer + start);
start = i + 1;
}
}
return true;
}

void FrameworkListener::registerCmd(FrameworkCommand *cmd) {
mCommands->push_back(cmd);
}

void FrameworkListener::dispatchCommand(char *cmd) {
FrameworkCommandCollection::iterator i;

for (i = mCommands->begin(); i != mCommands->end(); ++i) {
FrameworkCommand *c = *i;

if (!strncmp(cmd, c->getCommand(), strlen(c->getCommand()))) {
if (c->runCommand(cmd)) {
LOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno));
}
return;
}
}

LOGE("No cmd handlers defined for '%s'", cmd);
}

0 comments on commit 168415b

Please sign in to comment.