NetlinkEvent.cpp revision 3d40729054803fae1c4d4bb5ac7554665a132b26
1168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat/*
2168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Copyright (C) 2008 The Android Open Source Project
3168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat *
4168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Licensed under the Apache License, Version 2.0 (the "License");
5168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * you may not use this file except in compliance with the License.
6168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * You may obtain a copy of the License at
7168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat *
8168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat *      http://www.apache.org/licenses/LICENSE-2.0
9168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat *
10168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Unless required by applicable law or agreed to in writing, software
11168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * distributed under the License is distributed on an "AS IS" BASIS,
12168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * See the License for the specific language governing permissions and
14168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * limitations under the License.
15168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat */
16168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <stdlib.h>
173d40729054803fae1c4d4bb5ac7554665a132b26San Mehat#include <string.h>
18168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
19168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#define LOG_TAG "NetlinkEvent"
20168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <cutils/log.h>
21168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
22168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <sysutils/NetlinkEvent.h>
23168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
24168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst int NetlinkEvent::NlActionUnknown = 0;
25168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst int NetlinkEvent::NlActionAdd = 1;
26168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst int NetlinkEvent::NlActionRemove = 2;
27168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst int NetlinkEvent::NlActionChange = 3;
28168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
29168415b822cae1f8b54ef09c41c11a9b97b87f40San MehatNetlinkEvent::NetlinkEvent() {
30168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    mAction = NlActionUnknown;
31168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
32168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
33168415b822cae1f8b54ef09c41c11a9b97b87f40San MehatNetlinkEvent::~NetlinkEvent() {
34168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
35168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    if (mPath)
36168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mPath);
37168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    if (mSubsystem)
38168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mSubsystem);
39168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    for (i = 0; i < NL_PARAMS_MAX; i++) {
40168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!mParams[i])
41168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            break;
42168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mParams[i]);
43168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
44168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
45168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
46168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatbool NetlinkEvent::decode(char *buffer, int size) {
47168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    char *s = buffer;
48168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    char *end;
49168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int param_idx = 0;
50168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
51168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int first = 1;
52168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
53168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    end = s + size;
54168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    while (s < end) {
55168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (first) {
56168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            char *p;
57168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            for (p = s; *p != '@'; p++);
58168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            p++;
59168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            mPath = strdup(p);
60168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            first = 0;
61168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        } else {
62168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            if (!strncmp(s, "ACTION=", strlen("ACTION="))) {
63168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                char *a = s + strlen("ACTION=");
64168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                if (!strcmp(a, "add"))
65168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionAdd;
66168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                else if (!strcmp(a, "remove"))
67168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionRemove;
68168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                else if (!strcmp(a, "change"))
69168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionChange;
70168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            } else if (!strncmp(s, "SEQNUM=", strlen("SEQNUM=")))
71168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mSeq = atoi(s + strlen("SEQNUM="));
72168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            else if (!strncmp(s, "SUBSYSTEM=", strlen("SUBSYSTEM=")))
73168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mSubsystem = strdup(s + strlen("SUBSYSTEM="));
74168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            else
75168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mParams[param_idx++] = strdup(s);
76168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        }
77168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        s+= strlen(s) + 1;
78168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
79168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    return true;
80168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
81168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
82168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst char *NetlinkEvent::findParam(const char *paramName) {
83168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
84168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
85168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    for (i = 0; i < NL_PARAMS_MAX; i++) {
86168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!mParams[i])
87168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            break;
88168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!strncmp(mParams[i], paramName, strlen(paramName)))
89168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            return &mParams[i][strlen(paramName) + 1];
90168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
91168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
92168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    LOGE("NetlinkEvent::FindParam(): Parameter '%s' not found", paramName);
93168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    return NULL;
94168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
95