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

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

?? mmcmgr.c

?? 一個基于armlinux的管理精靈進程
?? C
字號:
/*======================================================================

    MMC Card Manager daemon

    mmcmgr.c 1.183 2003/02/27 07:11:45

    The contents of this file are subject to the Mozilla Public
    License Version 1.1 (the "License"); you may not use this file
    except in compliance with the License. You may obtain a copy of
    the License at http://www.mozilla.org/MPL/

    Software distributed under the License is distributed on an "AS
    IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
    implied. See the License for the specific language governing
    rights and limitations under the License.

    The initial developer of the original code is David A. Hinds
    <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
    are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.

    Alternatively, the contents of this file may be used under the
    terms of the GNU General Public License version 2 (the "GPL"), in
    which case the provisions of the GPL are applicable instead of the
    above.  If you wish to allow the use of your version of this file
    only under the terms of the GPL and not to allow others to use
    your version of this file under the MPL, indicate your decision
    by deleting the provisions above and replace them with the notice
    and other provisions required by the GPL.  If you do not delete
    the provisions above, a recipient may use your version of this
    file under either the MPL or the GPL.
    
======================================================================*/

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <syslog.h>
#include <getopt.h>
#include <signal.h>
#include <stdarg.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/utsname.h>
#include <sys/file.h>


#define MAX_SOCKS 1
static int g_fd = -1;
static int sockets;
/*====================================================================*/

static int execute(char *msg, char *cmd)
{
    int ret;
    FILE *f;
    char line[256];

    syslog(LOG_INFO, "executing: '%s'", cmd);
    strcat(cmd, " 2>&1");
    f = popen(cmd, "r");
    while (fgets(line, 255, f)) {
	line[strlen(line)-1] = '\0';
	syslog(LOG_INFO, "+ %s", line);
    }
    ret = pclose(f);
    if (WIFEXITED(ret)) {
	if (WEXITSTATUS(ret))
	    syslog(LOG_INFO, "%s exited with status %d",
		   msg, WEXITSTATUS(ret));
	return WEXITSTATUS(ret);
    } else
	syslog(LOG_INFO, "%s exited on signal %d",
	       msg, WTERMSIG(ret));
    return -1;
}

/*====================================================================*/

/*====================================================================*/

static void fork_now(void)
{
    int ret;
    if ((ret = fork()) > 0)
	_exit(0);
    if (ret == -1)
	syslog(LOG_ERR, "forking: %m");
    if (setsid() < 0)
	syslog(LOG_ERR, "detaching from tty: %m");
}    

/*====================================================================*/

/* most recent signal */
static int caught_signal = 0;

static void catch_signal(int sig)
{
    caught_signal = sig;
    if (signal(sig, catch_signal) == SIG_ERR)
	syslog(LOG_INFO, "signal(%d): %m", sig);
}

static void handle_signal(void)
{
    int i;
    char umount[64] = "umount /mnt/mmc";

    switch (caught_signal) {
    case SIGTERM:
    case SIGINT:
	execute("mmcmgr terminated, umount file system", umount);
	exit(0);
	break;
    case SIGHUP:
	break;
#ifdef SIGPWR
    case SIGPWR:
	break;
#endif
    }
}

/*********************************************** 
 * BEGIN: routines for char device "mmc_event" *
 ***********************************************/
static int major = 0;

/* find a device's major number from /proc/devices */
static int lookup_dev(char *name)
{
    FILE *f;
    int n;
    char s[32], t[32];

    f = fopen("/proc/devices", "r");
    if (f == NULL)
            return -errno;
    while (fgets(s, 32, f) != NULL) {
        if (sscanf(s, "%d %s", &n, t) == 2)
        if (strcmp(name, t) == 0)
            break;
    }
    fclose(f);
    if (strcmp(name, t) == 0)
        return n;
    else
        return -ENODEV;
}

/* make a device node with the dev_t(major<<8 | minor),
 * then open it and return the file descriptor. 
 */
int open_dev(dev_t dev, int mode)
{
    /* here we provides some optional paths for the device node */
    static char *paths[] = {
        "/var/lib/mmc", "/var/run", "/dev", "/tmp", NULL
	};
    static int nd = 0;
    char **p, fn[64];
    int fd;

    int o_mode = (mode & S_IWRITE) ? O_RDWR : O_RDONLY;
    /* look for a path we can make the node file */
    for (p = paths; *p; p++) {
        sprintf(fn, "%s/mmc-node", *p);
        if (mknod(fn, mode, dev) == 0) {
            fd = open(fn, o_mode);
            if (fd < 0)
                fd = open(fn, O_NONBLOCK|o_mode);
            unlink(fn);
            if (fd >= 0)
                return fd;
            if (errno == ENODEV)
                break;
        }

    }
    return -1;
}

/* give it the minor(sock) number and access mode */
int open_sock(int sock, int mode)
{
	dev_t dev = (major<<8) + sock;
        return open_dev(dev, mode);
}

/* main routine for init "mmc_event" device:
 * 1. lookup_dev()
 * 	find the major of the device from /proc/devices
 * 2. open_sock()
 * 	create a node with the major and minor(0)
 * 3. assign the fd to global variable g_fd
 */
static int init_sockets(void)
{
    int fd, i;

    major = lookup_dev("mmc_event");
    if (major < 0) {
            if (major == -ENODEV)
                syslog(LOG_ERR, "no pcmcia driver in /proc/devices");
            else
                syslog(LOG_ERR, "could not open /proc/devices: %m");
            exit(EXIT_FAILURE);
    }
    for (fd = -1, i = 0; i < MAX_SOCKS; i++) {
        fd = open_sock(i, S_IFCHR|S_IREAD|S_IWRITE);
        if (fd < 0) break;
        g_fd = fd;
    }
    if ((fd < 0) && (errno != ENODEV) && (errno != ENOENT))
        syslog(LOG_ERR, "open_sock(socket %d) failed: %m", i);
    sockets = i;
    if (sockets == 0) {
        if (errno == ENODEV)
             syslog(LOG_ERR, "no sockets found!");
        else if (errno == EBUSY)
             syslog(LOG_ERR, "another cardmgr is already running?");
        return -1;
    } else
        syslog(LOG_INFO, "watching %d sockets", sockets);

    return 0;
}
/********************************************* 
 * END: routines for char device "mmc_event" *
 *********************************************/

/*====================================================================*/
static char *pidfile = "/var/run/mmcmgr.pid";

static void write_pid(void)
{
    FILE *f;
    f = fopen(pidfile, "w");
    if (f == NULL)
        syslog(LOG_WARNING, "could not open %s: %m", pidfile);
    else {
        fprintf(f, "%d\n", getpid());
        fclose(f);
    }
}

/* 
 * int main(int argc, char *argv[])
 *   1. init_sockets()
 * 	open "mmc_event" device and store the file descriptor in g_fd.
 *   2. fork_now()
 * 	run as a daemon
 *   3. write_pid()
 * 	store its process id in /var/run/mmcmgr.pid
 *   4. FD_ZERO(&fds) and FD_SET(g_fd, &fds)
 * 	init a fd_set structure for slelect, which monitors the g_fd.
 *   5. select()
 * 	monitoring g_fd for an event, sleep on g_fd when it is empty.
 *   6. read() and switch(event)
 * 	read an event and execute mount/umount.
 * one more thing, we use handle_signal to serve a system signal issued
 * when we sleep on g_fd.
 */
int main(int argc, char *argv[])
{
    int i, max_fd, ret;
    fd_set fds;
    unsigned int event = 0;
    char mount[128] = "mount -t vfat /dev/mmca1 /mnt/mmc";
    char umount[64] = "umount /mnt/mmc";

    putenv("PATH=/bin:/sbin:/usr/bin:/usr/sbin");

    /* open the "mmc_event" device */
    if (init_sockets() != 0)
	    exit(EXIT_FAILURE);

    /* daemonlize */
    fork_now();
    syslog(LOG_INFO, "mmcmgr starting, version is 1.0");

    write_pid();
    if (signal(SIGHUP, catch_signal) == SIG_ERR)
	syslog(LOG_ERR, "signal(SIGHUP): %m");
    if (signal(SIGTERM, catch_signal) == SIG_ERR)
	syslog(LOG_ERR, "signal(SIGTERM): %m");
    if (signal(SIGINT, catch_signal) == SIG_ERR)
	syslog(LOG_ERR, "signal(SIGINT): %m");
#ifdef SIGPWR
    if (signal(SIGPWR, catch_signal) == SIG_ERR)
	syslog(LOG_ERR, "signal(SIGPWR): %m");
#endif

    if ( g_fd == -1 ) {
	syslog(LOG_ERR, "open(): %m");
	exit(EXIT_FAILURE);
    }
    max_fd = g_fd;
    for (;;) {
	FD_ZERO(&fds);
	FD_SET(g_fd, &fds);

	/* wait for an event on the devcie */
	while ((ret = select(max_fd+1, &fds, NULL, NULL, NULL)) < 0) {
	    if (errno == EINTR) {
		handle_signal();
	    } else {
		syslog(LOG_ERR, "select(): %m");
		exit(EXIT_FAILURE);
	    }
	}

	if (!FD_ISSET(g_fd, &fds))
	    continue;
	ret = read(g_fd, &event, 4);
	if ((ret == -1) && (errno != EAGAIN))
	    syslog(LOG_INFO, "read(%d): %m\n", i);
	/* deal with the event returned */
	switch (event) {
		case 0:
			execute("removed!", umount);
			break;	
		case 1:
			execute("inserted!", mount);
			break;
	}

    } /* repeat */
    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩亚洲电影在线| 国产久卡久卡久卡久卡视频精品| 日本一区二区免费在线观看视频 | 日韩精品一区二区三区视频| 欧美精品色一区二区三区| 精品国产不卡一区二区三区| 久久精品水蜜桃av综合天堂| 中文字幕日韩一区| 亚洲丶国产丶欧美一区二区三区| 亚洲小说欧美激情另类| 国产老女人精品毛片久久| 91女神在线视频| 欧美精品一区二区三区高清aⅴ | 国产成人av在线影院| 91视频www| 中文av字幕一区| 韩国女主播成人在线| 欧美日韩国产免费| 亚洲视频免费在线| 91在线视频网址| 久久新电视剧免费观看| 婷婷丁香激情综合| 欧美三级韩国三级日本三斤| 久久久91精品国产一区二区精品| 亚洲国产另类av| 91麻豆成人久久精品二区三区| 国产日韩av一区二区| 蜜桃久久久久久| 欧美久久久影院| 日韩黄色在线观看| 欧美日韩国产高清一区二区三区| 亚洲欧洲日产国产综合网| av午夜一区麻豆| 亚洲尤物视频在线| 欧美一区三区二区| 激情综合网最新| 亚洲国产成人私人影院tom | 日韩精品中午字幕| 亚洲成人动漫在线观看| 日韩欧美电影一区| 粉嫩av一区二区三区粉嫩| 国产精品久久久久久久浪潮网站 | 久久人人爽人人爽| 国产成人亚洲综合a∨婷婷| 中文字幕国产一区二区| 在线精品国精品国产尤物884a| 亚洲成人精品一区二区| 日韩视频一区在线观看| 国产精品正在播放| 综合婷婷亚洲小说| 7777精品伊人久久久大香线蕉经典版下载| 亚洲1区2区3区4区| 国产精品视频第一区| 欧美日韩视频不卡| youjizz久久| 蜜臀精品久久久久久蜜臀| 国产性天天综合网| 欧美一区二区美女| 91免费观看国产| 国产精品99久久久久久久女警| 樱花草国产18久久久久| 久久尤物电影视频在线观看| 色综合天天综合色综合av | 中文字幕日本不卡| 337p粉嫩大胆噜噜噜噜噜91av| 色婷婷综合在线| av在线不卡电影| av激情亚洲男人天堂| 九一九一国产精品| 日韩va欧美va亚洲va久久| 亚洲色图欧洲色图婷婷| 亚洲国产激情av| 国产精品网站在线| 久久久久久免费网| wwwwww.欧美系列| 国产亚洲婷婷免费| 国产精品五月天| 亚洲免费在线电影| 亚洲一区二区在线播放相泽| 亚洲欧洲三级电影| 亚洲永久精品国产| 午夜久久久久久久久| 亚洲在线免费播放| 日本亚洲最大的色成网站www| 亚洲在线观看免费视频| 日韩和欧美一区二区| 国产另类ts人妖一区二区| 成人开心网精品视频| 成人一区二区三区视频在线观看 | 亚洲制服丝袜av| 激情六月婷婷综合| 99精品视频中文字幕| 欧美日韩国产在线观看| 久久这里只有精品首页| 国产精品国产三级国产aⅴ中文| 国产精品妹子av| 亚洲成人一区二区在线观看| 国内国产精品久久| 97超碰欧美中文字幕| 欧美一区二区三区成人| 中文字幕国产一区| 欧美a级理论片| av亚洲精华国产精华精| 久久理论电影网| 一二三区精品福利视频| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产偷国产偷亚洲高清人白洁 | 在线观看免费一区| 亚洲日本在线天堂| 国产精品亚洲一区二区三区在线 | 日日噜噜夜夜狠狠视频欧美人 | 亚洲欧美日本韩国| 成人综合激情网| 日韩精品一区二区三区视频| 亚洲午夜免费视频| 成人黄色国产精品网站大全在线免费观看| 欧美绝品在线观看成人午夜影视| 亚洲天堂中文字幕| 国产成人夜色高潮福利影视| 精品国产91九色蝌蚪| 看电视剧不卡顿的网站| 91久久免费观看| 亚洲欧美日韩电影| 色吊一区二区三区| 亚洲一区二区美女| 在线欧美日韩国产| 亚洲激情综合网| 欧美三级日本三级少妇99| 亚洲一本大道在线| 欧美一区二区女人| 国产一区二区三区精品欧美日韩一区二区三区 | 天天操天天干天天综合网| 欧美系列在线观看| 午夜精品久久久久久久久久| 日韩一级高清毛片| 国产精品一区二区在线观看网站 | 麻豆久久久久久| 久久久久久99久久久精品网站| 国产不卡一区视频| 亚洲国产欧美在线人成| 欧美一区二区三区免费视频| 国产一级精品在线| 一级精品视频在线观看宜春院| 3d动漫精品啪啪1区2区免费| 国模套图日韩精品一区二区 | 日韩精品色哟哟| 欧美电影影音先锋| 欧美日免费三级在线| 97精品久久久久中文字幕| 色婷婷精品久久二区二区蜜臀av| 久久精品国产一区二区| 国产精品不卡在线观看| 日韩午夜三级在线| 欧美日韩在线亚洲一区蜜芽| 国产精品一区二区三区四区| 亚洲最大的成人av| 中文无字幕一区二区三区| 日本韩国欧美国产| 成人av资源在线观看| 国产一区二区成人久久免费影院| 亚洲一区二区三区四区五区中文 | 国产成+人+日韩+欧美+亚洲| 美腿丝袜一区二区三区| 精品一区二区三区免费视频| 激情小说亚洲一区| 国产成人精品网址| 欧美性受极品xxxx喷水| 色吧成人激情小说| 在线不卡一区二区| 欧美精品色综合| 精品欧美乱码久久久久久 | www.成人网.com| 懂色av一区二区在线播放| 懂色av中文一区二区三区| 国产mv日韩mv欧美| 成人h版在线观看| 欧美伊人久久久久久午夜久久久久| 欧美人与z0zoxxxx视频| 精品国产乱码久久久久久免费| www国产成人| 欧美日韩国产影片| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产一区二区日韩精品| 欧美日韩国产三级| 亚洲一区二区三区四区五区黄| 韩国v欧美v日本v亚洲v| 91在线观看地址| 国产午夜精品久久| 久久国产剧场电影| 欧美肥妇free| 亚洲精品第1页| 久久精品国产99| 91超碰这里只有精品国产| 国产精品网站导航| 精品一二三四在线| 欧洲在线/亚洲| 亚洲欧洲日韩在线| 国产 欧美在线| 中文在线一区二区| 精品一区二区三区免费视频|