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

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

?? ulockmgr.c

?? linux下無需加載到內核的驅動模板。例如ntfs-3g等就使用了它
?? C
字號:
/*    libulockmgr: Userspace Lock Manager Library    Copyright (C) 2006  Miklos Szeredi <miklos@szeredi.hu>    This program can be distributed under the terms of the GNU LGPL.    See the file COPYING.LIB*//* #define DEBUG 1 */#include "ulockmgr.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <pthread.h>#include <errno.h>#include <assert.h>#include <signal.h>#include <sys/stat.h>#include <sys/socket.h>#include <sys/wait.h>struct message {    unsigned intr : 1;    unsigned nofd : 1;    pthread_t thr;    int cmd;    int fd;    struct flock lock;    int error;};struct fd_store {    struct fd_store *next;    int fd;    int inuse;};struct owner {    struct owner *next;    struct owner *prev;    struct fd_store *fds;    void *id;    size_t id_len;    int cfd;};static pthread_mutex_t ulockmgr_lock;static int ulockmgr_cfd = -1;static struct owner owner_list = { .next = &owner_list, .prev = &owner_list };#define MAX_SEND_FDS 2static void list_del_owner(struct owner *owner){    struct owner *prev = owner->prev;    struct owner *next = owner->next;    prev->next = next;    next->prev = prev;}static void list_add_owner(struct owner *owner, struct owner *next){    struct owner *prev = next->prev;    owner->next = next;    owner->prev = prev;    prev->next = owner;    next->prev = owner;}static int ulockmgr_send_message(int sock, void *buf, size_t buflen,                                 int *fdp, int numfds){    struct msghdr msg;    struct cmsghdr *p_cmsg;    struct iovec vec;    size_t cmsgbuf[CMSG_SPACE(sizeof(int) * MAX_SEND_FDS) / sizeof(size_t)];    int res;    assert(numfds <= MAX_SEND_FDS);    msg.msg_control = cmsgbuf;    msg.msg_controllen = sizeof(cmsgbuf);    p_cmsg = CMSG_FIRSTHDR(&msg);    p_cmsg->cmsg_level = SOL_SOCKET;    p_cmsg->cmsg_type = SCM_RIGHTS;    p_cmsg->cmsg_len = CMSG_LEN(sizeof(int) * numfds);    memcpy(CMSG_DATA(p_cmsg), fdp, sizeof(int) * numfds);    msg.msg_controllen = p_cmsg->cmsg_len;    msg.msg_name = NULL;    msg.msg_namelen = 0;    msg.msg_iov = &vec;    msg.msg_iovlen = 1;    msg.msg_flags = 0;    vec.iov_base = buf;    vec.iov_len = buflen;    res = sendmsg(sock, &msg, MSG_NOSIGNAL);    if (res == -1) {        perror("libulockmgr: sendmsg");        return -1;    }    if ((size_t) res != buflen) {        fprintf(stderr, "libulockmgr: sendmsg short\n");        return -1;    }    return 0;}static int ulockmgr_start_daemon(void){    int sv[2];    int res;    char tmp[64];    res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);    if (res == -1) {        perror("libulockmgr: socketpair");        return -1;    }    snprintf(tmp, sizeof(tmp), "exec ulockmgr_server %i", sv[0]);    res = system(tmp);    close(sv[0]);    if (res == -1 || !WIFEXITED(res) || WEXITSTATUS(res) != 0) {        close(sv[1]);        return -1;    }    ulockmgr_cfd = sv[1];    return 0;}static struct owner *ulockmgr_new_owner(const void *id, size_t id_len){    int sv[2];    int res;    char c = 'm';    struct owner *o;    if (ulockmgr_cfd == -1 && ulockmgr_start_daemon() == -1)        return NULL;    o = calloc(1, sizeof(struct owner) + id_len);    if (!o) {        fprintf(stderr, "libulockmgr: failed to allocate memory\n");        return NULL;    }    o->id = o + 1;    o->id_len = id_len;    res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);    if (res == -1) {        perror("libulockmgr: socketpair");        goto out_free;    }    res = ulockmgr_send_message(ulockmgr_cfd, &c, sizeof(c), &sv[0], 1);    close(sv[0]);    if (res == -1) {        close(ulockmgr_cfd);        ulockmgr_cfd = -1;        goto out_close;    }    o->cfd = sv[1];    memcpy(o->id, id, id_len);    list_add_owner(o, &owner_list);    return o; out_close:    close(sv[1]); out_free:    free(o);    return NULL;}static int ulockmgr_send_request(struct message *msg, const void *id,                                 size_t id_len){    int sv[2];    int cfd;    struct owner *o;    struct fd_store *f = NULL;    struct fd_store *newf = NULL;    struct fd_store **fp;    int fd = msg->fd;    int cmd = msg->cmd;    int res;    int unlockall = (cmd == F_SETLK && msg->lock.l_type == F_UNLCK &&                     msg->lock.l_start == 0 && msg->lock.l_len == 0);    for (o = owner_list.next; o != &owner_list; o = o->next)        if (o->id_len == id_len && memcmp(o->id, id, id_len) == 0)            break;    if (o == &owner_list)        o = NULL;    if (!o && cmd != F_GETLK && msg->lock.l_type != F_UNLCK)        o = ulockmgr_new_owner(id, id_len);    if (!o) {        if (cmd == F_GETLK) {            res = fcntl(msg->fd, F_GETLK, &msg->lock);            return (res == -1) ? -errno : 0;        } else if (msg->lock.l_type == F_UNLCK)            return 0;        else            return -ENOLCK;    }    if (unlockall)        msg->nofd = 1;    else {        for (fp = &o->fds; *fp; fp = &(*fp)->next) {            f = *fp;            if (f->fd == fd) {                msg->nofd = 1;                break;            }        }    }    if (!msg->nofd) {        newf = f = calloc(1, sizeof(struct fd_store));        if (!f) {            fprintf(stderr, "libulockmgr: failed to allocate memory\n");            return -ENOLCK;        }    }    res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);    if (res == -1) {        perror("libulockmgr: socketpair");        free(newf);        return -ENOLCK;    }    cfd = sv[1];    sv[1] = msg->fd;    res = ulockmgr_send_message(o->cfd, msg, sizeof(struct message), sv,                                msg->nofd ? 1 : 2);    close(sv[0]);    if (res == -1) {        free(newf);        close(cfd);        return -EIO;    }    if (newf) {        newf->fd = msg->fd;        newf->next = o->fds;        o->fds = newf;    }    if (f)        f->inuse++;    res = recv(cfd, msg, sizeof(struct message), MSG_WAITALL);    if (res == -1) {        perror("libulockmgr: recv");        msg->error = EIO;    } else if (res != sizeof(struct message)) {        fprintf(stderr, "libulockmgr: recv short\n");        msg->error = EIO;    } else if (cmd == F_SETLKW && msg->error == EAGAIN) {        pthread_mutex_unlock(&ulockmgr_lock);        while (1) {            sigset_t old;            sigset_t unblock;            int errno_save;            sigemptyset(&unblock);            sigaddset(&unblock, SIGUSR1);            pthread_sigmask(SIG_UNBLOCK, &unblock, &old);            res = recv(cfd, msg, sizeof(struct message), MSG_WAITALL);            errno_save = errno;            pthread_sigmask(SIG_SETMASK, &old, NULL);            if (res == sizeof(struct message))                break;            else if (res >= 0) {                fprintf(stderr, "libulockmgr: recv short\n");                msg->error = EIO;                break;            } else if (errno_save != EINTR) {                errno = errno_save;                perror("libulockmgr: recv");                msg->error = EIO;                break;            }            msg->intr = 1;            res = send(o->cfd, msg, sizeof(struct message), MSG_NOSIGNAL);            if (res == -1) {                perror("libulockmgr: send");                msg->error = EIO;                break;            }            if (res != sizeof(struct message)) {                fprintf(stderr, "libulockmgr: send short\n");                msg->error = EIO;                break;            }        }        pthread_mutex_lock(&ulockmgr_lock);    }    if (f)        f->inuse--;    close(cfd);    if (unlockall) {        for (fp = &o->fds; *fp;) {            f = *fp;            if (f->fd == fd && !f->inuse) {                *fp = f->next;                free(f);            } else                fp = &f->next;        }        if (!o->fds) {            list_del_owner(o);            close(o->cfd);            free(o);        }        /* Force OK on unlock-all, since it _will_ succeed once the           owner is deleted */        msg->error = 0;    }    return -msg->error;}#ifdef DEBUGstatic uint32_t owner_hash(const unsigned char *id, size_t id_len){    uint32_t h = 0;    size_t i;    for (i = 0; i < id_len; i++)        h = ((h << 8) | (h >> 24)) ^ id[i];    return h;}#endifstatic int ulockmgr_canonicalize(int fd, struct flock *lock){    off_t offset;    if (lock->l_whence == SEEK_CUR) {        offset = lseek(fd, 0, SEEK_CUR);        if (offset == (off_t) -1)            return -errno;    } else if (lock->l_whence == SEEK_END) {        struct stat stbuf;        int res = fstat(fd, &stbuf);        if (res == -1)            return -errno;        offset = stbuf.st_size;    } else        offset = 0;    lock->l_whence = SEEK_SET;    lock->l_start += offset;    if (lock->l_start < 0)        return -EINVAL;    if (lock->l_len < 0) {        lock->l_start += lock->l_len;        if (lock->l_start < 0)            return -EINVAL;        lock->l_len = -lock->l_len;    }    if (lock->l_len && lock->l_start + lock->l_len - 1 < 0)        return -EINVAL;    return 0;}int ulockmgr_op(int fd, int cmd, struct flock *lock, const void *owner,                size_t owner_len){    int err;    struct message msg;    sigset_t old;    sigset_t block;    if (cmd != F_GETLK && cmd != F_SETLK && cmd != F_SETLKW)        return -EINVAL;    if (lock->l_whence != SEEK_SET && lock->l_whence != SEEK_CUR &&        lock->l_whence != SEEK_END)        return -EINVAL;#ifdef DEBUG    fprintf(stderr, "libulockmgr: %i %i %i %lli %lli own: 0x%08x\n",            cmd, lock->l_type, lock->l_whence, lock->l_start, lock->l_len,            owner_hash(owner, owner_len));#endif    /* Unlock should never block anyway */    if (cmd == F_SETLKW && lock->l_type == F_UNLCK)        cmd = F_SETLK;    memset(&msg, 0, sizeof(struct message));    msg.cmd = cmd;    msg.fd = fd;    msg.lock = *lock;    err = ulockmgr_canonicalize(fd, &msg.lock);    if (err)        return err;    sigemptyset(&block);    sigaddset(&block, SIGUSR1);    pthread_sigmask(SIG_BLOCK, &block, &old);    pthread_mutex_lock(&ulockmgr_lock);    err = ulockmgr_send_request(&msg, owner, owner_len);    pthread_mutex_unlock(&ulockmgr_lock);    pthread_sigmask(SIG_SETMASK, &old, NULL);    if (!err && cmd == F_GETLK) {        if (msg.lock.l_type == F_UNLCK)            lock->l_type = F_UNLCK;        else            *lock = msg.lock;    }    return err;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三级| 韩国av一区二区三区| 日韩一区二区麻豆国产| 福利一区福利二区| 午夜欧美电影在线观看| 国产精品免费aⅴ片在线观看| 色激情天天射综合网| 国产一区二区三区电影在线观看| 一区二区在线看| 国产午夜精品一区二区三区视频| 精品视频一区二区三区免费| 成人app软件下载大全免费| 久88久久88久久久| 日本亚洲欧美天堂免费| 亚洲国产视频在线| 亚洲综合成人在线视频| 中文字幕亚洲电影| 国产精品久久久久9999吃药| 久久夜色精品国产欧美乱极品| 91精品国模一区二区三区| 欧美日韩一区国产| 91精品久久久久久久久99蜜臂| 欧美亚一区二区| 欧美亚洲禁片免费| 欧美在线一区二区三区| 欧美三级一区二区| 制服丝袜国产精品| 精品少妇一区二区三区日产乱码| 欧美日韩高清一区二区不卡| 91精品国产综合久久福利软件| 欧美日韩精品一区视频| 欧美精品一卡二卡| 精品国产伦一区二区三区观看体验| 日韩免费看的电影| 久久精品一区二区三区四区| 国产欧美精品日韩区二区麻豆天美 | 亚洲天堂成人在线观看| 亚洲四区在线观看| 日韩国产欧美在线播放| 国产伦精品一区二区三区免费 | 亚洲国产视频网站| 蜜桃视频在线一区| 高清久久久久久| 欧美乱妇一区二区三区不卡视频| 2023国产一二三区日本精品2022| 国产片一区二区三区| 亚洲精品国产一区二区三区四区在线| 亚洲国产欧美日韩另类综合| 韩国av一区二区三区四区| 91亚洲国产成人精品一区二区三| 欧美一级淫片007| 国产精品美女久久久久久久网站| 亚洲国产精品一区二区久久恐怖片| 日本美女一区二区三区视频| 91女人视频在线观看| 亚洲精品在线电影| 亚洲成av人影院在线观看网| 国产白丝网站精品污在线入口| 欧美精品v日韩精品v韩国精品v| 26uuu国产一区二区三区| 亚洲一区av在线| 91免费精品国自产拍在线不卡| 亚洲精品在线观看网站| 蜜臀91精品一区二区三区| 欧洲另类一二三四区| 日韩码欧中文字| av在线这里只有精品| 久久精品欧美一区二区三区不卡| 日韩专区一卡二卡| 在线看不卡av| 亚洲乱码国产乱码精品精小说| 成人黄色免费短视频| 国产精品久久看| av在线综合网| 一区二区在线免费观看| 欧美影院精品一区| 午夜在线成人av| 91精选在线观看| 精品在线一区二区三区| 日韩欧美视频在线| 国产乱码精品一品二品| 国产亚洲精品7777| 91污在线观看| 五月婷婷色综合| 精品少妇一区二区| 成人av片在线观看| 一区二区三区在线观看网站| 日韩欧美亚洲国产另类| 老司机免费视频一区二区三区| 日韩欧美亚洲一区二区| 丁香六月综合激情| 亚洲成人免费看| 欧美精品一区二区精品网| 成人高清在线视频| 亚洲国产裸拍裸体视频在线观看乱了| 欧美美女一区二区在线观看| 极品少妇一区二区| 亚洲另类在线视频| 亚洲精品一区二区三区精华液| 国产成人精品一区二区三区四区| 亚洲欧美一区二区三区国产精品 | 欧美电影影音先锋| 波多野结衣中文字幕一区| 亚洲第一激情av| 国产喷白浆一区二区三区| 欧美伊人久久大香线蕉综合69| 激情五月婷婷综合网| 亚洲国产精品久久人人爱蜜臀| 欧美mv和日韩mv国产网站| 欧美色综合天天久久综合精品| 国产美女av一区二区三区| 亚洲va韩国va欧美va| 中文字幕av免费专区久久| 91精品免费观看| 欧美精品丝袜中出| 色偷偷久久一区二区三区| 国产成人综合亚洲91猫咪| 麻豆国产欧美一区二区三区| 亚洲国产日日夜夜| 一区二区高清在线| 亚洲桃色在线一区| 中文字幕精品三区| 国产亚洲一本大道中文在线| 日韩一区二区视频在线观看| 欧美日韩另类国产亚洲欧美一级| 成人看片黄a免费看在线| 懂色av一区二区三区蜜臀| 国产精品一区二区久久精品爱涩| 精品亚洲成av人在线观看| 91麻豆国产香蕉久久精品| 国产一区视频导航| 国产一区二区三区四区在线观看| 日产精品久久久久久久性色| 免费看黄色91| 国产一区二区网址| 国产精品亚洲视频| 成人美女视频在线观看| 在线视频一区二区免费| 欧美日韩一区二区三区免费看| 欧美性高清videossexo| 欧美日韩精品欧美日韩精品一 | 91精品国产福利| 日韩欧美国产午夜精品| 久久日一线二线三线suv| 欧美mv日韩mv亚洲| 亚洲日本青草视频在线怡红院| 亚洲一区二区三区在线看| 日韩高清不卡一区二区| 国内成人免费视频| 91小视频在线观看| 欧美sm美女调教| 亚洲欧美偷拍另类a∨色屁股| 五月激情综合色| 高清视频一区二区| 欧美一区二区三区白人| 国产精品久久久久久久久果冻传媒| 国产成人精品www牛牛影视| youjizz国产精品| 337p日本欧洲亚洲大胆精品| 亚洲精品水蜜桃| 国产电影一区二区三区| 欧美绝品在线观看成人午夜影视| 中文一区二区在线观看| 奇米四色…亚洲| 在线观看一区日韩| 中文字幕av一区二区三区免费看 | 国产精品自拍在线| 欧美男女性生活在线直播观看| 国产精品天天摸av网| 久久精品二区亚洲w码| 欧美三级中文字幕在线观看| 亚洲免费观看高清完整| 成人久久视频在线观看| 亚洲国产精品精华液ab| 国内成+人亚洲+欧美+综合在线| 欧美日韩国产免费| 亚洲最新在线观看| 日本伦理一区二区| 亚洲精品免费在线播放| 波多野结衣精品在线| 中文文精品字幕一区二区| 波多野结衣精品在线| 国产精品久久毛片| 一本到高清视频免费精品| 亚洲精品国久久99热| 欧美片网站yy| 麻豆专区一区二区三区四区五区| 欧美视频一区二区三区| 日韩电影在线观看电影| 日韩午夜激情视频| 国产一区二区三区精品视频| 久久蜜桃av一区二区天堂| 国产成人丝袜美腿| 亚洲欧美综合另类在线卡通| 91在线你懂得| 日韩高清在线不卡| 国产欧美久久久精品影院| 色又黄又爽网站www久久| 午夜精品在线视频一区| 久久精品一区二区三区四区|