• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 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 
17 #include "fuzz_tester/FuzzerCallbackBase.h"
18 
19 #include <dirent.h>
20 #include <netdb.h>
21 #include <netinet/in.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sys/mman.h>
26 #include <sys/socket.h>
27 #include <sys/stat.h>
28 #include <sys/types.h>
29 #include <sys/un.h>
30 #include <unistd.h>
31 
32 #include <iostream>
33 #include <string>
34 #include <vector>
35 
36 #include <VtsDriverCommUtil.h>
37 #include "test/vts/proto/ComponentSpecificationMessage.pb.h"
38 #include "test/vts/proto/AndroidSystemControlMessage.pb.h"
39 
40 #include "component_loader/DllLoader.h"
41 #include "utils/InterfaceSpecUtil.h"
42 
43 using namespace std;
44 
45 namespace android {
46 namespace vts {
47 
48 static std::map<string, string> id_map_;
49 
FuzzerCallbackBase()50 FuzzerCallbackBase::FuzzerCallbackBase() {}
51 
~FuzzerCallbackBase()52 FuzzerCallbackBase::~FuzzerCallbackBase() {}
53 
Register(const VariableSpecificationMessage & message)54 bool FuzzerCallbackBase::Register(const VariableSpecificationMessage& message) {
55   cout << __func__ << " type = " << message.type() << endl;
56   if (!message.is_callback()) {
57     cerr << __func__ << " ERROR: argument is not a callback." << endl;
58     return false;
59   }
60 
61   if (!message.has_type() || message.type() != TYPE_FUNCTION_POINTER) {
62     cerr << __func__ << " ERROR: inconsistent message." << endl;
63     return false;
64   }
65 
66   for (const auto& func_pt : message.function_pointer()) {
67     cout << __func__ << " map[" << func_pt.function_name()
68          << "] = " << func_pt.id() << endl;
69     id_map_[func_pt.function_name()] = func_pt.id();
70   }
71   return true;
72 }
73 
GetCallbackID(const string & name)74 const char* FuzzerCallbackBase::GetCallbackID(const string& name) {
75   // TODO: handle when not found.
76   cout << __func__ << ":" << __LINE__ << " " << name << endl;
77   cout << __func__ << ":" << __LINE__ << " returns '" << id_map_[name].c_str()
78        << "'" << endl;
79   return id_map_[name].c_str();
80 }
81 
RpcCallToAgent(const AndroidSystemCallbackRequestMessage & message,const string & callback_socket_name)82 void FuzzerCallbackBase::RpcCallToAgent(
83     const AndroidSystemCallbackRequestMessage& message,
84     const string& callback_socket_name) {
85   cout << __func__ << ":" << __LINE__ << " id = '" << message.id() << "'"
86        << endl;
87   if (message.id().empty() || callback_socket_name.empty()) {
88     cout << "Message ID: " << message.id() << endl
89          << "Callback socket name: " << callback_socket_name << endl
90          << "Abort callback forwarding." << endl;
91     return;
92   }
93   VtsDriverCommUtil util;
94   if (!util.Connect(callback_socket_name)) exit(-1);
95   util.VtsSocketSendMessage(message);
96   util.Close();
97 }
98 
99 }  // namespace vts
100 }  // namespace android
101