// my_parcel_restart : parcellite が起動しているか監視し、していなければ起動する
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define APP_NAME        "my_parcel_restart"
#define CHECK_INTERVAL  (2)     // 何秒おきにチェックするか
#define NO_KIDOU_LEN    (1)     // TEMP_FILEの1行目(pid)がこれ未満の文字長だったら
                                // processが起動していないとみなす
#define TEMP_FILE       "/tmp/"APP_NAME".tmp"

//------------------------------------------------------------------------------
//  TEMP_FILEから1行読み込む
//      [in]    d : 入れ先
//              s : 入れ先のサイズ
//      [out]   0 : 正常終了
//              1 : file open error
//              2 : 1行も無かった
//              3 : 引数エラー
//------------------------------------------------------------------------------
int get_one_line(char *d, int s)
{
    FILE *fp;
    int len;
    if (d == NULL || s < 2) {
        return 3;
    }
    if (NULL == (fp = fopen(TEMP_FILE, "r"))) {
        return 1;
    }
    if (NULL == fgets(d, s, fp)) {
        fclose(fp);
        return 2;
    }
    fclose(fp);
    len = strlen(d);
    if (len) {
        if (d[len - 1] == '\n') {
            len--;
            d[len] = '\0';
        }
    }
    if (len < 1) {
        return 2;
    }
    return 0;
}

//------------------------------------------------------------------------------
//  指定した名前のプロセスの起動状況を返す
//      0 : 起動していない
//      1 : 1個起動している
//      2 : 2個以上起動している
//------------------------------------------------------------------------------
int count_kidou(char *proc_name)
{
    char buff[256] = "pidof ";
    strcat(buff, proc_name);
    strcat(buff, " > " TEMP_FILE);
    system(buff);
    if (get_one_line(buff, sizeof(buff))) {
        return 0;
    }
    if (NO_KIDOU_LEN > strlen(buff)) {
        return 0;
    }
    if (NULL != strstr(buff, " ")) {
        return 2;
    }
    return 1;
}

//------------------------------------------------------------------------------
//      main
//------------------------------------------------------------------------------
int main()
{
    int res;
    // title
    fprintf(stderr, "\n" APP_NAME " : parcellite が起動しているか監視し、していなければ起動する\n\n");
    // 自分起動チェック
    if (count_kidou(APP_NAME) > 1) {
        fprintf(stderr, "  すでに自分(" APP_NAME ")が起動していた\n");
        return 0;
    }
    // mugen loop
    while (1) {
        res = count_kidou("parcellite");
        switch (res) {
        case 0:                // parcellite が起動していない
            // parcellite を起動
            system("parcellite &");
            break;
        case 1:                // parcellite が1個起動中
            break;
        case 2:                // parcellite が複数起動していた
            // 現在の parcellite を全て kill して 新しい parcellite を起動
            system("kill -9 $(pidof parcellite) ; parcellite &");
            break;
        default:
            break;
        }
        sleep(CHECK_INTERVAL);
    }
    // end
    return 0;
}
