• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include <stdlib.h>
17 #include <string.h>
18 
19 #define LOG_TAG "NetlinkEvent"
20 #include <cutils/log.h>
21 
22 #include <sysutils/NetlinkEvent.h>
23 
24 const int NetlinkEvent::NlActionUnknown = 0;
25 const int NetlinkEvent::NlActionAdd = 1;
26 const int NetlinkEvent::NlActionRemove = 2;
27 const int NetlinkEvent::NlActionChange = 3;
28 
NetlinkEvent()29 NetlinkEvent::NetlinkEvent() {
30     mAction = NlActionUnknown;
31     memset(mParams, 0, sizeof(mParams));
32     mPath = NULL;
33     mSubsystem = NULL;
34 }
35 
~NetlinkEvent()36 NetlinkEvent::~NetlinkEvent() {
37     int i;
38     if (mPath)
39         free(mPath);
40     if (mSubsystem)
41         free(mSubsystem);
42     for (i = 0; i < NL_PARAMS_MAX; i++) {
43         if (!mParams[i])
44             break;
45         free(mParams[i]);
46     }
47 }
48 
dump()49 void NetlinkEvent::dump() {
50     int i;
51 
52     for (i = 0; i < NL_PARAMS_MAX; i++) {
53         if (!mParams[i])
54             break;
55         SLOGD("NL param '%s'\n", mParams[i]);
56     }
57 }
58 
decode(char * buffer,int size)59 bool NetlinkEvent::decode(char *buffer, int size) {
60     char *s = buffer;
61     char *end;
62     int param_idx = 0;
63     int i;
64     int first = 1;
65 
66     end = s + size;
67     while (s < end) {
68         if (first) {
69             char *p;
70             for (p = s; *p != '@'; p++);
71             p++;
72             mPath = strdup(p);
73             first = 0;
74         } else {
75             if (!strncmp(s, "ACTION=", strlen("ACTION="))) {
76                 char *a = s + strlen("ACTION=");
77                 if (!strcmp(a, "add"))
78                     mAction = NlActionAdd;
79                 else if (!strcmp(a, "remove"))
80                     mAction = NlActionRemove;
81                 else if (!strcmp(a, "change"))
82                     mAction = NlActionChange;
83             } else if (!strncmp(s, "SEQNUM=", strlen("SEQNUM=")))
84                 mSeq = atoi(s + strlen("SEQNUM="));
85             else if (!strncmp(s, "SUBSYSTEM=", strlen("SUBSYSTEM=")))
86                 mSubsystem = strdup(s + strlen("SUBSYSTEM="));
87             else
88                 mParams[param_idx++] = strdup(s);
89         }
90         s+= strlen(s) + 1;
91     }
92     return true;
93 }
94 
findParam(const char * paramName)95 const char *NetlinkEvent::findParam(const char *paramName) {
96     int i;
97 
98     for (i = 0; i < NL_PARAMS_MAX; i++) {
99         if (!mParams[i])
100             break;
101         if (!strncmp(mParams[i], paramName, strlen(paramName)))
102             return &mParams[i][strlen(paramName) + 1];
103     }
104 
105     SLOGE("NetlinkEvent::FindParam(): Parameter '%s' not found", paramName);
106     return NULL;
107 }
108