/* callback: DCC CHAT - net_connect_nonblock() finished */ static void sig_chat_connected(DCC_REC *dcc) { g_return_if_fail(dcc != NULL); g_source_remove(dcc->tagread); if (net_geterror(dcc->handle) != 0) { /* error connecting */ signal_emit("dcc error connect", 1, dcc); dcc_destroy(dcc); return; } /* connect ok. */ dcc->starttime = time(NULL); dcc->tagread = g_input_add(dcc->handle, G_INPUT_READ, (GInputFunction) dcc_chat_input, dcc); signal_emit("dcc connected", 1, dcc); }
static void server_connect_callback_init(SERVER_REC *server, GIOChannel *handle) { int error; g_return_if_fail(IS_SERVER(server)); error = net_geterror(handle); if (error != 0) { server->connection_lost = TRUE; server_connect_failed(server, g_strerror(error)); return; } lookup_servers = g_slist_remove(lookup_servers, server); g_source_remove(server->connect_tag); server->connect_tag = -1; server_connect_finished(server); }
static void pop3c_client_connected(struct pop3c_client *client) { int err; err = net_geterror(client->fd); if (err != 0) { i_error("pop3c(%s): connect(%s, %u) failed: %s", client->set.host, net_ip2addr(&client->ip), client->set.port, strerror(err)); pop3c_client_disconnect(client); return; } io_remove(&client->io); client->io = io_add(client->fd, IO_READ, pop3c_client_prelogin_input, client); if (client->set.ssl_mode == POP3C_CLIENT_SSL_MODE_IMMEDIATE) { if (pop3c_client_ssl_init(client) < 0) pop3c_client_disconnect(client); } }
/* callback: DCC CHAT - connect finished */ static void sig_chat_connected(CHAT_DCC_REC *dcc) { g_return_if_fail(IS_DCC_CHAT(dcc)); if (net_geterror(dcc->handle) != 0) { /* error connecting */ signal_emit("dcc error connect", 1, dcc); dcc_destroy(DCC(dcc)); return; } /* connect ok. */ g_source_remove(dcc->tagconn); dcc->tagconn = -1; dcc->starttime = time(NULL); dcc->sendbuf = net_sendbuffer_create(dcc->handle, 0); dcc->tagread = g_input_add(dcc->handle, G_INPUT_READ, (GInputFunction) dcc_chat_input, dcc); signal_emit("dcc connected", 1, dcc); }
/* callback: net_connect() finished for DCC GET */ void sig_dccget_connected(GET_DCC_REC *dcc) { struct stat statbuf; char *fname, *tempfname, *str; int ret, ret_errno, temphandle, old_umask; if (!dcc->from_dccserver) { if (net_geterror(dcc->handle) != 0) { /* error connecting */ signal_emit("dcc error connect", 1, dcc); dcc_destroy(DCC(dcc)); return; } g_source_remove(dcc->tagconn); dcc->tagconn = -1; } g_free_not_null(dcc->file); dcc->file = dcc_get_download_path(dcc->arg); /* if some plugin wants to change the file name/path here.. */ signal_emit("dcc get receive", 1, dcc); if (stat(dcc->file, &statbuf) == 0 && dcc->get_type == DCC_GET_RENAME) { /* file exists, rename.. */ fname = dcc_get_rename_file(dcc->file); g_free(dcc->file); dcc->file = fname; } if (dcc->get_type != DCC_GET_RESUME) { int dcc_file_create_mode = octal2dec(settings_get_int("dcc_file_create_mode")); /* we want to overwrite the file, remove it here. if it gets created after this, we'll fail. */ unlink(dcc->file); /* just to make sure we won't run into race conditions if download_path is in some global temp directory */ tempfname = g_strconcat(dcc->file, ".XXXXXX", NULL); old_umask = umask(0077); temphandle = mkstemp(tempfname); umask(old_umask); if (temphandle == -1) ret = -1; else ret = fchmod(temphandle, dcc_file_create_mode); close(temphandle); if (ret != -1) { ret = link(tempfname, dcc->file); if (ret == -1 && /* Linux */ (errno == EPERM || /* FUSE */ errno == ENOSYS || /* BSD */ errno == EOPNOTSUPP)) { /* hard links aren't supported - some people want to download stuff to FAT/NTFS/etc partitions, so fallback to rename() */ ret = rename(tempfname, dcc->file); } } /* if ret = 0, we're the file owner now */ dcc->fhandle = ret == -1 ? -1 : open(dcc->file, O_WRONLY | O_TRUNC); /* close/remove the temp file */ ret_errno = errno; unlink(tempfname); g_free(tempfname); if (dcc->fhandle == -1) { signal_emit("dcc error file create", 3, dcc, dcc->file, g_strerror(ret_errno)); dcc_destroy(DCC(dcc)); return; } } dcc->starttime = time(NULL); if (dcc->size == 0) { dcc_close(DCC(dcc)); return; } dcc->tagread = g_input_add(dcc->handle, G_INPUT_READ, (GInputFunction) sig_dccget_receive, dcc); signal_emit("dcc connected", 1, dcc); if (dcc->from_dccserver) { str = g_strdup_printf("121 %s %d\n", dcc->server ? dcc->server->nick : "??", 0); net_transmit(dcc->handle, str, strlen(str)); } }