diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-01-20 14:04:01 -0800 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-01-20 14:04:01 -0800 |
| commit | 8ac3a138168f79b47356fb5aea2f6d95fc3147c6 (patch) | |
| tree | 97e97f6ce4dbd0461e52b50192420b4a70b1b988 /vold/misc.c | |
| parent | 2eef60297a0ca1433d0824d6d662efd402709cfd (diff) | |
| download | system_core-8ac3a138168f79b47356fb5aea2f6d95fc3147c6.tar.gz system_core-8ac3a138168f79b47356fb5aea2f6d95fc3147c6.tar.bz2 system_core-8ac3a138168f79b47356fb5aea2f6d95fc3147c6.zip | |
auto import from //branches/cupcake/...@127101
Diffstat (limited to 'vold/misc.c')
| -rw-r--r-- | vold/misc.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/vold/misc.c b/vold/misc.c new file mode 100644 index 00000000..951414c6 --- /dev/null +++ b/vold/misc.c @@ -0,0 +1,91 @@ + +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <malloc.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +void *read_file(char *filename, ssize_t *_size) +{ + int ret, fd; + struct stat sb; + ssize_t size; + void *buffer = NULL; + + /* open the file */ + fd = open(filename, O_RDONLY); + if (fd < 0) + return NULL; + + /* find out how big it is */ + if (fstat(fd, &sb) < 0) + goto bail; + size = sb.st_size; + + /* allocate memory for it to be read into */ + buffer = malloc(size); + if (!buffer) + goto bail; + + /* slurp it into our buffer */ + ret = read(fd, buffer, size); + if (ret != size) + goto bail; + + /* let the caller know how big it is */ + *_size = size; + +bail: + close(fd); + return buffer; +} +char *truncate_sysfs_path(char *path, int num_elements_to_remove, char *buffer) +{ + int i; + + strcpy(buffer, path); + + for (i = 0; i < num_elements_to_remove; i++) { + char *p = &buffer[strlen(buffer)-1]; + + for (p = &buffer[strlen(buffer) -1]; *p != '/'; p--); + *p = '\0'; + } + + return buffer; +} + +char *read_sysfs_var(char *buffer, size_t maxlen, char *devpath, char *var) +{ + char filename[255]; + char *p; + ssize_t sz; + + sprintf(filename, "/sys%s/%s", devpath, var); + p = read_file(filename, &sz); + p[(strlen(p) - 1)] = '\0'; + strncpy(buffer, p, maxlen); + free(p); + return buffer; +} + |
