2015年9月17日 星期四

[C] All example to execute file


        sprintf(&buffer[0], "/etc/openvpn/vpnserver%d --cd /etc/openvpn/server%d --config config.ovpn", serverNum, serverNum);
        vpnlog(VPN_LOG_INFO,"Starting OpenVPN: %s",&buffer[0]);
        for (argv[argc=0] = strtok(&buffer[0], " "); argv[argc] != NULL; argv[++argc] = strtok(NULL, " "));
        if ( _eval(argv, NULL, 0, &pid) )
        {
                vpnlog(VPN_LOG_ERROR,"Starting VPN instance failed...");
                stop_vpnserver(serverNum);
                return;
        }

        sprintf(&buffer[0], "/etc/openvpn/fw/server%d-fw.sh", serverNum);
        argv[0] = &buffer[0];
        argv[1] = NULL;
        _eval(argv, NULL, 0, NULL);

        vpnlog(VPN_LOG_EXTRA,"Adding cron job");
        argv[0] = "cru";
        argv[1] = "a";
        sprintf(&buffer[0], "CheckVPNServer%d", serverNum);
        argv[2] = &buffer[0];
        sprintf(&buffer[strlen(&buffer[0])+1], "*/%d * * * * service start_vpnserver%d", nvi, serverNum);
        argv[3] = &buffer[strlen(&buffer[0])+1];
        argv[4] = NULL;
        _eval(argv, NULL, 0, NULL);

        sprintf(&buffer[0], "/etc/openvpn/fw/server%d-fw.sh", serverNum);
        argv[0] = "sed";
        argv[1] = "-i";
        argv[2] = "s/-A/-D/g;s/-I/-D/g";
        argv[3] = &buffer[0];
        argv[4] = NULL;
        if (!_eval(argv, NULL, 0, NULL))
        {
                argv[0] = &buffer[0];
                argv[1] = NULL;
                _eval(argv, NULL, 0, NULL);
        }

Delete process which create by _eval
void killall_tk(const char *name)
{
    int n;

    if (killall(name, SIGTERM) == 0) {
        n = 10;
        while ((killall(name, 0) == 0) && (n-- > 0)) {
            _dprintf("%s: waiting name=%s n=%d\n", __FUNCTION__, name, n);
            usleep(100 * 1000);
        }
        if (n < 0) {
            n = 10;
            while ((killall(name, SIGKILL) == 0) && (n-- > 0)) {
                _dprintf("%s: SIGKILL name=%s n=%d\n", __FUNCTION__, name, n);
                usleep(100 * 1000);
            }
        }
    }
}


static int ovpn_waitfor(const char *name)
{
    int pid, n = 5;


    killall_tk(name);
    while ( (pid = pidof(name)) >= 0 && (n-- > 0) )
    {
        // Reap the zombie if it has terminated
        waitpid(pid, NULL, WNOHANG);
        sleep(1);
    }
    return (pid >= 0);
}

Reference:

0 意見:

張貼留言