static int posix_fileno_int (void) { int fd; SLFile_FD_Type *f; if (SLang_peek_at_stack () == SLANG_FILE_PTR_TYPE) { SLang_MMT_Type *mmt; FILE *fp; if (-1 == SLang_pop_fileptr (&mmt, &fp)) return -1; fd = fileno (fp); SLang_free_mmt (mmt); return fd; } if (-1 == SLfile_pop_fd (&f)) return -1; if (-1 == get_fd (f, &fd)) fd = -1; SLfile_free_fd (f); return fd; }
void sl_ioctl (void) { char *argp = NULL; int fd, retval; unsigned int length, request; SLFile_FD_Type *f; SLang_BString_Type *bstr; if (SLang_Num_Function_Args == 3) { if (SLang_pop_bstring (&bstr) == -1) goto usage_error; if (SLang_pop_uint ((unsigned int *) &request) == -1) goto usage_error; if (SLfile_pop_fd (&f) == -1) goto usage_error; argp = SLbstring_get_pointer (bstr, &length); } else if (SLang_Num_Function_Args == 2) { if (SLang_pop_uint ((unsigned int *) &request) == -1) goto usage_error; if (SLfile_pop_fd (&f) == -1) goto usage_error; } else goto usage_error; if (SLfile_get_fd (f, &fd) == -1) return; if ((retval = ioctl (fd, request, argp)) == -1) { SLang_set_error (SL_OS_Error); (void) SLerrno_set_errno (errno); return; } (void) SLang_push_int (retval); if (argp != NULL) (void) SLang_push_bstring (bstr); return; usage_error : SLang_set_error (SL_Usage_Error); return; }
static int pop_fd (int *fdp) { SLFile_FD_Type *f; int status; if (SLang_peek_at_stack () == SLANG_INT_TYPE) return SLang_pop_int (fdp); if (-1 == SLfile_pop_fd (&f)) return -1; status = SLfile_get_fd (f, fdp); SLfile_free_fd (f); return status; }
static Socket_Type *pop_socket (SLFile_FD_Type **fp) { SLFile_FD_Type *f; Socket_Type *s; if (-1 == SLfile_pop_fd (&f)) { *fp = NULL; return NULL; } if (NULL == (s = socket_from_fd (f))) { SLfile_free_fd (f); return NULL; } *fp = f; return s; }
static int pop_fd (int *fdp, SLFile_FD_Type **fp, SLang_MMT_Type **mmtp) { int fd; *fp = NULL; *mmtp = NULL; switch (SLang_peek_at_stack ()) { case SLANG_FILE_PTR_TYPE: { SLang_MMT_Type *mmt; FILE *p; if (-1 == SLang_pop_fileptr (&mmt, &p)) return -1; fd = fileno (p); *mmtp = mmt; } break; case SLANG_FILE_FD_TYPE: { SLFile_FD_Type *f; if (-1 == SLfile_pop_fd (&f)) return -1; if (-1 == get_fd (f, &fd)) { SLfile_free_fd (f); return -1; } } break; default: if (-1 == SLang_pop_int (&fd)) return -1; } *fdp = fd; return 0; }
static void sl_ssl_connect (void){ int fd; SLFile_FD_Type *slfd; SLsslctx_Type *ctx; SLssl_Type *slssl; SSL *ssl; SLang_MMT_Type *sslmmt; SLang_MMT_Type *sslmmto; if (SLfile_pop_fd(&slfd) == -1) return; if (NULL==(sslmmt=SLang_pop_mmt(SLsslctx_Type_Id))) return; SLfile_get_fd(slfd,&fd); SLfile_free_fd(slfd); ctx = (SLsslctx_Type *)SLang_object_from_mmt(sslmmt); // create the ssl object ssl = SSL_new((SSL_CTX *)ctx->ctx); // set the file descriptor for input/output if (0==SSL_set_fd(ssl,fd)){ return; } // fprintf(stderr,"Set client socket fd to %d\n",fd); slssl = (SLssl_Type *)malloc(sizeof(SLssl_Type)); slssl->ssl = (void *) ssl; slssl->is_server = ctx->is_server; sslmmt = SLang_create_mmt(SLssl_Type_Id, (VOID_STAR) slssl); if (0==SLang_push_mmt(sslmmt)) return; SLang_free_mmt(sslmmt); }