Remove vconf value
[platform/adaptation/bluetooth-firmware-bcm.git] / set-address / setbd.c
1 /*
2  * setbd.c
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved
5  *
6  * Contact:  Hocheol Seo <hocheol.seo@samsung.com>
7  *           GirishAshok Joshi <girish.joshi@samsung.com>
8  *           DoHyun Pyun <dh79.pyun@samsung.com>
9  *
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  * http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  *
22  */
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <errno.h>
28 #include <fcntl.h>
29 #include <unistd.h>
30 #include <time.h>
31 #include <vconf.h>
32 #include <glib.h>
33
34 #ifdef __TI_PATCH__
35 #define BT_CHIP_TI
36 #else
37 #ifdef __BROADCOM_PATCH__
38 #define BT_CHIP_BROADCOM
39 #else
40 #define BT_CHIP_CSR
41 #endif
42 #endif
43
44 #ifdef DEBUG_EN
45 #define APP_DBG(format, args...)        printf("%s(), line[%d]: " format, __FUNCTION__, __LINE__, ##args)
46 #define APP_DEBUG(format, args...)      printf(format, ##args)
47 #else
48 #define APP_DBG(format, args...)
49 #define APP_DEBUG(format, args...)
50 #endif
51
52 #define BD_ADDR_FILE    "/opt/etc/.bd_addr"
53 #define PSKEY_TEMP_FILE "/opt/etc/.bluetooth.psr"
54 #define PSR_FILE        "/opt/etc/bluetooth/bluetooth.psr"
55
56 #define BD_ADDR_LEN     14
57 #define BD_PREFIX       "0002\n"
58
59 #define PSKEY_LEN       27
60 #define PSKEY_BDADDR_PREFIX     "&0001 = 0012 "
61
62 #define READ_BD_FILE_MAX        300
63
64 static int success_make_bt_address_from_imei=-1;
65 static GMainLoop * loop;
66 const char *DEFAULT_IMEI="004999010640000";
67 static gboolean is_default_imei=FALSE;
68
69 #if defined(BT_CHIP_CSR) || defined(BT_CHIP_BROADCOM)
70 int addremoveBD(char* path, char* pskey){
71         FILE *fd, *new;
72         int ret;
73         char cmp[READ_BD_FILE_MAX];
74         char *result;
75
76         fd = fopen(path, "r");
77         if(NULL == fd){
78                 APP_DBG("Error open psr file\r\n");
79                 return -21;
80         }
81
82         new = fopen(PSKEY_TEMP_FILE, "w");
83         if(NULL == new){
84                 APP_DBG("Error creat temp file\r\n");
85                 fclose(fd);
86                 return -22;
87         }
88
89         ret = fputs(pskey,new);
90
91         while(1){
92                 result = fgets(cmp, READ_BD_FILE_MAX, fd);
93
94                 APP_DBG("PSR : [%s]\r\n", cmp);
95
96                 if((NULL != result) && (0 == strncmp(cmp, "&0001", 5))){
97                         APP_DBG("Find BD address set script\r\n");
98                         continue;
99                 }
100
101                 if(NULL == result){
102                         APP_DBG("EOF reaches\r\n");
103                         fclose(fd);
104                         fclose(new);
105                         return 1;
106                 }
107
108                 ret = fputs(cmp,new);
109         }
110
111         return 0;
112 }
113 void makeRandomBD(unsigned char* buf){
114         int ran;
115         int i;
116         unsigned int seed;
117         memcpy(buf, BD_PREFIX, 5);
118         seed = time(NULL);
119         for(i=5;i<14;i++){
120                 if(7==i){
121                         buf[i]='\n';
122                         continue;
123                 }
124                 ran = rand_r(&seed)%16;
125                 if(10>ran)
126                         ran+=0x30;
127                 else
128                         ran+=0x57;
129                 buf[i]=ran;
130         }
131         APP_DEBUG("Random number is\r\n");
132         for(i=0;i<BD_ADDR_LEN;i++){
133                 APP_DEBUG("%c",buf[i]);
134         }
135         APP_DEBUG("\r\n");
136 }
137 #endif
138
139 #ifdef BT_CHIP_TI
140 int readBDaddrTI(void){
141         int i, cnt_lap=0, cnt_uap=0, cnt_nap=0;
142         int dev_id, fd, filedesc;
143         BD_ADDR_T bdaddr;
144         char address[18];
145         char nap[4], uap[2], lap[6];
146        int ret = 0;
147         dev_id=hci_get_route(NULL);
148         if(dev_id<0){
149                 APP_DBG("Bluetooth device not available!!!\r\n");
150                 return -1;
151         }
152         fd=hci_open_dev(dev_id);
153         if(fd<0){
154                 APP_DBG("HCI open fail!!!\r\n");
155                 return -2;
156         }
157
158         if(0>hci_read_bd_addr(fd, &bdaddr, 1000)){
159                 APP_DBG("Read BD ADDR failed!!!\r\n");
160                 return -3;
161         }
162         hci_close_dev(fd);
163
164         ba2str(&bdaddr, address);
165         for(i=0;i<17;i++){
166                 if(':' == address[i])
167                         continue;
168
169                 if(5>i)
170                         nap[cnt_nap++] = address[i];
171                 else if(8>i)
172                         uap[cnt_uap++] = address[i];
173                 else
174                         lap[cnt_lap++] = address[i];
175         }
176
177         APP_DBG("BT address [%s], nap[%c%c%c%c], uap[%c%c], lap[%c%c%c%c%c%c]\r\n",\
178          address, nap[0], nap[1], nap[2], nap[3]\
179         , uap[0],uap[1]\
180         ,lap[0], lap[1],lap[2],lap[3],lap[4],lap[5]);
181
182
183         filedesc=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
184         if(0>filedesc){
185                 APP_DBG("File creation fail!!!\r\n");
186                 return -4;
187         }
188         ret = write(filedesc, nap, 4);
189         ret = write(filedesc, "\n", 1);
190         ret = write(filedesc, uap, 2);
191         ret = write(filedesc, "\n", 1);
192         ret = write(filedesc, lap, 6);
193         ret = write(filedesc, "\n", 1);
194         close(filedesc);
195
196         return 0;
197 }
198 #endif
199
200 int make_bt_address(gboolean overwrite_bt_address)
201 {
202 #if defined(BT_CHIP_CSR) || defined(BT_CHIP_BROADCOM)
203
204         int fd;
205         int i;
206         unsigned char txt[BD_ADDR_LEN];
207         unsigned char nap[4+1], uap[2+1], lap[6+1];
208         char pskey[PSKEY_LEN+3];
209         int ret;
210
211         fd=open(BD_ADDR_FILE, O_RDONLY | O_SYNC);
212
213         if(fd<0 || overwrite_bt_address==TRUE){
214                 if(fd<0)
215                         APP_DEBUG("File not exist\n");
216                 else
217                         close(fd);
218
219                 if(overwrite_bt_address)
220                 {
221                         APP_DEBUG("Overwrite BT address\n");
222                 }
223
224                 fd=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
225
226                 if (fd <0)
227                 {
228                         APP_DEBUG("Can't open address file\n");
229                         return 0;
230                 }
231
232                 makeRandomBD(txt);
233
234                 ret = write(fd, txt, BD_ADDR_LEN);
235                 lseek(fd, 0, SEEK_SET);
236         }else{
237                 APP_DEBUG("%s is already existed\n",BD_ADDR_FILE);
238                 success_make_bt_address_from_imei=0;
239         }
240
241         ret = read(fd, nap, 5);
242         ret = read(fd, uap, 3);
243         ret = read(fd, lap, 7);
244         close(fd);
245
246 #if defined(BT_CHIP_CSR)
247         APP_DEBUG("nap[");
248         for(i=0;i<4;i++)
249                 APP_DEBUG("%c",nap[i]);
250         APP_DEBUG("]\r\n");
251
252         APP_DEBUG("uap[");
253         for(i=0;i<2;i++)
254                 APP_DEBUG("%c",uap[i]);
255         APP_DEBUG("]\r\n");
256
257         APP_DEBUG("lap[");
258         for(i=0;i<6;i++)
259                 APP_DEBUG("%c",lap[i]);
260         APP_DEBUG("]\r\n");
261
262         sprintf(pskey, "&0001 = 0012 %c%c%c%c %c%c%c%c %c%c%c%c\r\n",\
263          lap[0], lap[1], lap[2], lap[3], lap[4], lap[5],\
264          uap[0], uap[1],\
265          nap[0], nap[1], nap[2], nap[3]);
266
267         APP_DEBUG("BD PSKEY [");
268         for(i=0;i<PSKEY_LEN;i++)
269                 APP_DEBUG("%c", pskey[i]);
270         APP_DEBUG("]\r\n");
271
272         ret = addremoveBD(PSR_FILE, pskey);
273 #endif
274         return ret;
275 #elif defined(BT_CHIP_TI)
276         int fd;
277         int ret;
278
279         fd=open(BD_ADDR_FILE, O_RDONLY, 0644);
280         if(0>fd){
281                 APP_DBG("File not exists\r\n");
282                 ret=readBDaddrTI();
283         }else{
284                 APP_DBG("File exists\r\n");
285                 close(fd);
286                 ret=0;
287         }
288
289         return ret;
290 #else
291         printf("error BT CHIP not defined!!!\n");
292         return 0;
293 #endif
294 }
295
296 gboolean exit_cb(gpointer data)
297 {
298
299         APP_DEBUG("Time out!!!\n");
300         g_main_loop_quit(loop);
301
302         return FALSE;
303 }
304 int main()
305 {
306         loop=g_main_loop_new(NULL,FALSE);
307         APP_DEBUG("Bluetooth Address Setting\n");
308         make_bt_address(FALSE);
309
310         /* When we get proper BT address by IMEI or
311          * randome BT address due to default IMEI
312          * We don't need to wait for telephony activation, timeout */
313         if(success_make_bt_address_from_imei==0 || is_default_imei==TRUE)
314                 exit(0);
315
316 #ifdef IMEI_BASED_RAND_FEATURE
317         g_timeout_add_seconds(10,exit_cb,NULL);
318         g_main_loop_run(loop);
319 #endif
320
321         return 0;
322 }