[Warnings] Fix build warnings.
[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         char cmp[READ_BD_FILE_MAX];
73         char *result;
74         int ret;
75         fd = fopen(path, "r");
76         if(NULL == fd){
77                 APP_DBG("Error open psr file\r\n");
78                 return -21;
79         }
80
81         new = fopen(PSKEY_TEMP_FILE, "w");
82         if(NULL == new){
83                 APP_DBG("Error creat temp file\r\n");
84                 fclose(fd);
85                 return -22;
86         }
87
88         ret = fputs(pskey,new);
89         if (ret < 0)
90                 return -1;
91
92         while(1){
93                 result = fgets(cmp, READ_BD_FILE_MAX, fd);
94
95                 APP_DBG("PSR : [%s]\r\n", cmp);
96
97                 if((NULL != result) && (0 == strncmp(cmp, "&0001", 5))){
98                         APP_DBG("Find BD address set script\r\n");
99                         continue;
100                 }
101
102                 if(NULL == result){
103                         APP_DBG("EOF reaches\r\n");
104                         fclose(fd);
105                         fclose(new);
106                         return 1;
107                 }
108
109                 ret = fputs(cmp,new);
110         }
111
112         return 0;
113 }
114 void makeRandomBD(unsigned char* buf){
115         int ran;
116         int i;
117         unsigned int seed;
118         memcpy(buf, BD_PREFIX, 5);
119         seed = time(NULL);
120         for(i=5;i<14;i++){
121                 if(7==i){
122                         buf[i]='\n';
123                         continue;
124                 }
125                 ran = rand_r(&seed)%16;
126                 if(10>ran)
127                         ran+=0x30;
128                 else
129                         ran+=0x57;
130                 buf[i]=ran;
131         }
132         APP_DEBUG("Random number is\r\n");
133         for(i=0;i<BD_ADDR_LEN;i++){
134                 APP_DEBUG("%c",buf[i]);
135         }
136         APP_DEBUG("\r\n");
137 }
138 #endif
139
140 #ifdef BT_CHIP_TI
141 int readBDaddrTI(void){
142         int i, cnt_lap=0, cnt_uap=0, cnt_nap=0;
143         int dev_id, fd, filedesc;
144         BD_ADDR_T bdaddr;
145         char address[18];
146         char nap[4], uap[2], lap[6];
147        int ret = 0;
148         dev_id=hci_get_route(NULL);
149         if(dev_id<0){
150                 APP_DBG("Bluetooth device not available!!!\r\n");
151                 return -1;
152         }
153         fd=hci_open_dev(dev_id);
154         if(fd<0){
155                 APP_DBG("HCI open fail!!!\r\n");
156                 return -2;
157         }
158
159         if(0>hci_read_bd_addr(fd, &bdaddr, 1000)){
160                 APP_DBG("Read BD ADDR failed!!!\r\n");
161                 return -3;
162         }
163         hci_close_dev(fd);
164
165         ba2str(&bdaddr, address);
166         for(i=0;i<17;i++){
167                 if(':' == address[i])
168                         continue;
169
170                 if(5>i)
171                         nap[cnt_nap++] = address[i];
172                 else if(8>i)
173                         uap[cnt_uap++] = address[i];
174                 else
175                         lap[cnt_lap++] = address[i];
176         }
177
178         APP_DBG("BT address [%s], nap[%c%c%c%c], uap[%c%c], lap[%c%c%c%c%c%c]\r\n",\
179          address, nap[0], nap[1], nap[2], nap[3]\
180         , uap[0],uap[1]\
181         ,lap[0], lap[1],lap[2],lap[3],lap[4],lap[5]);
182
183
184         filedesc=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
185         if(0>filedesc){
186                 APP_DBG("File creation fail!!!\r\n");
187                 return -4;
188         }
189         ret = write(filedesc, nap, 4);
190         ret = write(filedesc, "\n", 1);
191         ret = write(filedesc, uap, 2);
192         ret = write(filedesc, "\n", 1);
193         ret = write(filedesc, lap, 6);
194         ret = write(filedesc, "\n", 1);
195         close(filedesc);
196
197         return 0;
198 }
199 #endif
200
201 int make_bt_address(gboolean overwrite_bt_address)
202 {
203 #if defined(BT_CHIP_CSR) || defined(BT_CHIP_BROADCOM)
204
205         int fd;
206         unsigned char txt[BD_ADDR_LEN];
207         unsigned char nap[4+1], uap[2+1], lap[6+1];
208 #if defined(BT_CHIP_CSR)
209         char pskey[PSKEY_LEN+3];
210 #endif
211         int ret;
212
213         fd=open(BD_ADDR_FILE, O_RDONLY | O_SYNC);
214
215         if(fd<0 || overwrite_bt_address==TRUE){
216                 if(fd<0)
217                         APP_DEBUG("File not exist\n");
218                 else
219                         close(fd);
220
221                 if(overwrite_bt_address)
222                 {
223                         APP_DEBUG("Overwrite BT address\n");
224                 }
225
226                 fd=open(BD_ADDR_FILE, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0644);
227
228                 if (fd <0)
229                 {
230                         APP_DEBUG("Can't open address file\n");
231                         return 0;
232                 }
233
234                 makeRandomBD(txt);
235
236                 ret = write(fd, txt, BD_ADDR_LEN);
237                 lseek(fd, 0, SEEK_SET);
238         }else{
239                 APP_DEBUG("%s is already existed\n",BD_ADDR_FILE);
240                 success_make_bt_address_from_imei=0;
241         }
242
243         ret = read(fd, nap, 5);
244         ret = read(fd, uap, 3);
245         ret = read(fd, lap, 7);
246         close(fd);
247
248 #if defined(BT_CHIP_CSR)
249         APP_DEBUG("nap[");
250         for(i=0;i<4;i++)
251                 APP_DEBUG("%c",nap[i]);
252         APP_DEBUG("]\r\n");
253
254         APP_DEBUG("uap[");
255         for(i=0;i<2;i++)
256                 APP_DEBUG("%c",uap[i]);
257         APP_DEBUG("]\r\n");
258
259         APP_DEBUG("lap[");
260         for(i=0;i<6;i++)
261                 APP_DEBUG("%c",lap[i]);
262         APP_DEBUG("]\r\n");
263
264         sprintf(pskey, "&0001 = 0012 %c%c%c%c %c%c%c%c %c%c%c%c\r\n",\
265          lap[0], lap[1], lap[2], lap[3], lap[4], lap[5],\
266          uap[0], uap[1],\
267          nap[0], nap[1], nap[2], nap[3]);
268
269         APP_DEBUG("BD PSKEY [");
270         for(i=0;i<PSKEY_LEN;i++)
271                 APP_DEBUG("%c", pskey[i]);
272         APP_DEBUG("]\r\n");
273
274         ret = addremoveBD(PSR_FILE, pskey);
275 #endif
276         return ret;
277 #elif defined(BT_CHIP_TI)
278         int fd;
279         int ret;
280
281         fd=open(BD_ADDR_FILE, O_RDONLY, 0644);
282         if(0>fd){
283                 APP_DBG("File not exists\r\n");
284                 ret=readBDaddrTI();
285         }else{
286                 APP_DBG("File exists\r\n");
287                 close(fd);
288                 ret=0;
289         }
290
291         return ret;
292 #else
293         printf("error BT CHIP not defined!!!\n");
294         return 0;
295 #endif
296 }
297
298 gboolean exit_cb(gpointer data)
299 {
300
301         APP_DEBUG("Time out!!!\n");
302         g_main_loop_quit(loop);
303
304         return FALSE;
305 }
306 int main()
307 {
308         loop=g_main_loop_new(NULL,FALSE);
309         APP_DEBUG("Bluetooth Address Setting\n");
310         make_bt_address(FALSE);
311
312         /* When we get proper BT address by IMEI or
313          * randome BT address due to default IMEI
314          * We don't need to wait for telephony activation, timeout */
315         if(success_make_bt_address_from_imei==0 || is_default_imei==TRUE)
316                 exit(0);
317
318 #ifdef IMEI_BASED_RAND_FEATURE
319         g_timeout_add_seconds(10,exit_cb,NULL);
320         g_main_loop_run(loop);
321 #endif
322
323         return 0;
324 }