• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <fcntl.h>
18 #include <unistd.h>
19 
20 template<int (*mk_fn)(char*)>
21 class GenericTemporaryFile {
22  public:
23   GenericTemporaryFile(const char* dirpath = NULL) {
24     if (dirpath != NULL) {
25       init(dirpath);
26     } else {
27       // Since we might be running on the host or the target, and if we're
28       // running on the host we might be running under bionic or glibc,
29       // let's just try both possible temporary directories and take the
30       // first one that works.
31       init("/data/local/tmp");
32       if (fd == -1) {
33         init("/tmp");
34       }
35     }
36   }
37 
~GenericTemporaryFile()38   ~GenericTemporaryFile() {
39     close(fd);
40     unlink(filename);
41   }
42 
reopen()43   void reopen() {
44     close(fd);
45     fd = open(filename, O_RDWR);
46   }
47 
48   int fd;
49   char filename[1024];
50 
51  private:
init(const char * tmp_dir)52   void init(const char* tmp_dir) {
53     snprintf(filename, sizeof(filename), "%s/TemporaryFile-XXXXXX", tmp_dir);
54     fd = mk_fn(filename);
55   }
56 };
57 
58 typedef GenericTemporaryFile<mkstemp> TemporaryFile;
59 
60 class TemporaryDir {
61  public:
TemporaryDir()62   TemporaryDir() {
63     if (!init("/data/local/tmp")) {
64       init("/tmp");
65     }
66   }
67 
~TemporaryDir()68   ~TemporaryDir() {
69     rmdir(dirname);
70   }
71 
72   char dirname[1024];
73 
74  private:
init(const char * tmp_dir)75   bool init(const char* tmp_dir) {
76     snprintf(dirname, sizeof(dirname), "%s/TemporaryDir-XXXXXX", tmp_dir);
77     return (mkdtemp(dirname) != NULL);
78   }
79 
80 };
81