static int fsp_get_next_file (gftp_request * request, gftp_file * fle, int fd) { fsp_protocol_data *lpd; struct FSP_RDENTRY dirent; struct FSP_RDENTRY *result; char *symlink; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (request->protonum == GFTP_FSP_NUM, GFTP_EFATAL); g_return_val_if_fail (fle != NULL, GFTP_EFATAL); lpd = request->protocol_data; g_return_val_if_fail (lpd != NULL, GFTP_EFATAL); memset (fle, 0, sizeof (*fle)); result=&dirent; if ( fsp_readdir_native (lpd->dir,&dirent,&result)) { fsp_closedir (lpd->dir); lpd->dir = NULL; request->logging_function (gftp_logging_error, request, _("Corrupted file listing from FSP server %s\n"), request->directory ); return (GFTP_EFATAL); } if ( result == NULL) { fsp_closedir (lpd->dir); lpd->dir = NULL; return 0; } fle->user = g_strdup (_("unknown")); fle->group = g_strdup (_("unknown")); /* turn FSP symlink into normal file */ symlink=strchr(dirent.name,'\n'); if (symlink) *symlink='\0'; fle->file = g_strdup (dirent.name); if (dirent.type==FSP_RDTYPE_DIR) fle->st_mode = S_IFDIR | 0755; else fle->st_mode = S_IFREG | 0644; fle->datetime = dirent.lastmod; fle->size = dirent.size; return (1); }
static void fsp_disconnect (gftp_request * request) { fsp_protocol_data * lpd; g_return_if_fail (request != NULL); g_return_if_fail (request->protonum == GFTP_FSP_NUM); lpd = request->protocol_data; g_return_if_fail (lpd != NULL); if(lpd->file) { fsp_fclose(lpd->file); lpd->file=NULL; } fsp_close_session(lpd->fsp); lpd->fsp=NULL; request->datafd = -1; if(lpd->dir) { fsp_closedir(lpd->dir); lpd->dir=NULL; } }
static int fsp_end_transfer (gftp_request * request) { fsp_protocol_data * lpd; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (request->protonum == GFTP_FSP_NUM, GFTP_EFATAL); lpd = request->protocol_data; g_return_val_if_fail (lpd->fsp != NULL, GFTP_EFATAL); if (lpd->dir) { fsp_closedir (lpd->dir); lpd->dir = NULL; } if (lpd ->file) { if(fsp_fclose(lpd->file)) { lpd -> file = NULL; request->logging_function (gftp_logging_error, request, _("Error: Error closing file: %s\n"), g_strerror (errno)); return GFTP_EFATAL; } lpd->file=NULL; } return (0); }
static int fsp_abort_transfer (gftp_request * request) { fsp_protocol_data * lpd; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (request->protonum == GFTP_FSP_NUM, GFTP_EFATAL); lpd = request->protocol_data; g_return_val_if_fail (lpd->fsp != NULL, GFTP_EFATAL); if (lpd->dir) { fsp_closedir (lpd->dir); lpd->dir = NULL; } if (lpd ->file) { if(lpd->file->writing && lpd->file->pos>0) { /* need to cancel upload in progress */ lpd->file->writing=0; fsp_install(lpd->fsp,"",0); } /* we can safely ignore file close error on abort */ fsp_fclose(lpd->file); lpd->file=NULL; } return (0); }
static void fsp_directory(FSP_SESSION *ses, struct uri *uri) { struct string buf; FSP_DIR *dir; unsigned char *data = get_uri_string(uri, URI_DATA); unsigned char dircolor[8] = ""; if (!data) fsp_error(connection_state(S_OUT_OF_MEM)); decode_uri(data); if (!is_in_state(init_directory_listing(&buf, uri), S_OK)) fsp_error(connection_state(S_OUT_OF_MEM)); dir = fsp_opendir(ses, data); if (!dir) fsp_error(connection_state_for_errno(errno)); fprintf(stderr, "text/html"); fclose(stderr); puts(buf.source); if (get_opt_bool("document.browse.links.color_dirs", NULL)) { color_to_string(get_opt_color("document.colors.dirs", NULL), dircolor); } sort_and_display_entries(dir, dircolor); fsp_closedir(dir); puts("</pre><hr/></body></html>"); fsp_close_session(ses); exit(0); }