116c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Copyright (C) 2005 The Android Open Source Project
316c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
516c4d154dca43c662571129af31b27433b919a32Adam Lesinski * you may not use this file except in compliance with the License.
616c4d154dca43c662571129af31b27433b919a32Adam Lesinski * You may obtain a copy of the License at
716c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
816c4d154dca43c662571129af31b27433b919a32Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
916c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
1016c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Unless required by applicable law or agreed to in writing, software
1116c4d154dca43c662571129af31b27433b919a32Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * See the License for the specific language governing permissions and
1416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * limitations under the License.
1516c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
1616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
1716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define LOG_TAG "misc"
1816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
1916c4d154dca43c662571129af31b27433b919a32Adam Lesinski//
2016c4d154dca43c662571129af31b27433b919a32Adam Lesinski// Miscellaneous utility functions.
2116c4d154dca43c662571129af31b27433b919a32Adam Lesinski//
2216c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <androidfw/misc.h>
2316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2416c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <sys/stat.h>
254bf58108d442b37ab4adf5ce3a4ecd63472ce254Adam Lesinski#include <cstring>
2616c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <errno.h>
274bf58108d442b37ab4adf5ce3a4ecd63472ce254Adam Lesinski#include <cstdio>
2816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2916c4d154dca43c662571129af31b27433b919a32Adam Lesinskiusing namespace android;
3016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3116c4d154dca43c662571129af31b27433b919a32Adam Lesinskinamespace android {
3216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3316c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
3416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Get a file's type.
3516c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
3616c4d154dca43c662571129af31b27433b919a32Adam LesinskiFileType getFileType(const char* fileName)
3716c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
3816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    struct stat sb;
3916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
4016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (stat(fileName, &sb) < 0) {
4116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (errno == ENOENT || errno == ENOTDIR)
4216c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeNonexistent;
4316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        else {
4416c4d154dca43c662571129af31b27433b919a32Adam Lesinski            fprintf(stderr, "getFileType got errno=%d on '%s'\n",
4516c4d154dca43c662571129af31b27433b919a32Adam Lesinski                errno, fileName);
4616c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeUnknown;
4716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
4816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    } else {
4916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (S_ISREG(sb.st_mode))
5016c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeRegular;
5116c4d154dca43c662571129af31b27433b919a32Adam Lesinski        else if (S_ISDIR(sb.st_mode))
5216c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeDirectory;
5316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        else if (S_ISCHR(sb.st_mode))
5416c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeCharDev;
5516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        else if (S_ISBLK(sb.st_mode))
5616c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeBlockDev;
5716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        else if (S_ISFIFO(sb.st_mode))
5816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeFifo;
5916c4d154dca43c662571129af31b27433b919a32Adam Lesinski#ifdef HAVE_SYMLINKS
6016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        else if (S_ISLNK(sb.st_mode))
6116c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeSymlink;
6216c4d154dca43c662571129af31b27433b919a32Adam Lesinski        else if (S_ISSOCK(sb.st_mode))
6316c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeSocket;
6416c4d154dca43c662571129af31b27433b919a32Adam Lesinski#endif
6516c4d154dca43c662571129af31b27433b919a32Adam Lesinski        else
6616c4d154dca43c662571129af31b27433b919a32Adam Lesinski            return kFileTypeUnknown;
6716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
6816c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
6916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7016c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
7116c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Get a file's modification date.
7216c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
7316c4d154dca43c662571129af31b27433b919a32Adam Lesinskitime_t getFileModDate(const char* fileName)
7416c4d154dca43c662571129af31b27433b919a32Adam Lesinski{
7516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    struct stat sb;
7616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    if (stat(fileName, &sb) < 0)
7816c4d154dca43c662571129af31b27433b919a32Adam Lesinski        return (time_t) -1;
7916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    return sb.st_mtime;
8116c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
8216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8316c4d154dca43c662571129af31b27433b919a32Adam Lesinski}; // namespace android
84