NetlinkEvent.cpp revision ebfe3db361c51d9d99bf6cfd495bd16bdf815e1f
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;
31ebfe3db361c51d9d99bf6cfd495bd16bdf815e1fSan Mehat    memset(mParams, 0, sizeof(mParams));
32ebfe3db361c51d9d99bf6cfd495bd16bdf815e1fSan Mehat    mPath = NULL;
33ebfe3db361c51d9d99bf6cfd495bd16bdf815e1fSan Mehat    mSubsystem = NULL;
34168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
35168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
36168415b822cae1f8b54ef09c41c11a9b97b87f40San MehatNetlinkEvent::~NetlinkEvent() {
37168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
38168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    if (mPath)
39168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mPath);
40168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    if (mSubsystem)
41168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mSubsystem);
42168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    for (i = 0; i < NL_PARAMS_MAX; i++) {
43168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!mParams[i])
44168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            break;
45168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        free(mParams[i]);
46168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
47168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
48168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
49168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatbool NetlinkEvent::decode(char *buffer, int size) {
50168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    char *s = buffer;
51168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    char *end;
52168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int param_idx = 0;
53168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
54168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int first = 1;
55168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
56168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    end = s + size;
57168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    while (s < end) {
58168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (first) {
59168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            char *p;
60168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            for (p = s; *p != '@'; p++);
61168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            p++;
62168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            mPath = strdup(p);
63168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            first = 0;
64168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        } else {
65168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            if (!strncmp(s, "ACTION=", strlen("ACTION="))) {
66168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                char *a = s + strlen("ACTION=");
67168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                if (!strcmp(a, "add"))
68168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionAdd;
69168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                else if (!strcmp(a, "remove"))
70168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionRemove;
71168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                else if (!strcmp(a, "change"))
72168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                    mAction = NlActionChange;
7303f0d27f6c49530a91402ed42f8ca4b2fda04b9fSan Mehat            } else if (!strncmp(s, "SEQNUM=", strlen("SEQNUM=")))
74168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mSeq = atoi(s + strlen("SEQNUM="));
7503f0d27f6c49530a91402ed42f8ca4b2fda04b9fSan Mehat            else if (!strncmp(s, "SUBSYSTEM=", strlen("SUBSYSTEM=")))
76168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mSubsystem = strdup(s + strlen("SUBSYSTEM="));
77168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            else
78168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat                mParams[param_idx++] = strdup(s);
79168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        }
80168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        s+= strlen(s) + 1;
81168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
82168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    return true;
83168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
84168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
85168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatconst char *NetlinkEvent::findParam(const char *paramName) {
86168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    int i;
87168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
88168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    for (i = 0; i < NL_PARAMS_MAX; i++) {
89168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!mParams[i])
90168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            break;
91168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat        if (!strncmp(mParams[i], paramName, strlen(paramName)))
92168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat            return &mParams[i][strlen(paramName) + 1];
93168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    }
94168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat
95168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    LOGE("NetlinkEvent::FindParam(): Parameter '%s' not found", paramName);
96168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat    return NULL;
97168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}
98