110
113
char *maketmpdir(const char *dir)
117
snprintf(buf, sizeof(buf), "%s/XXXXXXX", dir);
120
snprintf(buf, sizeof(buf), "%s/%sXXXXXXX", dir, destroy_dir_magic);
118
121
if ((tmp = mkdtemp(buf)) == NULL) {
119
logger(0, errno, "Error in mkdtemp(%s)", buf);
122
logger(-1, errno, "Error in mkdtemp(%s)", buf);
122
125
len = strlen(dir);
123
tmp_dir = (char *)malloc(strlen(tmp) - len);
126
tmp_dir = (char *)malloc(strlen(tmp) - len);
124
127
if (tmp_dir == NULL)
126
strcpy(tmp_dir, tmp + len + 1);
129
strcpy(tmp_dir, tmp + len + 1);
134
/* Removes all the directories under 'root'
135
* those names start with 'destroy_dir_magic'
131
137
static void _destroydir(char *root)
133
139
char buf[STR_SIZE];
143
149
while ((ep = readdir(dp))) {
144
if (!strcmp(ep->d_name, ".") ||
145
!strcmp(ep->d_name, ".."))
150
if (strncmp(ep->d_name, destroy_dir_magic,
151
sizeof(destroy_dir_magic) - 1))
149
155
snprintf(buf, sizeof(buf), "%s/%s", root, ep->d_name);
150
156
if (stat(buf, &st))
152
if (!S_ISDIR(st.st_mode))
158
if (!S_ISDIR(st.st_mode))
154
160
snprintf(buf, sizeof(buf), "rm -rf %s/%s",
155
161
root, ep->d_name);
176
182
if (stat(dir, &st)) {
177
183
if (errno != ENOENT) {
178
logger(0, errno, "Unable to stat %s", dir);
184
logger(-1, errno, "Unable to stat %s", dir);
183
189
if (!S_ISDIR(st.st_mode)) {
184
logger(0, 0, "Warning: VPS private area is not a directory");
190
logger(-1, 0, "Warning: VE private area is not a directory");
185
191
if (unlink(dir)) {
186
logger(0, errno, "Unable to unlink %s", dir);
192
logger(-1, errno, "Unable to unlink %s", dir);
191
197
root = get_destroy_root(dir);
192
198
if (root == NULL) {
193
logger(0, 0, "Unable to get root for %s", dir);
199
logger(-1, 0, "Unable to get root for %s", dir);
196
snprintf(tmp, sizeof(buf), "%s/tmp", root);
202
snprintf(tmp, sizeof(tmp), "%s/tmp", root);
198
204
if (!stat_file(tmp)) {
199
205
if (mkdir(tmp, 0755)) {
200
logger(0, errno, "Can't create tmp dir %s", tmp);
206
logger(-1, errno, "Can't create tmp dir %s", tmp);
201
207
return VZ_FS_DEL_PRVT;
204
210
/* First move to del */
205
211
if ((tmp_nm = maketmpdir(tmp)) == NULL) {
206
logger(0, 0, "Unable to generate temporary name in %s", tmp);
212
logger(-1, 0, "Unable to generate temporary name in %s", tmp);
207
213
return VZ_FS_DEL_PRVT;
209
snprintf(buf, sizeof(tmp), "%s/%s", tmp, tmp_nm);
215
snprintf(buf, sizeof(buf), "%s/%s", tmp, tmp_nm);
211
217
if (rename(dir, buf)) {
212
logger(0, errno, "Can't move %s -> %s", dir, buf);
218
logger(-1, errno, "Can't move %s -> %s", dir, buf);
214
220
return VZ_FS_DEL_PRVT;
259
265
return VZ_VE_PRIVATE_NOTSET;
260
266
if (check_var(fs->root, "VE_ROOT is not set"))
261
267
return VZ_VE_ROOT_NOTSET;
268
if (vps_is_run(h, veid)) {
269
logger(0, 0, "VE is currently runing."
270
" Stop it before proceeding.");
271
return VZ_VE_RUNNING;
262
273
if (vps_is_mounted(fs->root)) {
263
logger(0, 0, "VPS is currently mounted (umount first)");
264
return VZ_FS_MOUNTED;
274
logger(0, 0, "VE is currently mounted (umount first)");
275
return VZ_FS_MOUNTED;
266
logger(0, 0, "Destroying VPS private area: %s", fs->private);
277
logger(0, 0, "Destroying VE private area: %s", fs->private);
267
278
if ((ret = vps_destroy_dir(veid, fs->private)))
269
280
move_config(veid, BACKUP);
271
logger(0, 0, "VPS private area was destroyed");
282
logger(0, 0, "VE private area was destroyed");