Update free space after operations that affect it

This commit is contained in:
Michael Theall 2016-06-15 03:04:00 -05:00
parent f017d8477a
commit 501073c34c

View File

@ -196,6 +196,10 @@ static ftp_command_t ftp_commands[] =
/*! number of ftp commands */ /*! number of ftp commands */
static const size_t num_ftp_commands = sizeof(ftp_commands)/sizeof(ftp_commands[0]); static const size_t num_ftp_commands = sizeof(ftp_commands)/sizeof(ftp_commands[0]);
#ifdef _3DS
static void update_free_space(void);
#endif
/*! compare ftp command descriptors /*! compare ftp command descriptors
* *
* @param[in] p1 left side of comparison (ftp_command_t*) * @param[in] p1 left side of comparison (ftp_command_t*)
@ -583,6 +587,7 @@ ftp_session_write_file(ftp_session_t *session)
/* adjust file position */ /* adjust file position */
session->filepos += rc; session->filepos += rc;
update_free_space();
return rc; return rc;
} }
@ -1400,54 +1405,62 @@ ftp_session_poll(ftp_session_t *session)
return ftp_session_destroy(session); return ftp_session_destroy(session);
} }
static int
update_status(void)
{
#ifdef _3DS #ifdef _3DS
/* Update free space in status bar */
static void
update_free_space(void)
{
#define KiB (1024.0) #define KiB (1024.0)
#define MiB (1024.0*KiB) #define MiB (1024.0*KiB)
#define GiB (1024.0*MiB) #define GiB (1024.0*MiB)
char buffer[16]; char buffer[16];
struct statvfs st; struct statvfs st;
double bytes_free; double bytes_free;
int rc; int rc, len;
rc = statvfs("sdmc:/", &st); rc = statvfs("sdmc:/", &st);
if(rc != 0) if(rc != 0)
{
console_print(RED "statvfs: %d %s\n" RESET, errno, strerror(errno)); console_print(RED "statvfs: %d %s\n" RESET, errno, strerror(errno));
return -1;
}
bytes_free = (double)st.f_bsize * st.f_bfree;
if (bytes_free < 1000.0)
snprintf(buffer, sizeof(buffer), "%.0lf bytes", bytes_free);
else if(bytes_free < 10.0*KiB)
snprintf(buffer, sizeof(buffer), "%.2lfKiB", floor((bytes_free*100.0)/KiB)/100.0);
else if(bytes_free < 100.0*KiB)
snprintf(buffer, sizeof(buffer), "%.1lfKiB", floor((bytes_free*10.0)/KiB)/10.0);
else if(bytes_free < 1000.0*KiB)
snprintf(buffer, sizeof(buffer), "%.0lfKiB", floor(bytes_free/KiB));
else if(bytes_free < 10.0*MiB)
snprintf(buffer, sizeof(buffer), "%.2lfMiB", floor((bytes_free*100.0)/MiB)/100.0);
else if(bytes_free < 100.0*MiB)
snprintf(buffer, sizeof(buffer), "%.1lfMiB", floor((bytes_free*10.0)/MiB)/10.0);
else if(bytes_free < 1000.0*MiB)
snprintf(buffer, sizeof(buffer), "%.0lfMiB", floor(bytes_free/MiB));
else if(bytes_free < 10.0*GiB)
snprintf(buffer, sizeof(buffer), "%.2lfGiB", floor((bytes_free*100.0)/GiB)/100.0);
else if(bytes_free < 100.0*GiB)
snprintf(buffer, sizeof(buffer), "%.1lfGiB", floor((bytes_free*10.0)/GiB)/10.0);
else else
snprintf(buffer, sizeof(buffer), "%.0lfGiB", floor(bytes_free/GiB)); {
bytes_free = (double)st.f_bsize * st.f_bfree;
if (bytes_free < 1000.0)
len = snprintf(buffer, sizeof(buffer), "%.0lfB", bytes_free);
else if(bytes_free < 10.0*KiB)
len = snprintf(buffer, sizeof(buffer), "%.2lfKiB", floor((bytes_free*100.0)/KiB)/100.0);
else if(bytes_free < 100.0*KiB)
len = snprintf(buffer, sizeof(buffer), "%.1lfKiB", floor((bytes_free*10.0)/KiB)/10.0);
else if(bytes_free < 1000.0*KiB)
len = snprintf(buffer, sizeof(buffer), "%.0lfKiB", floor(bytes_free/KiB));
else if(bytes_free < 10.0*MiB)
len = snprintf(buffer, sizeof(buffer), "%.2lfMiB", floor((bytes_free*100.0)/MiB)/100.0);
else if(bytes_free < 100.0*MiB)
len = snprintf(buffer, sizeof(buffer), "%.1lfMiB", floor((bytes_free*10.0)/MiB)/10.0);
else if(bytes_free < 1000.0*MiB)
len = snprintf(buffer, sizeof(buffer), "%.0lfMiB", floor(bytes_free/MiB));
else if(bytes_free < 10.0*GiB)
len = snprintf(buffer, sizeof(buffer), "%.2lfGiB", floor((bytes_free*100.0)/GiB)/100.0);
else if(bytes_free < 100.0*GiB)
len = snprintf(buffer, sizeof(buffer), "%.1lfGiB", floor((bytes_free*10.0)/GiB)/10.0);
else
len = snprintf(buffer, sizeof(buffer), "%.0lfGiB", floor(bytes_free/GiB));
console_set_status("\x1b[0;%dH" GREEN "%s", 50-len, buffer);
}
}
#endif
/*! Update status bar */
static int
update_status(void)
{
#ifdef _3DS
console_set_status("\n" GREEN STATUS_STRING " " console_set_status("\n" GREEN STATUS_STRING " "
CYAN "%s:%u " CYAN "%s:%u" RESET,
YELLOW "SD: " CYAN "%s"
RESET,
inet_ntoa(serv_addr.sin_addr), inet_ntoa(serv_addr.sin_addr),
ntohs(serv_addr.sin_port), ntohs(serv_addr.sin_port));
buffer); update_free_space();
#else #else
char hostname[128]; char hostname[128];
socklen_t addrlen = sizeof(serv_addr); socklen_t addrlen = sizeof(serv_addr);
@ -2622,6 +2635,7 @@ FTP_DECLARE(DELE)
return ftp_send_response(session, 550, "failed to delete file\r\n"); return ftp_send_response(session, 550, "failed to delete file\r\n");
} }
update_free_space();
return ftp_send_response(session, 250, "OK\r\n"); return ftp_send_response(session, 250, "OK\r\n");
} }
@ -2772,6 +2786,7 @@ FTP_DECLARE(MKD)
return ftp_send_response(session, 550, "failed to create directory\r\n"); return ftp_send_response(session, 550, "failed to create directory\r\n");
} }
update_free_space();
return ftp_send_response(session, 250, "OK\r\n"); return ftp_send_response(session, 250, "OK\r\n");
} }
@ -3247,6 +3262,7 @@ FTP_DECLARE(RMD)
return ftp_send_response(session, 550, "failed to delete directory\r\n"); return ftp_send_response(session, 550, "failed to delete directory\r\n");
} }
update_free_space();
return ftp_send_response(session, 250, "OK\r\n"); return ftp_send_response(session, 250, "OK\r\n");
} }
@ -3329,6 +3345,7 @@ FTP_DECLARE(RNTO)
return ftp_send_response(session, 550, "failed to rename file/directory\r\n"); return ftp_send_response(session, 550, "failed to rename file/directory\r\n");
} }
update_free_space();
return ftp_send_response(session, 250, "OK\r\n"); return ftp_send_response(session, 250, "OK\r\n");
} }