亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? apmd.c

?? 電源管理程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
    time(&pre_suspend_time);    pre_suspend_percentage = apmi->battery_percentage;    /* Logging is okay here since the sync() happens afterward */    switch (event)    {    case APM_SYS_STANDBY:	apmd_log(event, "System Standby");	break;    case APM_USER_STANDBY:	apmd_log(event, "User Standby");	break;    }    return apm_standby(apmd_fd);}/* Resume handler.  Call the proxy, then update the battery status.  * This also handles the update time function, which does much of the * same thing.  */static void apmd_resume(apm_event_t event, apm_info * apmi){    char msg[512];    int len = 0;    ADEBUG(4, "0x%04x\n", event);    apmd_call_proxy(event, apmi);    /* Logging */    switch (event)    {    case APM_NORMAL_RESUME:	len = sprintf(msg, "Normal Resume");	break;    case APM_STANDBY_RESUME:	len = sprintf(msg, "Standby Resume");	break;    case APM_CRITICAL_RESUME:	len = sprintf(msg, "Critical Resume");	break;    case APM_UPDATE_TIME:	len = sprintf(msg, "Update Time");	break;    }    last_charging_status = apmi->battery_status;    time(&post_suspend_time);    /* Establish a minor and major checkpoint */    major_checkpoint = post_suspend_time;    major_percentage = apmi->battery_percentage;    minor_checkpoint = post_suspend_time;    minor_percentage = major_percentage;    /* Update the battery status */    if (event != APM_UPDATE_TIME && pre_suspend_time && post_suspend_time)    {	int dt = post_suspend_time - pre_suspend_time;	int dp = apmi->battery_percentage - pre_suspend_percentage;	if (dt > 0)	    len += sprintf(msg + len, " after %s", apm_time(dt));	/* describe in days if the suspend was for a long time */	if (dt > 60 * 60 * RESUME_HOURS	    && apmi->battery_percentage > 0 && pre_suspend_percentage > 0	    && last_charging_status != 0x03 && dp < 0)	{	    len += sprintf(msg + len, ", %.2f%%/day",			   ((double) dp / (double) dt) * 60. * 60. * 24.);	}    }    len += sprintf(msg + len, " (%d%% %s) %s power",		    apmi->battery_percentage,		    apm_time_nosec(apmd_time(apmi)),		    ac_descr(apmi->ac_line_status));    apmd_log(event, msg);}/* "low" battery handler -- BIOS decides what "low" means, may send alert; * APMD has a more configurable notion, dealt with similarly. */static void apmd_low_battery(apm_event_t event, apm_info * apmi){    char msg[512];    ADEBUG(4, "0x%04x\n", event);    sprintf(msg, "Battery Low Notification from %s (%d%% %s)",	    (event == APM_LOW_BATTERY ? "APM BIOS" : "apmd"),	    apmi->battery_percentage, apm_time_nosec(apmd_time(apmi)));    if (!quiet)	warn(msg);}/* Check battery status, and decide whether to log or not. */static void apmd_check_power(apm_event_t event, apm_info * apmi){    int	dt, dp, logflag = 0, len = 0, warning = 0;    int charging = IS_CHARGING(*apmi);    char msg[512];    double rate;    static int last_battery_status = 0;    static int last_ac_status = -1;    ADEBUG(4, "0x%04x\n", event);    /* Call proxy and perform special logging as needed */    switch (event)    {    case APM_POWER_STATUS_CHANGE:        /* Power status changes can happen a LOT ... e.g. for each change of	 * estimated battery life (minutes, seconds, percent) when charging	 * or discharging, battery full, empty, add/remove battery, etc.	 * Invoking the proxy on each change can use up battery power fast,	 *	 * So we just report if AC status changes -- the main use for this is	 * to make sure that power usage is reduced when running on batteries.	 * (When the kernel tracks multiple batteries that might be a good	 * time to update this to report just a bit more.)	 */	if (apmi->ac_line_status != last_ac_status) {	    apmd_call_proxy(event, apmi);	    sprintf(msg, "Now using %s Power", ac_descr(apmi->ac_line_status));	    apmd_log(event, msg);	    apmd_power_reset(event, apmi);	    last_ac_status = apmi->ac_line_status;	}	break;    case APM_LOW_BATTERY:synthetic_low_battery:	apmd_call_proxy(event, apmi);	last_battery_status = 1;	apmd_low_battery(event, apmi);	break;#ifdef APM_CAPABILITY_CHANGE    case APM_CAPABILITY_CHANGE:	apmd_call_proxy(event, apmi);	apmd_log(event, "Capability Change");	break;#endif    }    /* Check for "low" battery status.  Note: this is not an infinite loop     * because last_battery_status is guaranteed to change.      */    if (!charging && last_battery_status != 1 && apmi->battery_status == 1)    {    	event = APM_LOW_BATTERY;	goto synthetic_low_battery;    }    /* Reset the low battery state if we are now charging, etc. */    if (charging || apmi->battery_status != 1)    {	last_battery_status = 0;    }    /* If the BIOS doesn't keep track of the battery, no point going further */    if (apmi->battery_percentage < 0)	return;    /* If battery is not charging and battery percentage is changing     * AND below apmd's threshold then give low battery warning.  Both     * BIOS and APMD originate warnings, and generally at different     * percentages; the BIOS one is fixed and not always useful.     */    if (!charging	    && apmi->battery_percentage <= warn_level	    && (abs(minor_percentage - apmi->battery_percentage) > 0		|| apmi->battery_percentage == 0)	    && !quiet)	warning = 1;    dt = time(0) - major_checkpoint;    dp = major_percentage - apmi->battery_percentage;    /* If no warning, or no change since last logged message, then do nothing */    if (!warning && (dt == 0 || dp == 0))	return;    /* Decide whether to log the battery status.     * First check is when battery is fully drained or charged     */    logflag = (apmi->battery_percentage != minor_percentage)	&& ((apmi->battery_percentage == 0)		|| (apmi->battery_percentage == 100));    /* Second check is when battery percentage has decreased by      * percent_change.     */    logflag = logflag || (abs(minor_percentage - apmi->battery_percentage) >=			  (percent_change > 1 ? percent_change : 1));        /* Logging is triggered when any check is satisfied. */    if (!logflag && !warning)	return;    /* We are logging (either normal, or a warning) so establish a minor     * checkpoint -- reduces redundant logging, to no more than once per     * percentage point change.     */    minor_percentage = apmi->battery_percentage;    minor_checkpoint = time(0);    rate = (double) dp / (double) dt;    /* If we're warning about low batteries, do so ... */    if (warning != 0) {	sprintf(msg, "Battery warning (%d%% %s)",	      apmi->battery_percentage, apm_time_nosec(apmd_time(apmi)));	warn(msg);	/* ... if that's all we're doing, finish */	if (!logflag)	    return;    }    /* Begin composing the log message.  First part is charging status,     * followed by rate (in percent per minute)     */    len = sprintf(msg, "%s: %f",		  charging ? "Charge" : "Battery",		  rate * 60.0);    /* Time from full charge, or time from last power status change (ie,     * a major checkpoint)     */    if ((!charging && major_percentage == 100)	|| (charging && major_percentage == 0))	len += sprintf(msg + len, " %s", apm_time_nosec(dt));    else	len += sprintf(msg + len, " (%s)", apm_time_nosec(dt));    /* Computation of predicted battery lifetime */    if (charging)    {	len += sprintf(msg + len, " %s",		 apm_time_nosec((int) ((100.0 - apmi->battery_percentage)				       / -rate)));    }    else    {	len += sprintf(msg + len, " %s",		apm_time_nosec((int) (apmi->battery_percentage / rate)));    }    sprintf(msg + len, " (%d%% %s)",	    apmi->battery_percentage, apm_time_nosec(apmd_time(apmi)));    apmd_log(APMD_BATTERY, msg);    /* Establish a major checkpoint if we have become fully charged or     * fully drained      */    if ((apmi->battery_percentage == 0 && major_percentage != 0)	|| (apmi->battery_percentage == 100 && major_percentage != 100))    {	minor_percentage = apmi->battery_percentage;	minor_checkpoint = time(0);    }}static void sig_handler(int sig){    syslog(LOG_INFO, "Exiting");    apmd_call_proxy(APMD_STOP, 0);    unlink(PID_FILE);    exit(0);}int main(int argc, char **argv){    int debug = 0;    int c;    int fd;    int pid;    FILE *str;    apm_info apminfo, *apmi;    apm_event_t events[MAX_EVENTS];    static struct option longopts[] =    {	{"verbose", 0, 0, 'v'},	{"quiet", 0, 0, 'q'},	{"version", 0, 0, 'V'},	{"debug", 0, 0, 'd'},	{"percentage", 1, 0, 'p'},	{"warn", 1, 0, 'w'},	{"wall", 0, 0, 'W'},	{"check", 1, 0, 'c'},	{"apmd_proxy", 1, 0, 'P'},	{"help", 0, 0, '?'},	{NULL, 0, 0, 0},    };    switch (apm_exists())    {    case 1:	fprintf(stderr, "No APM support in kernel\n");	exit(1);    case 2:	fprintf(stderr, "Old APM support in kernel\n");	exit(2);    }    while ((c = getopt_long(argc, argv,		/* "-d" not documented */		"uVvqdp:w:Wc:P:?",		longopts, NULL))	   != -1)	switch (c)	{	case 'V':	    fprintf(stderr, "apmd version %s\n", VERSION);	    exit(0);	    break;	case 'v':	    ++verbose;	    break;	case 'q':	    ++quiet;	    break;	case 'd':	    ++debug;	    break;	case 'p':	    percent_change = atoi(optarg);	    break;	case 'w':	    warn_level = atoi(optarg);	    break;	case 'W':	    ++wall;	    break;	case 'u':	    fprintf(stderr,		    "WARNING:\n"		    "  apmd's internal clock setting has been replaced by the "		    "apmd_proxy!\n"		    "  To set the clock to UTC, you must edit the apmd_proxy "		    "program.\n\n");	    break;	case 'c':	    check_power_time = atoi(optarg);	    break;	case 'P':	    apmd_proxy = optarg;	    break;	case '?':	default:	    usage();	    break;	}    if (!access(PID_FILE, R_OK))    {	if ((str = fopen(PID_FILE, "r")))	{	    fscanf(str, "%d", &pid);	    fclose(str);	    	    if (!kill(pid, 0) || errno == EPERM)	    {		fprintf(stderr,			"An apmd is already running as process %d:\n"			"If it is no longer running, remove %s\n",			pid, PID_FILE);		exit(1);	    }	}    }    if ((apmd_uid = getuid()))    {	fprintf(stderr, "apmd: must be run as root\n");	exit(1);    }    openlog("apmd", (debug ? LOG_PERROR : 0) | LOG_PID | LOG_CONS, LOG_DAEMON);    if (signal(SIGINT, SIG_IGN) != SIG_IGN)	signal(SIGINT, sig_handler);    if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)	signal(SIGQUIT, sig_handler);    if (signal(SIGTERM, SIG_IGN) != SIG_IGN)	signal(SIGTERM, sig_handler);    if (!debug)    {				/* detach */	if ((pid = fork()))	{			/* parent */	    if ((str = fopen(PID_FILE, "w")))	    {		fprintf(str, "%d\n", pid);		fclose(str);	    }	    exit(0);	}	/* child */	if (pid < 0)	{	    syslog(LOG_INFO, "fork() failed: %m");	    unlink(PID_FILE);	    exit(1);	}		/* Child.  Follow the daemon rules in	 * W. Richard Stevens. Advanced Programming	 * in the UNIX Environment (Addison-Wesley	 * Publishing Co., 1992). Page 417.).	 */	if (setsid() < 0)	{	    syslog(LOG_INFO, "setsid() failed: %m");	    unlink(PID_FILE);	    exit(1);	}	chdir("/");	close(0);	close(1);	close(2);	umask(0);    }    if ((fd = apm_open()) < 0)    {	syslog(LOG_INFO, "apm_open() failed: %m");	unlink(PID_FILE);	exit(1);    }    if (!apm_read(&apminfo))    {	apmd_init(&apminfo);	apmd_fd = fd;    }    for (;;)    {	int n = apm_get_events(fd, check_power_time, events, MAX_EVENTS);	int i;	/* If the call was timed-out, then we cause a "simulated" 	 * UPDATE_TIME event. 	 */	if (n == 0)	{	    n = 1;	    events[0] = APMD_SYNTHETIC_CHECK;	}	for (i = 0; i < n; i++)	{	    if (apm_read(&apminfo))		continue;	    apmi = &apminfo;	    ADEBUG(4, " [event loop] 0x%04x\n", events[i]);	    if (verbose)		syslog(LOG_INFO, "Event 0x%04x: %s",		       events[i], apm_event_name(events[i]));	    switch (events[i])	    {	    case APM_SYS_STANDBY:	    case APM_USER_STANDBY:		apmd_standby(events[i], apmi);		break;	    case APM_SYS_SUSPEND:	    case APM_USER_SUSPEND:		apmd_suspend(events[i], apmi);		break;	    case APM_CRITICAL_SUSPEND:		time(&pre_suspend_time);		pre_suspend_percentage = 0;		/* As fast as possible */		ioctl(fd, APM_IOC_SUSPEND, NULL);		break;	    case APM_NORMAL_RESUME:	    case APM_STANDBY_RESUME:	    case APM_UPDATE_TIME:	    case APM_CRITICAL_RESUME:		apmd_resume(events[i], apmi);		apmd_check_power(events[i], apmi);		break;	    case APMD_SYNTHETIC_CHECK:		apmd_log(events[i], "performing APM status check");		apmd_check_power(events[i], apmi);		break;	    case APM_LOW_BATTERY:	    case APM_POWER_STATUS_CHANGE:#ifdef        APM_CAPABILITY_CHANGE	    case APM_CAPABILITY_CHANGE:#endif		apmd_check_power(events[i], apmi);		break;	    default:		/* These aren't errors; see the APM BIOS 1.2 spec.		 * 0x000d-0x00ff	reserved system events		 * 0x0100-0x01ff	reserved device events		 * 0x0200-0x02ff	OEM-defined		 * 0x0300-0xffff	reserved		 */		syslog(LOG_ERR, "Received unknown APM event 0x%04x.",			events[i]);	    }	}    }    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久欧美精品sm网站| 日韩黄色一级片| 亚洲欧美国产77777| 亚洲天堂网中文字| 一区二区高清在线| 亚洲午夜一二三区视频| 日韩高清不卡一区| 国产精品资源站在线| 成人免费视频一区| 91成人免费在线视频| 88在线观看91蜜桃国自产| 欧美日韩亚洲综合一区二区三区| 欧美一二三区精品| 国产亚洲欧美一区在线观看| 国产精品久久久久久久久快鸭| 亚洲女同女同女同女同女同69| 午夜精品福利在线| 国内国产精品久久| 99久久精品一区二区| 欧美日韩日本视频| 精品国产91亚洲一区二区三区婷婷| 久久综合成人精品亚洲另类欧美| 亚洲国产精品成人综合| 亚洲国产成人av| 婷婷成人激情在线网| 精一区二区三区| 九色综合国产一区二区三区| av亚洲精华国产精华精华| 欧美三级在线播放| 久久久久高清精品| 亚洲另类中文字| 伦理电影国产精品| 99久久夜色精品国产网站| 欧美三级电影一区| 国产喷白浆一区二区三区| 成人深夜视频在线观看| 欧美精品一二三区| 久久奇米777| 亚洲色图视频免费播放| 日韩国产精品91| 丁香婷婷综合色啪| 制服视频三区第一页精品| 欧美国产日韩在线观看| 全国精品久久少妇| 色老汉一区二区三区| 日韩免费一区二区| 亚洲精品视频观看| 国产成人亚洲综合a∨猫咪| 欧美日韩亚洲国产综合| 中文字幕精品—区二区四季| 日韩国产成人精品| 日本黄色一区二区| 久久久综合网站| 午夜精品国产更新| 91蜜桃传媒精品久久久一区二区| 欧美电影免费观看高清完整版在线| 亚洲天堂中文字幕| 国产经典欧美精品| 精品久久久网站| 午夜精品久久久久久久蜜桃app| 成人a级免费电影| 精品国产一区二区三区不卡 | 欧美精品一区二区三区在线| 亚洲精品日韩一| 国产成人在线视频免费播放| 日韩欧美电影一区| 五月天中文字幕一区二区| 97精品久久久午夜一区二区三区| 久久亚洲一级片| 美女视频一区二区| 91麻豆精品国产91久久久久久 | 亚洲成人免费视频| 国产美女精品在线| 欧美视频在线播放| 亚洲综合免费观看高清完整版在线| 高清不卡在线观看| 国产亚洲污的网站| 狠狠色伊人亚洲综合成人| 日韩视频一区二区在线观看| 亚洲高清一区二区三区| 在线亚洲一区观看| 亚洲最新视频在线播放| 93久久精品日日躁夜夜躁欧美| xvideos.蜜桃一区二区| 另类中文字幕网| 日韩三级视频中文字幕| 蜜臀久久99精品久久久画质超高清 | 亚洲.国产.中文慕字在线| 97久久精品人人做人人爽| 国产精品嫩草影院com| 国产一区二区福利| 国产亚洲欧洲997久久综合| 国产精品一区二区在线观看不卡| 欧美一区二区成人6969| 制服丝袜亚洲色图| 亚洲免费观看高清| 欧美亚洲国产一区在线观看网站 | 成人欧美一区二区三区在线播放| 国产成人激情av| 国产精品丝袜黑色高跟| 国产福利不卡视频| 国产人伦精品一区二区| 成人免费不卡视频| 1024亚洲合集| 欧美性生活大片视频| 亚洲在线视频网站| 欧美羞羞免费网站| 亚洲精品成人在线| 欧美精品一二三| 韩国成人福利片在线播放| 国产欧美一区二区精品仙草咪| 盗摄精品av一区二区三区| 亚洲欧洲99久久| 欧美三级电影网| 精品在线免费观看| 国产午夜精品在线观看| 成人免费视频国产在线观看| 1024国产精品| 欧美精品第一页| 激情五月婷婷综合| 亚洲欧洲精品一区二区三区| 欧美在线观看视频一区二区三区 | 精品一区二区在线看| 欧美激情一区三区| 在线免费观看视频一区| 蜜桃视频免费观看一区| 国产三级精品视频| 欧美制服丝袜第一页| 亚洲成av人片一区二区三区 | 亚洲欧美日韩中文播放| 欧美高清hd18日本| 国产在线不卡一区| 亚洲综合小说图片| 精品理论电影在线观看| 91麻豆精品秘密| 日韩精品久久久久久| 中文字幕欧美激情一区| 欧美日韩国产精品自在自线| 日韩成人dvd| 国产精品久久久久久户外露出| 欧美日韩高清一区| 国产一区二区三区综合| 亚洲一区二区欧美| 2017欧美狠狠色| 欧美无砖专区一中文字| 日韩在线卡一卡二| 国产欧美精品区一区二区三区 | 91在线观看地址| 国产一区 二区| 亚洲成人tv网| 亚洲色图都市小说| 久久一日本道色综合| 欧美日韩国产bt| 91蝌蚪国产九色| 国产成人h网站| 激情深爱一区二区| 日韩精品免费视频人成| 一区二区三区视频在线观看| 日本一区二区三区电影| 精品少妇一区二区三区| 欧美精品一卡二卡| 在线视频综合导航| 成人动漫在线一区| 粉嫩aⅴ一区二区三区四区| 韩国成人在线视频| 美女看a上一区| 美女在线视频一区| 日本在线不卡一区| 欧美人xxxx| 欧美日韩一二区| 欧美视频完全免费看| 在线观看日韩高清av| 99精品视频中文字幕| 国产aⅴ精品一区二区三区色成熟| 久久av中文字幕片| 久久99国产精品久久99果冻传媒| 奇米影视一区二区三区小说| 日韩中文字幕不卡| 日韩精彩视频在线观看| 日韩高清在线电影| 日韩av一级片| 毛片av一区二区| 久久国产乱子精品免费女| 久久爱www久久做| 精品无人码麻豆乱码1区2区 | 日韩女优制服丝袜电影| 日韩精品一区二区三区在线播放| 欧美绝品在线观看成人午夜影视| 欧美在线高清视频| 欧美精品粉嫩高潮一区二区| 欧美巨大另类极品videosbest| 欧美日韩www| 欧美精品aⅴ在线视频| 日韩一区二区视频在线观看| 欧美一区二区在线看| 精品av久久707| 国产午夜精品在线观看| 国产精品美女久久福利网站| 亚洲欧洲日产国产综合网| 伊人婷婷欧美激情|