watchdogd.c revision d97d9074ba818de5af45ce4e0f5c30053ae467d0
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