Skip to content

Latest commit

 

History

History
592 lines (512 loc) · 16.1 KB

usb_moded-modesetting.c

File metadata and controls

592 lines (512 loc) · 16.1 KB
 
Mar 22, 2011
Mar 22, 2011
1
2
3
4
/**
@file usb_moded-modesetting.c
Copyright (C) 2010 Nokia Corporation. All rights reserved.
Nov 7, 2016
Nov 7, 2016
5
Copyright (C) 2013-2016 Jolla Ltd.
Mar 22, 2011
Mar 22, 2011
6
7
@author: Philippe De Swert <philippe.de-swert@nokia.com>
Nov 7, 2016
Nov 7, 2016
8
9
10
11
@author: Philippe De Swert <philippe.deswert@jollamobile.com>
@author: Bernd Wachter <bernd.wachter@jollamobile.com>
@author: Slava Monich <slava.monich@jolla.com>
@author: Simo Piiroinen <simo.piiroinen@jollamobile.com>
Mar 22, 2011
Mar 22, 2011
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
This program is free software; you can redistribute it and/or
modify it under the terms of the Lesser GNU General Public License
version 2 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the Lesser GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
*/
Apr 21, 2011
Apr 21, 2011
28
#define _GNU_SOURCE
Mar 22, 2011
Mar 22, 2011
29
30
31
32
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
Aug 7, 2012
Aug 7, 2012
33
#include <sys/stat.h>
Jan 14, 2014
Jan 14, 2014
34
#include <limits.h>
Mar 22, 2011
Mar 22, 2011
35
36
37
38
39
#include <glib.h>
#include "usb_moded.h"
#include "usb_moded-modules.h"
May 10, 2011
May 10, 2011
40
#include "usb_moded-modes.h"
Mar 22, 2011
Mar 22, 2011
41
42
43
44
45
46
#include "usb_moded-log.h"
#include "usb_moded-dbus.h"
#include "usb_moded-dbus-private.h"
#include "usb_moded-appsync.h"
#include "usb_moded-config.h"
#include "usb_moded-modesetting.h"
Jan 13, 2012
Jan 13, 2012
47
#include "usb_moded-network.h"
Aug 23, 2013
Aug 23, 2013
48
#include "usb_moded-android.h"
Mar 22, 2011
Mar 22, 2011
49
Jun 27, 2011
Jun 27, 2011
50
static void report_mass_storage_blocker(const char *mountpoint, int try);
Jul 7, 2016
Jul 7, 2016
51
static guint delayed_network = 0;
May 10, 2011
May 10, 2011
52
Jul 7, 2016
Jul 7, 2016
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#if LOG_ENABLE_DEBUG
static char *strip(char *str)
{
unsigned char *src = (unsigned char *)str;
unsigned char *dst = (unsigned char *)str;
while( *src > 0 && *src <= 32 ) ++src;
for( ;; )
{
while( *src > 32 ) *dst++ = *src++;
while( *src > 0 && *src <= 32 ) ++src;
if( *src == 0 ) break;
*dst++ = ' ';
}
*dst = 0;
return str;
}
static char *read_from_file(const char *path, size_t maxsize)
{
int fd = -1;
ssize_t done = 0;
char *data = 0;
char *text = 0;
if((fd = open(path, O_RDONLY)) == -1)
{
/* Silently ignore things that could result
* from missing / read-only files */
if( errno != ENOENT && errno != EACCES )
log_warning("%s: open: %m", path);
goto cleanup;
}
if( !(data = malloc(maxsize + 1)) )
goto cleanup;
if((done = read(fd, data, maxsize)) == -1)
{
log_warning("%s: read: %m", path);
goto cleanup;
}
text = realloc(data, done + 1), data = 0;
text[done] = 0;
strip(text);
cleanup:
free(data);
if(fd != -1) close(fd);
return text;
}
#endif /* LOG_ENABLE_DEBUG */
Apr 21, 2011
Apr 21, 2011
108
109
110
111
int write_to_file(const char *path, const char *text)
{
int err = -1;
int fd = -1;
Sep 30, 2013
Sep 30, 2013
112
113
size_t todo = 0;
Oct 1, 2013
Oct 1, 2013
114
115
116
117
118
/* if either path or the text to be written are not there
we return an error */
if(!text || !path)
return err;
Jul 7, 2016
Jul 7, 2016
119
120
121
122
123
124
125
126
127
#if LOG_ENABLE_DEBUG
if(log_level >= LOG_DEBUG)
{
char *prev = read_from_file(path, 0x1000);
log_debug("WRITE '%s' : '%s' --> '%s'", path, prev ?: "???", text);
free(prev);
}
#endif
Oct 1, 2013
Oct 1, 2013
128
todo = strlen(text);
Apr 21, 2011
Apr 21, 2011
129
130
131
132
/* no O_CREAT -> writes only to already existing files */
if( (fd = TEMP_FAILURE_RETRY(open(path, O_WRONLY))) == -1 )
{
Jul 7, 2016
Jul 7, 2016
133
log_warning("open(%s): %m", path);
Apr 21, 2011
Apr 21, 2011
134
135
136
137
138
139
140
141
goto cleanup;
}
while( todo > 0 )
{
ssize_t n = TEMP_FAILURE_RETRY(write(fd, text, todo));
if( n < 0 )
{
Jul 7, 2016
Jul 7, 2016
142
log_warning("write(%s): %m", path);
Apr 21, 2011
Apr 21, 2011
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
goto cleanup;
}
todo -= n;
text += n;
}
err = 0;
cleanup:
if( fd != -1 ) TEMP_FAILURE_RETRY(close(fd));
return err;
}
Sep 24, 2015
Sep 24, 2015
158
159
static gboolean network_retry(gpointer data)
{
Jul 7, 2016
Jul 7, 2016
160
delayed_network = 0;
Sep 24, 2015
Sep 24, 2015
161
162
163
164
usb_network_up(data);
return(FALSE);
}
Dec 12, 2013
Dec 12, 2013
165
static int set_mass_storage_mode(struct mode_list_elem *data)
Mar 22, 2011
Mar 22, 2011
166
167
{
gchar *command;
Jan 14, 2014
Jan 14, 2014
168
char command2[256], *real_path = NULL, *mountpath;
Jul 7, 2016
Jul 7, 2016
169
char *mount;
Mar 22, 2011
Mar 22, 2011
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
gchar **mounts;
int ret = 0, i = 0, mountpoints = 0, fua = 0, try = 0;
/* send unmount signal so applications can release their grasp on the fs, do this here so they have time to act */
usb_moded_send_signal(USB_PRE_UNMOUNT);
fua = find_sync();
mount = find_mounts();
if(mount)
{
mounts = g_strsplit(mount, ",", 0);
/* check amount of mountpoints */
for(i=0 ; mounts[i] != NULL; i++)
{
mountpoints++;
}
Dec 12, 2013
Dec 12, 2013
186
187
188
189
190
191
192
193
194
195
196
if(strcmp(data->mode_module, MODULE_NONE))
{
/* check if the file storage module has been loaded with sufficient luns in the parameter,
if not, unload and reload or load it. Since mountpoints start at 0 the amount of them is one more than their id */
sprintf(command2, "/sys/devices/platform/musb_hdrc/gadget/gadget-lun%d/file", (mountpoints - 1) );
if(access(command2, R_OK) == -1)
{
log_debug("%s does not exist, unloading and reloading mass_storage\n", command2);
usb_moded_unload_module(MODULE_MASS_STORAGE);
sprintf(command2, "modprobe %s luns=%d \n", MODULE_MASS_STORAGE, mountpoints);
log_debug("usb-load command = %s \n", command2);
Mar 24, 2017
Mar 24, 2017
197
ret = usb_moded_system(command2);
Dec 12, 2013
Dec 12, 2013
198
199
200
201
if(ret)
return(ret);
}
}
Mar 22, 2011
Mar 22, 2011
202
203
204
205
/* umount filesystems */
for(i=0 ; mounts[i] != NULL; i++)
{
/* check if filesystem is mounted or not, if ret = 1 it is already unmounted */
Jan 14, 2014
Jan 14, 2014
206
207
208
209
210
211
real_path = realpath(mounts[i], NULL);
if(real_path)
mountpath = real_path;
else
mountpath = mounts[i];
umount: command = g_strconcat("mount | grep ", mountpath, NULL);
Mar 24, 2017
Mar 24, 2017
212
ret = usb_moded_system(command);
Mar 22, 2011
Mar 22, 2011
213
214
215
g_free(command);
if(!ret)
{
Jan 13, 2012
Jan 13, 2012
216
/* no check for / needed as that will fail to umount anyway */
Jan 14, 2014
Jan 14, 2014
217
command = g_strconcat("umount ", mountpath, NULL);
Mar 22, 2011
Mar 22, 2011
218
log_debug("unmount command = %s\n", command);
Mar 24, 2017
Mar 24, 2017
219
ret = usb_moded_system(command);
Mar 22, 2011
Mar 22, 2011
220
221
222
g_free(command);
if(ret != 0)
{
Jun 27, 2011
Jun 27, 2011
223
if(try != 3)
Mar 22, 2011
Mar 22, 2011
224
225
226
227
{
try++;
sleep(1);
log_err("Umount failed. Retrying\n");
Jun 27, 2011
Jun 27, 2011
228
report_mass_storage_blocker(mount, 1);
Mar 22, 2011
Mar 22, 2011
229
230
231
232
233
goto umount;
}
else
{
log_err("Unmounting %s failed\n", mount);
Jun 27, 2011
Jun 27, 2011
234
report_mass_storage_blocker(mount, 2);
Mar 22, 2011
Mar 22, 2011
235
236
237
238
239
240
241
242
243
244
usb_moded_send_error_signal(UMOUNT_ERROR);
return(ret);
}
}
}
else
/* already unmounted. Set return value to 0 since there is no error */
ret = 0;
}
Apr 15, 2011
Apr 15, 2011
245
/* activate mounts after sleeping 1s to be sure enumeration happened and autoplay will work in windows*/
Sep 24, 2015
Sep 24, 2015
246
sleep(1);
Mar 22, 2011
Mar 22, 2011
247
for(i=0 ; mounts[i] != NULL; i++)
Mar 31, 2011
Mar 31, 2011
248
{
Dec 12, 2013
Dec 12, 2013
249
250
251
252
253
if(strcmp(data->mode_module, MODULE_NONE))
{
sprintf(command2, "echo %i > /sys/devices/platform/musb_hdrc/gadget/gadget-lun%d/nofua", fua, i);
log_debug("usb lun = %s active\n", command2);
Mar 24, 2017
Mar 24, 2017
254
usb_moded_system(command2);
Dec 12, 2013
Dec 12, 2013
255
256
257
258
259
260
261
262
263
264
265
266
267
sprintf(command2, "/sys/devices/platform/musb_hdrc/gadget/gadget-lun%d/file", i);
log_debug("usb lun = %s active\n", command2);
write_to_file(command2, mounts[i]);
}
else
{
write_to_file("/sys/class/android_usb/android0/enable", "0");
write_to_file("/sys/class/android_usb/android0/functions", "mass_storage");
//write_to_file("/sys/class/android_usb/f_mass_storage/lun/nofua", fua);
write_to_file("/sys/class/android_usb/f_mass_storage/lun/file", mount);
write_to_file("/sys/class/android_usb/android0/enable", "1");
}
Apr 21, 2011
Apr 21, 2011
268
269
}
g_strfreev(mounts);
Jul 7, 2016
Jul 7, 2016
270
g_free(mount);
Jan 14, 2014
Jan 14, 2014
271
272
if(real_path)
free(real_path);
Mar 22, 2011
Mar 22, 2011
273
274
275
276
277
278
279
280
281
282
}
/* only send data in use signal in case we actually succeed */
if(!ret)
usb_moded_send_signal(DATA_IN_USE);
return(ret);
}
Dec 12, 2013
Dec 12, 2013
283
static int unset_mass_storage_mode(struct mode_list_elem *data)
Jul 1, 2013
Jul 1, 2013
284
285
{
gchar *command;
Jan 14, 2014
Jan 14, 2014
286
char command2[256], *real_path = NULL, *mountpath;
Jul 7, 2016
Jul 7, 2016
287
char *mount;
Jul 1, 2013
Jul 1, 2013
288
289
290
291
292
293
294
295
296
297
gchar **mounts;
int ret = 1, i = 0;
mount = find_mounts();
if(mount)
{
mounts = g_strsplit(mount, ",", 0);
for(i=0 ; mounts[i] != NULL; i++)
{
/* check if it is still or already mounted, if so (ret==0) skip mounting */
Jan 14, 2014
Jan 14, 2014
298
299
300
301
302
303
real_path = realpath(mounts[i], NULL);
if(real_path)
mountpath = real_path;
else
mountpath = mounts[i];
command = g_strconcat("mount | grep ", mountpath, NULL);
Mar 24, 2017
Mar 24, 2017
304
ret = usb_moded_system(command);
Jul 1, 2013
Jul 1, 2013
305
306
307
g_free(command);
if(ret)
{
Jan 14, 2014
Jan 14, 2014
308
command = g_strconcat("mount ", mountpath, NULL);
Dec 12, 2013
Dec 12, 2013
309
log_debug("mount command = %s\n",command);
Mar 24, 2017
Mar 24, 2017
310
ret = usb_moded_system(command);
Jul 1, 2013
Jul 1, 2013
311
g_free(command);
Jan 10, 2014
Jan 10, 2014
312
313
/* mount returns 0 if success */
if(ret != 0 )
Jul 1, 2013
Jul 1, 2013
314
315
{
log_err("Mounting %s failed\n", mount);
Jan 10, 2014
Jan 10, 2014
316
317
if(ret)
{
Jul 7, 2016
Jul 7, 2016
318
g_free(mount);
Jan 10, 2014
Jan 10, 2014
319
320
321
mount = find_alt_mount();
if(mount)
{
Jul 1, 2013
Jul 1, 2013
322
323
command = g_strconcat("mount -t tmpfs tmpfs -o ro --size=512K ", mount, NULL);
log_debug("Total failure, mount ro tmpfs as fallback\n");
Mar 24, 2017
Mar 24, 2017
324
ret = usb_moded_system(command);
Jul 1, 2013
Jul 1, 2013
325
326
g_free(command);
}
Jan 10, 2014
Jan 10, 2014
327
usb_moded_send_error_signal(RE_MOUNT_FAILED);
Jul 1, 2013
Jul 1, 2013
328
329
330
331
}
}
}
Dec 12, 2013
Dec 12, 2013
332
333
if(data != NULL)
{
Jan 10, 2014
Jan 10, 2014
334
if(!strcmp(data->mode_module, MODULE_NONE))
Dec 12, 2013
Dec 12, 2013
335
{
Jan 10, 2014
Jan 10, 2014
336
337
log_debug("Disable android mass storage\n");
write_to_file("/sys/class/android_usb/f_mass_storage/lun/file", "0");
Dec 12, 2013
Dec 12, 2013
338
339
340
write_to_file("/sys/class/android_usb/android0/enable", "0");
}
}
Jan 10, 2014
Jan 10, 2014
341
342
343
344
else
{
sprintf(command2, "echo \"\" > /sys/devices/platform/musb_hdrc/gadget/gadget-lun%d/file", i);
log_debug("usb lun = %s inactive\n", command2);
Mar 24, 2017
Mar 24, 2017
345
usb_moded_system(command2);
Jan 10, 2014
Jan 10, 2014
346
}
Jul 1, 2013
Jul 1, 2013
347
348
}
g_strfreev(mounts);
Jul 7, 2016
Jul 7, 2016
349
g_free(mount);
Jan 14, 2014
Jan 14, 2014
350
351
if(real_path)
free(real_path);
Jul 1, 2013
Jul 1, 2013
352
353
354
355
356
357
}
return(ret);
}
Jun 27, 2011
Jun 27, 2011
358
static void report_mass_storage_blocker(const char *mountpoint, int try)
May 10, 2011
May 10, 2011
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
{
FILE *stream = 0;
gchar *lsof_command = 0;
int count = 0;
lsof_command = g_strconcat("lsof ", mountpoint, NULL);
if( (stream = popen(lsof_command, "r")) )
{
char *text = 0;
size_t size = 0;
while( getline(&text, &size, stream) >= 0 )
{
/* skip the first line as it does not contain process info */
if(count != 0)
{
gchar **split = 0;
split = g_strsplit((const gchar*)text, " ", 2);
Jun 6, 2011
Jun 6, 2011
378
log_err("Mass storage blocked by process %s\n", split[0]);
May 10, 2011
May 10, 2011
379
380
381
382
383
384
385
386
usb_moded_send_error_signal(split[0]);
g_strfreev(split);
}
count++;
}
pclose(stream);
}
g_free(lsof_command);
Jun 27, 2011
Jun 27, 2011
387
388
if(try == 2)
log_err("Setting Mass storage blocked. Giving up.\n");
May 10, 2011
May 10, 2011
389
390
391
}
Jun 19, 2013
Jun 19, 2013
392
int set_dynamic_mode(void)
May 10, 2011
May 10, 2011
393
{
Jun 19, 2013
Jun 19, 2013
394
395
struct mode_list_elem *data;
Jan 27, 2014
Jan 27, 2014
396
int ret = 1;
Jul 2, 2015
Jul 2, 2015
397
int network = 1;
Jun 19, 2013
Jun 19, 2013
398
399
400
data = get_usb_mode_data();
Jul 1, 2013
Jul 1, 2013
401
if(!data)
Jan 27, 2014
Jan 27, 2014
402
return(ret);
Jul 1, 2013
Jul 1, 2013
403
Sep 18, 2013
Sep 18, 2013
404
if(data->mass_storage)
Jul 1, 2013
Jul 1, 2013
405
{
Dec 12, 2013
Dec 12, 2013
406
return set_mass_storage_mode(data);
Jul 1, 2013
Jul 1, 2013
407
408
}
May 27, 2013
May 27, 2013
409
#ifdef APP_SYNC
May 10, 2011
May 10, 2011
410
if(data->appsync)
Oct 22, 2013
Oct 22, 2013
411
if(activate_sync(data->mode_name)) /* returns 1 on error */
Dec 11, 2013
Dec 11, 2013
412
413
{
log_debug("Appsync failure");
Jan 27, 2014
Jan 27, 2014
414
return(ret);
Dec 11, 2013
Dec 11, 2013
415
}
May 27, 2013
May 27, 2013
416
#endif
Jun 19, 2013
Jun 19, 2013
417
/* make sure things are disabled before changing functionality */
Jul 5, 2013
Jul 5, 2013
418
if(data->softconnect_disconnect)
Jun 19, 2013
Jun 19, 2013
419
420
421
{
write_to_file(data->softconnect_path, data->softconnect_disconnect);
}
Jun 19, 2013
Jun 19, 2013
422
/* set functionality first, then enable */
Aug 21, 2013
Aug 21, 2013
423
424
if(data->android_extra_sysfs_value && data->android_extra_sysfs_path)
{
Jan 27, 2014
Jan 27, 2014
425
ret = write_to_file(data->android_extra_sysfs_path, data->android_extra_sysfs_value);
Aug 21, 2013
Aug 21, 2013
426
427
428
429
430
}
if(data->android_extra_sysfs_value2 && data->android_extra_sysfs_path2)
{
write_to_file(data->android_extra_sysfs_path2, data->android_extra_sysfs_value2);
}
May 27, 2013
May 27, 2013
431
432
433
434
if(data->sysfs_path)
{
write_to_file(data->sysfs_path, data->sysfs_value);
}
Aug 23, 2013
Aug 23, 2013
435
436
437
438
439
if(data->idProduct)
{
/* only works for android since the idProduct is a module parameter */
set_android_productid(data->idProduct);
}
Nov 5, 2015
Nov 5, 2015
440
441
442
443
444
445
if(data->idVendorOverride)
{
/* only works for android since the idProduct is a module parameter */
set_android_vendorid(data->idVendorOverride);
}
Aug 23, 2013
Aug 23, 2013
446
/* enable the device */
Jul 19, 2013
Jul 19, 2013
447
448
if(data->softconnect)
{
Jan 27, 2014
Jan 27, 2014
449
ret = write_to_file(data->softconnect_path, data->softconnect);
Jul 19, 2013
Jul 19, 2013
450
}
May 10, 2011
May 10, 2011
451
Jun 19, 2013
Jun 19, 2013
452
/* functionality should be enabled, so we can enable the network now */
May 10, 2011
May 10, 2011
453
if(data->network)
Mar 1, 2012
Mar 1, 2012
454
{
Oct 2, 2012
Oct 2, 2012
455
#ifdef DEBIAN
Jul 2, 2015
Jul 2, 2015
456
char command[256];
Jun 19, 2013
Jun 19, 2013
457
May 10, 2011
May 10, 2011
458
g_snprintf(command, 256, "ifdown %s ; ifup %s", data->network_interface, data->network_interface);
Mar 24, 2017
Mar 24, 2017
459
usb_moded_system(command);
Oct 2, 2012
Oct 2, 2012
460
#else
Jun 19, 2013
Jun 19, 2013
461
usb_network_down(data);
Jul 2, 2015
Jul 2, 2015
462
network = usb_network_up(data);
Oct 2, 2012
Oct 2, 2012
463
#endif /* DEBIAN */
Mar 1, 2012
Mar 1, 2012
464
}
Dec 12, 2013
Dec 12, 2013
465
Jul 6, 2015
Jul 6, 2015
466
467
/* try a second time to bring up the network if it failed the first time,
this can happen with functionfs based gadgets (which is why we sleep for a bit */
Sep 24, 2015
Sep 24, 2015
468
if(network != 0 && data->network)
Jul 6, 2015
Jul 6, 2015
469
{
Sep 24, 2015
Sep 24, 2015
470
log_debug("Retry setting up the network later\n");
Jul 7, 2016
Jul 7, 2016
471
472
if(delayed_network)
g_source_remove(delayed_network);
Sep 24, 2015
Sep 24, 2015
473
delayed_network = g_timeout_add_seconds(3, network_retry, data);
Jul 6, 2015
Jul 6, 2015
474
475
}
Jul 2, 2015
Jul 2, 2015
476
477
478
/* Needs to be called before application post synching so
that the dhcp server has the right config */
if(data->nat || data->dhcp_server)
Jul 2, 2015
Jul 2, 2015
479
usb_network_set_up_dhcpd(data);
Jul 2, 2015
Jul 2, 2015
480
481
482
/* no need to execute the post sync if there was an error setting the mode */
if(data->appsync && !ret)
Sep 24, 2015
Sep 24, 2015
483
484
485
{
/* let's sleep for a bit (350ms) to allow interfaces to settle before running postsync */
usleep(350000);
Jul 2, 2015
Jul 2, 2015
486
activate_sync_post(data->mode_name);
Sep 24, 2015
Sep 24, 2015
487
}
Jul 2, 2015
Jul 2, 2015
488
Apr 15, 2015
Apr 15, 2015
489
490
491
492
493
#ifdef CONNMAN
if(data->connman_tethering)
connman_set_tethering(data->connman_tethering, TRUE);
#endif
Jan 27, 2014
Jan 27, 2014
494
495
496
if(ret)
usb_moded_send_error_signal(MODE_SETTING_FAILED);
return(ret);
May 10, 2011
May 10, 2011
497
}
Mar 22, 2011
Mar 22, 2011
498
May 29, 2013
May 29, 2013
499
500
501
502
503
504
void unset_dynamic_mode(void)
{
struct mode_list_elem *data;
data = get_usb_mode_data();
Jun 19, 2013
Jun 19, 2013
505
Sep 24, 2015
Sep 24, 2015
506
507
508
509
510
511
if(delayed_network)
{
g_source_remove(delayed_network);
delayed_network = 0;
}
Jun 6, 2013
Jun 6, 2013
512
513
514
515
/* the modelist could be empty */
if(!data)
return;
Jul 1, 2013
Jul 1, 2013
516
517
if(!strcmp(data->mode_name, MODE_MASS_STORAGE))
{
Dec 12, 2013
Dec 12, 2013
518
unset_mass_storage_mode(data);
Jul 1, 2013
Jul 1, 2013
519
520
521
return;
}
Apr 15, 2015
Apr 15, 2015
522
523
524
525
526
#ifdef CONNMAN
if(data->connman_tethering)
connman_set_tethering(data->connman_tethering, FALSE);
#endif
Sep 15, 2014
Sep 15, 2014
527
528
529
530
531
if(data->network)
{
usb_network_down(data);
}
Jun 19, 2013
Jun 19, 2013
532
/* disconnect before changing functionality */
Oct 10, 2013
Oct 10, 2013
533
if(data->softconnect_disconnect)
Jun 19, 2013
Jun 19, 2013
534
535
536
{
write_to_file(data->softconnect_path, data->softconnect_disconnect);
}
May 29, 2013
May 29, 2013
537
538
539
540
if(data->sysfs_path)
{
write_to_file(data->sysfs_path, data->sysfs_reset_value);
}
Nov 5, 2015
Nov 5, 2015
541
542
543
544
545
546
547
548
/* restore vendorid if the mode had an override */
if(data->idVendorOverride)
{
char *id;
id = get_android_vendor_id();
set_android_vendorid(id);
g_free(id);
}
Jul 7, 2016
Jul 7, 2016
549
550
551
552
553
554
/* enable after the changes have been made */
if(data->softconnect)
{
write_to_file(data->softconnect_path, data->softconnect);
}
May 29, 2013
May 29, 2013
555
}
Mar 22, 2011
Mar 22, 2011
556
557
558
559
560
561
562
563
564
/** clean up mode changes or extra actions to perform after a mode change
* @param module Name of module currently in use
* @return 0 on success, non-zero on failure
*
*/
int usb_moded_mode_cleanup(const char *module)
{
Mar 1, 2012
Mar 1, 2012
565
566
log_debug("Cleaning up mode\n");
Aug 15, 2013
Aug 15, 2013
567
568
if(!module)
{
Aug 15, 2013
Aug 15, 2013
569
log_warning("No module found to unload. Skipping cleanup\n");
Aug 15, 2013
Aug 15, 2013
570
571
572
return 0;
}
Jun 6, 2013
Jun 6, 2013
573
#ifdef APP_SYNC
Jul 7, 2016
Jul 7, 2016
574
/* Stop applications started due to entering this mode */
Nov 7, 2016
Nov 7, 2016
575
appsync_stop(FALSE);
Jun 6, 2013
Jun 6, 2013
576
#endif /* APP_SYNC */
Mar 22, 2011
Mar 22, 2011
577
Aug 7, 2012
Aug 7, 2012
578
if(!strcmp(module, MODULE_MASS_STORAGE)|| !strcmp(module, MODULE_FILE_STORAGE))
Mar 22, 2011
Mar 22, 2011
579
{
Aug 23, 2012
Aug 23, 2012
580
581
/* no clean-up needs to be done when we come from charging mode. We need
to check since we use fake mass-storage for charging */
Aug 26, 2014
Aug 26, 2014
582
if(!strcmp(MODE_CHARGING, get_usb_mode()) || !strcmp(MODE_CHARGING_FALLBACK, get_usb_mode()))
Aug 23, 2012
Aug 23, 2012
583
return 0;
Dec 12, 2013
Dec 12, 2013
584
unset_mass_storage_mode(NULL);
Mar 22, 2011
Mar 22, 2011
585
586
}
Oct 8, 2013
Oct 8, 2013
587
else if(get_usb_mode_data())
Jun 19, 2013
Jun 19, 2013
588
unset_dynamic_mode();
Mar 22, 2011
Mar 22, 2011
589
Jul 1, 2013
Jul 1, 2013
590
return(0);
Mar 22, 2011
Mar 22, 2011
591
}