2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (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
8 * http://floralicense.org/license/
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.
22 #include <arpa/inet.h>
24 #include "cloud/car_info.h"
27 #define MAX_LENGTH 256
28 #define MAX_LENGTH_IP 16
29 #define MAX_LENGTH_MAC 18
30 #define MAX_LENGTH_SSID 33
32 #define SAFE_STR_CPY(src, obj, size)\
35 src = strndup(obj, size);\
38 static int validate_ip_address(const char *ip_address);
39 static int validate_mac_address(const char *mac_address);
50 car_info_t *car_info_create()
52 struct car_info *car_info = g_new0(struct car_info, 1);
53 retvm_if(!car_info, NULL, "Could not allocate memory!");
58 car_info_t *car_info_copy(const car_info_t *car_info)
60 retv_if(!car_info, NULL);
62 struct car_info *car_info_cpy = g_new0(struct car_info, 1);
63 SAFE_STR_CPY(car_info_cpy->id, car_info->id, MAX_LENGTH);
64 SAFE_STR_CPY(car_info_cpy->name, car_info->name, MAX_LENGTH);
65 SAFE_STR_CPY(car_info_cpy->ip, car_info->ip, MAX_LENGTH_IP);
66 SAFE_STR_CPY(car_info_cpy->ap_mac, car_info->ap_mac, MAX_LENGTH_MAC);
67 SAFE_STR_CPY(car_info_cpy->ap_ssid, car_info->ap_ssid, MAX_LENGTH_SSID);
72 void car_info_destroy(car_info_t *car_info)
79 free(car_info->ap_mac);
80 free(car_info->ap_ssid);
85 bool car_info_is_valid(car_info_t *car_info)
87 return (car_info->id && car_info->ip && car_info->ap_mac && car_info->ap_ssid);
90 const char *car_info_get_car_id(car_info_t *car_info)
92 retv_if(!car_info, NULL);
97 int car_info_set_car_id(car_info_t *car_info, const char *car_id)
99 retv_if(!car_info, -1);
100 retv_if(car_id == NULL, -1);
101 retv_if(strlen(car_id) >= MAX_LENGTH, -1);
104 car_info->id = (char *)g_malloc(MAX_LENGTH * sizeof(char));
106 snprintf(car_info->id, MAX_LENGTH, "%s", car_id);
110 const char *car_info_get_car_name(car_info_t *car_info)
112 retv_if(!car_info, NULL);
113 return car_info->name;
116 int car_info_set_car_name(car_info_t *car_info, const char *car_name)
118 retv_if(!car_info, -1);
119 retv_if(car_name == NULL, -1);
120 retv_if(strlen(car_name) >= MAX_LENGTH, -1);
123 car_info->name = (char *)g_malloc(MAX_LENGTH * sizeof(char));
125 snprintf(car_info->name, MAX_LENGTH, "%s", car_name);
129 const char *car_info_get_car_ip(car_info_t *car_info)
131 retv_if(!car_info, NULL);
135 int car_info_set_car_ip(car_info_t *car_info, const char *car_ip)
137 retv_if(!car_info, -1);
138 retv_if(car_ip == NULL, -1);
139 retv_if(strlen(car_ip) >= MAX_LENGTH_IP, -1);
140 retv_if(validate_ip_address(car_ip) != 0, -1);
143 car_info->ip = (char *)g_malloc(MAX_LENGTH_IP * sizeof(char));
145 snprintf(car_info->ip, MAX_LENGTH_IP, "%s", car_ip);
149 const char *car_info_get_ap_mac(car_info_t *car_info)
151 retv_if(!car_info, NULL);
152 return car_info->ap_mac ? car_info->ap_mac : "NULL";
155 int car_info_set_car_ap_mac(car_info_t *car_info, const char *ap_mac)
157 retv_if(!car_info, -1);
158 retv_if(ap_mac == NULL, -1);
159 retv_if(strlen(ap_mac) >= MAX_LENGTH_MAC, -1);
160 retv_if(validate_mac_address(ap_mac) != 0, -1);
162 if (!car_info->ap_mac)
163 car_info->ap_mac = (char *)g_malloc(MAX_LENGTH_MAC * sizeof(char));
165 snprintf(car_info->ap_mac, MAX_LENGTH_MAC, "%s", ap_mac);
169 const char *car_info_get_ap_ssid(car_info_t *car_info)
171 retv_if(!car_info, NULL);
172 return car_info->ap_ssid;
175 int car_info_set_ap_ssid(car_info_t *car_info, const char *ap_ssid)
177 retv_if(!car_info, -1);
178 retv_if(ap_ssid == NULL, -1);
179 retv_if(strlen(ap_ssid) >= MAX_LENGTH_SSID, -1);
181 if (!car_info->ap_ssid)
182 car_info->ap_ssid = (char *)g_malloc(MAX_LENGTH_SSID * sizeof(char));
184 snprintf(car_info->ap_ssid, MAX_LENGTH_SSID, "%s", ap_ssid);
188 static int validate_ip_address(const char *ip_address)
190 struct sockaddr_in sa;
191 int result = inet_pton(AF_INET, ip_address, &(sa.sin_addr));
192 return result == 1 ? 0 : -1;
195 static int validate_mac_address(const char *mac_address)
202 if (isxdigit(*mac_address))
205 if (i > 2) return -1;
207 else if (*mac_address == ':')
209 if (i != 2) return -1;
219 return (segments == 6 && i == 2) ? 0 : -1;