예제 #1
0
파일: dna.c 프로젝트: DimondTheCat/xray
int get_user( GlobalFunc *global )
{
   int result;

   panf = global( LWPANELFUNCS_GLOBAL, GFUSE_TRANSIENT );
   if ( !panf )
      return AFUNC_BADGLOBAL;

   panf->globalFun = global;

   panel = PAN_CREATE( panf, "DNA Builder" );

   ctl_create();
   ctl_event( NULL, NULL );

   result = panf->open( panel, PANF_BLOCKING | PANF_CANCEL );
   ctl_get();

   PAN_KILL( panf, panel );

   return result;
}
예제 #2
0
파일: ctl.c 프로젝트: LazyZhu/glorytun
int
ctl_connect(const char *dir, const char *file)
{
    DIR *dp = NULL;

    if (str_empty(dir)) {
        errno = EINVAL;
        return -1;
    }

    if (!file) {
        dp = opendir(dir);

        if (!dp)
            return -1;

        struct dirent *d = NULL;

        while (d = readdir(dp), d) {
            if (d->d_name[0] == '.')
                continue;

            if (file) {
                closedir(dp);
                return -3;
            }

            file = &d->d_name[0];
        }

        if (!file) {
            closedir(dp);
            return -2;
        }
    }

    struct sockaddr_un sun;
    const int ret = ctl_setsun(&sun, dir, file);

    if (dp) {
        int err = errno;
        closedir(dp);
        errno = err;
    }

    if (ret)
        return -1;

    int fd = ctl_create(dir, NULL);

    if (fd == -1)
        return -1;

    if (connect(fd, (struct sockaddr *)&sun, sizeof(sun))) {
        int err = errno;
        ctl_delete(fd);
        errno = err;
        return -1;
    }

    return fd;
}