int main(int argc, char *argv[]) { removefile_state_t state = NULL; removefile_callback_t callback = NULL; pthread_t thread = NULL; int err = 0; mkdirs(); start_timer("removefile(NULL)"); assert(removefile("/tmp/removefile-test", NULL, REMOVEFILE_SECURE_1_PASS | REMOVEFILE_RECURSIVE) == 0); stop_timer(); mkdirs(); assert((state = removefile_state_alloc()) != NULL); assert(pthread_create(&thread, NULL, threadproc, state) == 0); start_timer("removefile(state) with cancel"); assert(removefile_state_set(state, REMOVEFILE_STATE_ERROR_CALLBACK, removefile_error_callback) == 0); assert(removefile_state_set(state, REMOVEFILE_STATE_ERROR_CONTEXT, (void*)4567) == 0); assert(removefile("/tmp/removefile-test", state, REMOVEFILE_SECURE_1_PASS | REMOVEFILE_RECURSIVE) == -1 && errno == ECANCELED); stop_timer(); start_timer("removefile(NULL)"); assert(removefile("/tmp/removefile-test", NULL, REMOVEFILE_SECURE_1_PASS | REMOVEFILE_RECURSIVE) == 0); stop_timer(); mkdirs(); assert(removefile_state_set(state, 1234567, (void*)1234567) == -1 && errno == EINVAL); assert(removefile_state_set(state, REMOVEFILE_STATE_CONFIRM_CALLBACK, removefile_confirm_callback) == 0); assert(removefile_state_get(state, REMOVEFILE_STATE_CONFIRM_CALLBACK, &callback) == 0); assert(callback == removefile_confirm_callback); assert(removefile_state_set(state, REMOVEFILE_STATE_CONFIRM_CONTEXT, (void*)1234) == 0); assert(removefile_state_set(state, REMOVEFILE_STATE_ERROR_CALLBACK, removefile_error_callback) == 0); assert(removefile_state_get(state, REMOVEFILE_STATE_ERROR_CALLBACK, &callback) == 0); assert(callback == removefile_error_callback); assert(removefile_state_set(state, REMOVEFILE_STATE_ERROR_CONTEXT, (void*)4567) == 0); assert(removefile_state_set(state, REMOVEFILE_STATE_STATUS_CALLBACK, removefile_status_callback) == 0); assert(removefile_state_get(state, REMOVEFILE_STATE_STATUS_CALLBACK, &callback) == 0); assert(callback == removefile_status_callback); assert(removefile_state_set(state, REMOVEFILE_STATE_STATUS_CONTEXT, (void*)5678) == 0); start_timer("removefile(state)"); assert(removefile("/tmp/removefile-test", state, REMOVEFILE_SECURE_1_PASS | REMOVEFILE_RECURSIVE) == 0); stop_timer(); return 0; }
int /* O - 0 on success, -1 on error */ cupsdRemoveFile(const char *filename) /* I - File to remove */ { #ifdef HAVE_REMOVEFILE int ret; /* Return value */ removefile_state_t s; /* Remove state variable */ s = removefile_state_alloc(); ret = removefile(filename, s, REMOVEFILE_SECURE_7_PASS); removefile_state_free(s); return (ret); #else int fd; /* File descriptor */ struct stat info; /* File information */ char buffer[512]; /* Data buffer */ int i; /* Looping var */ /* * First open the file for writing in exclusive mode. */ if ((fd = open(filename, O_WRONLY | O_EXCL)) < 0) return (-1); /* * Delete the file now - it will still be around as long as the file is * open... */ unlink(filename); /* * Then get the file size... */ if (fstat(fd, &info)) { close(fd); return (-1); } /* * Overwrite the file 7 times with 0xF6, 0x00, 0xFF, random, 0x00, 0xFF, * and more random data. */ memset(buffer, 0xF6, sizeof(buffer)); if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) { close(fd); return (-1); } memset(buffer, 0x00, sizeof(buffer)); if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) { close(fd); return (-1); } memset(buffer, 0xFF, sizeof(buffer)); if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) { close(fd); return (-1); } for (i = 0; i < sizeof(buffer); i ++) buffer[i] = rand(); if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) { close(fd); return (-1); } memset(buffer, 0x00, sizeof(buffer)); if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) { close(fd); return (-1); } memset(buffer, 0xFF, sizeof(buffer)); if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) { close(fd); return (-1); } for (i = 0; i < sizeof(buffer); i ++) buffer[i] = rand(); if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) { close(fd); return (-1); } /* * Whew! Close the file (which will lead to the actual deletion) and * return success... */ close(fd); return (0); #endif /* HAVE_REMOVEFILE */ }