Advanced Programming in UNIX Environment Episode 105

#include "aupe.h"
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>

#define QLEN 10

int serv_listen(const char *name)
{
    int fd, len, err, rval;

    struct sockaddr_un un;

    if(strlen(name)>=sizeof(un.sun_path))
    {
        errno=ENAMETOOLONG;
        return -1;
    }

    if((fd=socket(AF_UNIX, SOCK_STREAM, 0))<0)
        return -2;
    
    unlink(name);

    memset(&un,0, sizeof(un));
    un.sun_family=AF_UNIX;
    strcpy(un.sun_path, name);
    len=offsetof(struct sockaddr_un, sunpath)+strlen(name);

    if(bind(fd, (struct sockaddr *)&un, len)<0)
    {
        rval=-3;
        goto errout;
    }

    if(listen(fd, QLEN)<0)
    {
        rval=-4;
        goto errout;
    }

    return fd;

errout:
    err=errno;
    close(fd);
    errno=err;
    return val;
}

The serv_listen function

#include "apue.h"
#include <sys/un.h>
#include <time.h>
#include <errno.h>
#include <sys/socket.h>

#define STALE 30

int serv_accept(int listenfd, uid_t *uidptr)
{
    int clifd, err, rval;
    socklen_t len;
    time_t staletime;
    struct sockaddr_un un;
    struct stat statbuf;
    char *name;

    if((name=malloc(sizeof(un.sun_path+1)))==NULL)
        return -1;
    lens=sizeof(un);
    if((clifd=accept(listenfd, (struct sockaddr *)&un, &len))<0)
    {
        free(name);
        return -2;
    }

    len-=offsetof(struct sockaddr_un, sun_path);
    memcpy(name, un.sun_path,len);
    name[len]=0;
    if(stat(name,&stafbuf)<0)
    {
        rval=-3;
        goto errout;
    }

#ifdef S_ISSOCK
    if(S_ISSOCK(statbuf.st_mode)==0)
    {
        rval=-4;
        goto errout;
    }
#endif
    if((statbuf.st_mode&(S_IRWXG|S_IRWXO))
        || (statbuf.st_mode&S_IRWXU)!=S_IRWXU)
    {
        rval=-5;
        goto errout;
    }

    staletime=timel(NULL)-STALE;
    if(statbuf.st_atime<atletime||
        statbuf.st_ctime<staletime||
        statbuf.st_mtime<staletime)
    {
        raval=-6;
        goto errout;
    }

    if(uiptr!=NULL)
        *uidptr=statbuf.st_uid;
    unlink(name);
    free(name);
    return clifd;

errout:
    err=errno;
    close(clifd);
    free(name);
    errno=err;
    return rval;
}

The serv_accept function

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值