/* * Copyright (c) 2000 - 2017 Samsung Electronics Co., Ltd. * * Contact: MyoungJune Park * Created by Wonil Choi * * 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 #include #include #include #include static const char *RESET_FLAG_FILE = "/opt/.factoryreset"; static const char *RUN_SCRIPT_FILE = "/usr/bin/run-factory-reset.sh"; int run_factory_reset(void) { int status; pid_t cpid; const char *script_cmd[] = {RUN_SCRIPT_FILE, NULL}; cpid = fork(); /* error */ if (cpid == -1) { perror("fork"); return -1; } /* child */ if (cpid == 0) { execvp(script_cmd[0], (char *const *)script_cmd); _exit(-1); } /* parent */ if (waitpid(cpid, &status, 0) == -1) { perror("waitpid failed"); return -1; } if (WIFSIGNALED(status)) { perror("exit by signal"); return -1; } if (!WIFEXITED(status)) { perror("exit abnormally"); return -1; } if (WIFEXITED(status) && WEXITSTATUS(status)) { perror("child return error"); return -1; } return 0; } int main(int argc, char **argv) { FILE *fp; /* touch /opt/.factoryreset */ fp = fopen(RESET_FLAG_FILE, "w"); if (fp == NULL) { perror("reset flg file open error"); return -1; } fclose(fp); run_factory_reset(); /* unlink /opt/.factoryreset */ unlink(RESET_FLAG_FILE); sync(); reboot(RB_AUTOBOOT); return 0; }