summaryrefslogtreecommitdiffstats
path: root/vold
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-02-20 07:38:35 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-02-20 07:38:35 -0800
commit3e292b9716072cae37bff5b99c1d2660555a265e (patch)
tree47b158abbad9985ee83875e28ab9a8d85a9cf72e /vold
parent261ed7551e3234aa437658796afdc4eb372da9d7 (diff)
downloadsystem_core-3e292b9716072cae37bff5b99c1d2660555a265e.zip
system_core-3e292b9716072cae37bff5b99c1d2660555a265e.tar.gz
system_core-3e292b9716072cae37bff5b99c1d2660555a265e.tar.bz2
auto import from //branches/cupcake/...@132569
Diffstat (limited to 'vold')
-rw-r--r--vold/misc.c90
1 files changed, 15 insertions, 75 deletions
diff --git a/vold/misc.c b/vold/misc.c
index b8e5957..951414c 100644
--- a/vold/misc.c
+++ b/vold/misc.c
@@ -49,11 +49,8 @@ void *read_file(char *filename, ssize_t *_size)
/* slurp it into our buffer */
ret = read(fd, buffer, size);
- if (ret != size) {
- free(buffer);
- buffer = NULL;
+ if (ret != size)
goto bail;
- }
/* let the caller know how big it is */
*_size = size;
@@ -62,90 +59,33 @@ bail:
close(fd);
return buffer;
}
-
-char *truncate_sysfs_path(char *path, int count, char *buffer, size_t bufflen)
+char *truncate_sysfs_path(char *path, int num_elements_to_remove, char *buffer)
{
- char* p;
+ int i;
- strlcpy(buffer, path, bufflen);
- p = buffer + strlen(buffer);
+ strcpy(buffer, path);
- for ( ; count > 0; count-- ) {
- while (p > buffer && p[-1] != '/') {
- p--;
- }
- if (p == buffer)
- break;
+ for (i = 0; i < num_elements_to_remove; i++) {
+ char *p = &buffer[strlen(buffer)-1];
- p -= 1;
+ for (p = &buffer[strlen(buffer) -1]; *p != '/'; p--);
+ *p = '\0';
}
- p[0] = '\0';
return buffer;
}
-/* used to read the first line of a /sys file into a heap-allocated buffer
- * this assumes that reading the file returns a list of zero-terminated strings,
- * each could also have a terminating \n before the 0
- *
- * returns NULL on error, of a new string on success, which must be freed by the
- * caller.
- */
-char *read_first_line_of(const char* filepath)
+char *read_sysfs_var(char *buffer, size_t maxlen, char *devpath, char *var)
{
- char *p, *q, *line;
- size_t len;
+ char filename[255];
+ char *p;
ssize_t sz;
- p = read_file((char*)filepath, &sz);
- if (p == NULL)
- goto FAIL;
-
- /* search end of first line */
- q = memchr(p, sz, '\0');
- if (q == NULL)
- q = p + sz; /* let's be flexible */
-
- len = (size_t)(q - p); /* compute line length */
- if (len == 0)
- goto FAIL;
-
- if (p[len-1] == '\n') { /* strip trailing \n */
- len -= 1;
- if (len == 0)
- goto FAIL;
- }
-
- line = malloc(len+1);
- if (line == NULL)
- goto FAIL;
-
- memcpy(line, p, len);
- line[len] = 0;
+ sprintf(filename, "/sys%s/%s", devpath, var);
+ p = read_file(filename, &sz);
+ p[(strlen(p) - 1)] = '\0';
+ strncpy(buffer, p, maxlen);
free(p);
-
- return line;
-
-FAIL:
- if (p != NULL)
- free(p);
-
- return NULL;
-}
-
-char *read_sysfs_var(char *buffer, size_t maxlen, char *devpath, char *var)
-{
- char filename[255], *line;
-
- snprintf(filename, sizeof filename, "/sys%s/%s", devpath, var);
-
- line = read_first_line_of(filename);
- if (line == NULL)
- return NULL;
-
- snprintf(buffer, maxlen, "%s", line);
- free(line);
-
return buffer;
}