1d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg/* 2d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * Copyright (C) 2012 The Android Open Source Project 3d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * 4d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * Licensed under the Apache License, Version 2.0 (the "License"); 5d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * you may not use this file except in compliance with the License. 6d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * You may obtain a copy of the License at 7d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * 8d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * http://www.apache.org/licenses/LICENSE-2.0 9d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * 10d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * Unless required by applicable law or agreed to in writing, software 11d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * distributed under the License is distributed on an "AS IS" BASIS, 12d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * See the License for the specific language governing permissions and 14d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg * limitations under the License. 15d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg */ 16d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 17d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg#include <errno.h> 18d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg#include <fcntl.h> 19d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg#include <stdlib.h> 20d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg#include <string.h> 21d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 22d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg#include <linux/watchdog.h> 23d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 24d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg#include "log.h" 25d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg#include "util.h" 26d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 27d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg#define DEV_NAME "/dev/watchdog" 28d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 29d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevågint watchdogd_main(int argc, char **argv) 30d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg{ 31d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg int fd; 32d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg int ret; 33d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg int interval = 10; 34d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg int margin = 10; 35d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg int timeout; 36d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 37d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg open_devnull_stdio(); 38d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg klog_init(); 39d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 40d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg INFO("Starting watchdogd\n"); 41d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 42d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg if (argc >= 2) 43d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg interval = atoi(argv[1]); 44d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 45d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg if (argc >= 3) 46d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg margin = atoi(argv[2]); 47d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 48d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg timeout = interval + margin; 49d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 50d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg fd = open(DEV_NAME, O_RDWR); 51d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg if (fd < 0) { 52d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg ERROR("watchdogd: Failed to open %s: %s\n", DEV_NAME, strerror(errno)); 53d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg return 1; 54d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg } 55d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 56d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg ret = ioctl(fd, WDIOC_SETTIMEOUT, &timeout); 57d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg if (ret) { 58d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg ERROR("watchdogd: Failed to set timeout to %d: %s\n", timeout, strerror(errno)); 59d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg ret = ioctl(fd, WDIOC_GETTIMEOUT, &timeout); 60d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg if (ret) { 61d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg ERROR("watchdogd: Failed to get timeout: %s\n", strerror(errno)); 62d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg } else { 63d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg if (timeout > margin) 64d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg interval = timeout - margin; 65d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg else 66d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg interval = 1; 67d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg ERROR("watchdogd: Adjusted interval to timeout returned by driver: timeout %d, interval %d, margin %d\n", 68d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg timeout, interval, margin); 69d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg } 70d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg } 71d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 72d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg while(1) { 73d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg write(fd, "", 1); 74d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg sleep(interval); 75d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg } 76d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg} 77d97d9074ba818de5af45ce4e0f5c30053ae467d0Arve Hjønnevåg 78