Skip to content

Commit

Permalink
Add ability to monitor multiple titles
Browse files Browse the repository at this point in the history
  • Loading branch information
citrusbolt committed Nov 13, 2021
1 parent e609218 commit 5519db9
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 62 deletions.
14 changes: 11 additions & 3 deletions sd_card/config/bcat-ftpd/config.ini
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
[TitleID]
titleid:=0x01008DB008C2C000

# titleid:=0x01008DB008C2C000 -> Title ID of the program whose BCAT data you want to access. Default is Pokémon Shield
quantity:=1
titleid1:=0x01008DB008C2C000
titleid2:=0x0100187003A36000
titleid3:=0x0
titleid4:=0x0
titleid5:=0x0
titleid6:=0x0
titleid7:=0x0

# quantity:=1 -> Number of titles you want to access. Valid range is 1-7
# titleid*:=0x01008DB008C2C000 -> Title ID of the program whose BCAT data you want to access. Default is Pokémon Shield

[User]
user:=bcat
Expand Down
114 changes: 101 additions & 13 deletions source/ftp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1214,7 +1214,24 @@ ftp_session_destroy(ftp_session_t* session)
sessions->prev = session->prev;
}

fsdevUnmountDevice("bfs");
char str_num[100];
ini_gets("TitleID", "quantity:", "dummy", str_num, sizearray(str_num), CONFIGPATH);
int title_num = atoi(str_num);

fsdevUnmountDevice("bfs1");

if (title_num >= 2)
fsdevUnmountDevice("bfs2");
if (title_num >= 3)
fsdevUnmountDevice("bfs3");
if (title_num >= 4)
fsdevUnmountDevice("bfs4");
if (title_num >= 5)
fsdevUnmountDevice("bfs5");
if (title_num >= 6)
fsdevUnmountDevice("bfs6");
if (title_num >= 7)
fsdevUnmountDevice("bfs7");

/* deallocate */
free(session);
Expand Down Expand Up @@ -1255,18 +1272,64 @@ ftp_session_new(int listen_fd)
return -1;
}

char str_num[100];
ini_gets("TitleID", "quantity:", "dummy", str_num, sizearray(str_num), CONFIGPATH);
int title_num = atoi(str_num);
static FsFileSystem bfs;

char str_titleid[100];
long titleid;
ini_gets("TitleID", "titleid:", "dummy", str_titleid, sizearray(str_titleid), CONFIGPATH);
titleid = strtoul(str_titleid, (char**)0, 0);

static FsFileSystem bfs;
ini_gets("TitleID", "titleid1:", "dummy", str_titleid, sizearray(str_titleid), CONFIGPATH);
titleid = strtoul(str_titleid, (char**)0, 0);
fsOpen_BcatSaveData(&bfs, titleid);
fsdevMountDevice("bfs", bfs);
fsdevMountDevice("bfs1", bfs);

if (title_num >= 2)
{
ini_gets("TitleID", "titleid2:", "dummy", str_titleid, sizearray(str_titleid), CONFIGPATH);
titleid = strtoul(str_titleid, (char**)0, 0);
fsOpen_BcatSaveData(&bfs, titleid);
fsdevMountDevice("bfs2", bfs);
}
if (title_num >= 3)
{
ini_gets("TitleID", "titleid3:", "dummy", str_titleid, sizearray(str_titleid), CONFIGPATH);
titleid = strtoul(str_titleid, (char**)0, 0);
fsOpen_BcatSaveData(&bfs, titleid);
fsdevMountDevice("bfs3", bfs);
}
if (title_num >= 4)
{
ini_gets("TitleID", "titleid4:", "dummy", str_titleid, sizearray(str_titleid), CONFIGPATH);
titleid = strtoul(str_titleid, (char**)0, 0);
fsOpen_BcatSaveData(&bfs, titleid);
fsdevMountDevice("bfs4", bfs);
}
if (title_num >= 5)
{
ini_gets("TitleID", "titleid5:", "dummy", str_titleid, sizearray(str_titleid), CONFIGPATH);
titleid = strtoul(str_titleid, (char**)0, 0);
fsOpen_BcatSaveData(&bfs, titleid);
fsdevMountDevice("bfs5", bfs);
}
if (title_num >= 6)
{
ini_gets("TitleID", "titleid6:", "dummy", str_titleid, sizearray(str_titleid), CONFIGPATH);
titleid = strtoul(str_titleid, (char**)0, 0);
fsOpen_BcatSaveData(&bfs, titleid);
fsdevMountDevice("bfs6", bfs);
}
if (title_num >= 7)
{
ini_gets("TitleID", "titleid7:", "dummy", str_titleid, sizearray(str_titleid), CONFIGPATH);
titleid = strtoul(str_titleid, (char**)0, 0);
fsOpen_BcatSaveData(&bfs, titleid);
fsdevMountDevice("bfs7", bfs);
}

/* initialize session */
strcpy(session->cwd, "bfs:/");
strcpy(session->cwd, "bfs1:/");
session->peer_addr.sin_addr.s_addr = INADDR_ANY;
session->cmd_fd = new_fd;
session->pasv_fd = -1;
Expand Down Expand Up @@ -2143,7 +2206,7 @@ cd_up(ftp_session_t* session)
}
*slash = 0;
if (strlen(session->cwd) == 0)
strcat(session->cwd, "bfs:/");
strcat(session->cwd, "bfs1:/");
}

/*! validate a path
Expand Down Expand Up @@ -2198,24 +2261,47 @@ build_path(ftp_session_t* session,
return -1;
}

if (args[0] == 'b' && args[1] == 'f' && args[2] == 's' && args[3] == ':' && args[4] == '/')
if (args[0] == 'b' && args[1] == 'f' && args[2] == 's' && (args[3] >= '1' && args[3] <= '7') && args[4] == ':' && args[5] == '/')
{
/* let's work around wget interpretting our absolute path as a relative one */
if (args[6] == 'b' && args[7] == 'f' && args[8] == 's' && (args[9] >= '1' && args[9] <= '7') && args[10] == ':' && args[11] == '/')
p = args + 6;
else
p = args;
/* this is an absolute path */
size_t len = strlen(args);
size_t len = strlen(p);
if (len > sizeof(session->buffer) - 1)
{
errno = ENAMETOOLONG;
return -1;
}

memcpy(session->buffer, args, len);
memcpy(session->buffer, p, len);
session->buffersize = len;
}
else
{
/* this is a relative path */
if (strcmp(cwd, "bfs:/") == 0)
rc = snprintf(session->buffer, sizeof(session->buffer), "bfs:/%s",
if (strcmp(cwd, "bfs1:/") == 0)
rc = snprintf(session->buffer, sizeof(session->buffer), "bfs1:/%s",
args);
else if (strcmp(cwd, "bfs2:/") == 0)
rc = snprintf(session->buffer, sizeof(session->buffer), "bfs2:/%s",
args);
else if (strcmp(cwd, "bfs3:/") == 0)
rc = snprintf(session->buffer, sizeof(session->buffer), "bfs3:/%s",
args);
else if (strcmp(cwd, "bfs4:/") == 0)
rc = snprintf(session->buffer, sizeof(session->buffer), "bfs4:/%s",
args);
else if (strcmp(cwd, "bfs5:/") == 0)
rc = snprintf(session->buffer, sizeof(session->buffer), "bfs5:/%s",
args);
else if (strcmp(cwd, "bfs6:/") == 0)
rc = snprintf(session->buffer, sizeof(session->buffer), "bfs6:/%s",
args);
else if (strcmp(cwd, "bfs7:/") == 0)
rc = snprintf(session->buffer, sizeof(session->buffer), "bfs7:/%s",
args);
else
rc = snprintf(session->buffer, sizeof(session->buffer), "%s/%s",
Expand All @@ -2232,8 +2318,9 @@ build_path(ftp_session_t* session,

/* remove trailing / */
p = session->buffer + session->buffersize;
while (p > session->buffer && *--p == '/')
while (p > session->buffer && *--p == '/' && *--p != ':')
{
*p++;
*p = 0;
--session->buffersize;
}
Expand All @@ -2244,6 +2331,7 @@ build_path(ftp_session_t* session,
session->buffer[session->buffersize++] = 'b';
session->buffer[session->buffersize++] = 'f';
session->buffer[session->buffersize++] = 's';
session->buffer[session->buffersize++] = '1';
session->buffer[session->buffersize++] = ':';
session->buffer[session->buffersize++] = '/';
}
Expand Down
4 changes: 2 additions & 2 deletions source/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@

// We aren't an applet.
u32 __nx_applet_type = AppletType_None;
// We're a sysmodule and don't need multithreaded FS. Use 1 session instead of default 3.
u32 __nx_fs_num_sessions = 1;
// Bumping this up to 2 in order to attempt to avoid crashes caused by concurrent connections.
u32 __nx_fs_num_sessions = 2;

// setup a fake heap
char fake_heap[HEAP_SIZE];
Expand Down
102 changes: 58 additions & 44 deletions sync.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,52 +4,68 @@ pass="wonder"
host="ip.address.of.switch"
port="6000"
date=$(date -u "+%Y.%m.%d-%H%M")
dir="/path/to/archive/directory"
basedir="/path/to/archive/directory"
discord="/path/to/discord.sh --text"

mkdir -p $dir/latest
mkdir -p $dir/new
wget -T 10 -t 3 -m -c -nH --cut-dirs=1 ftp://$user:$pass@$host:$port/directories/ -P $dir/.fresh1
if [ $? -eq 0 ]
then
touch $dir/last_synced
echo $(date "+%Y.%m.%d/%H:%M") > $dir/.last_synced
find $dir/.fresh1 -type f -name ".listing" -delete
diff -qr $dir/.fresh1 $dir/latest
if [ $? -eq 1 ]
quantity="1"
dirs=("sh" "lge" "na" "na" "na" "na" "na")
names=("Shield" "Let^s%Go%Eevee" "N/A" "N/A" "N/A" "N/A" "N/A")
# Use '%' to designate spaces and '^' to designate apostrophes in names

for (( n=0; n<$quantity; n++ ))
do
dir=$basedir"/"${dirs[$n]}
mkdir -p $dir/latest
mkdir -p $dir/new
wget -T 10 -t 3 -m -c -nH --cut-dirs=2 ftp://$user:$pass@$host:$port/bfs$((n + 1)):/directories/ -P $dir/.fresh1
if [ $? -eq 0 ]
then
sleep 60
wget -T 10 -t 3 -m -c -nH --cut-dirs=1 ftp://$user:$pass@$host:$port/directories/ -P $dir/.fresh2
if [ $? -eq 0 ]
touch $dir/last_synced
echo $(date "+%Y.%m.%d/%H:%M") > $dir/.last_synced
find $dir/.fresh1 -type f -name ".listing" -delete
diff -qr $dir/.fresh1 $dir/latest
if [ $? -eq 1 ]
then
find $dir/.fresh2 -type f -name ".listing" -delete
diff -qr $dir/.fresh1 $dir/.fresh2
sleep 60
wget -T 10 -t 3 -m -c -nH --cut-dirs=2 ftp://$user:$pass@$host:$port/bfs$((n + 1)):/directories/ -P $dir/.fresh2
if [ $? -eq 0 ]
then
diff -qr $dir/.fresh1 $dir/latest
if [ $? -eq 1 ]
find $dir/.fresh2 -type f -name ".listing" -delete
diff -qr $dir/.fresh1 $dir/.fresh2
if [ $? -eq 0 ]
then
diff -qr $dir/.fresh1 $dir/latest > $dir/report
cp $dir/report $dir/discord_report
sed -i "s/: /\//g" $dir/discord_report
sed -i 's,Only in '"$dir"'/.fresh1/,Added: '"$dir"'/.fresh1/,g' $dir/discord_report
sed -i 's,Only in '"$dir"'/latest/,Removed: ,g' $dir/discord_report
sed -i 's/Files /Modified: /g' $dir/discord_report
cat $dir/discord_report | awk '{print $1 " " $2}' > $dir/report
cp $dir/report $dir/discord_report
sed -i 's,'"$dir"'/.fresh1/,,g' $dir/discord_report
cat $dir/discord_report | awk -v dir="$dir" '{if (index($2, "/") == 0) print "echo " $1 " " $2 "/$(ls " dir "/.fresh1/" $2 "/files)"; else print "echo " $1 " " $2}' | sh > $dir/discord_report2
pr -t -d $dir/discord_report2 > $dir/discord_report
$discord "$(jq -Rs . <$dir/discord_report | cut -c 2- | rev | cut -c 2- | rev)"
rm $dir/discord_report
rm -r $dir/new/*
cat $dir/report | awk -v dir="$dir" '{gsub(dir"/.fresh1/",""); print "mkdir -p " dir "/new/$(dirname " $2 ")"}' | sh
cat $dir/report | awk '{copy=$2; gsub(".fresh1","new"); print "cp -r " copy " " $2}' | sh
mv $dir/discord_report2 $dir/report
rm -r $dir/latest/*
cp -r $dir/.fresh1/* $dir/latest/
mv $dir/.fresh1 $dir/$date
rm -r $dir/.fresh2
diff -qr $dir/.fresh1 $dir/latest
if [ $? -eq 1 ]
then
diff -qr $dir/.fresh1 $dir/latest > $dir/report
cp $dir/report $dir/discord_report
sed -i "s/: /\//g" $dir/discord_report
sed -i 's,Only in '"$dir"'/.fresh1/,['"${names[$n]}"'] Added: '"$dir"'/.fresh1/,g' $dir/discord_report
sed -i 's,Only in '"$dir"'/latest/,['"${names[$n]}"'] Removed: ,g' $dir/discord_report
sed -i 's,Files ,'"[${names[$n]}"'] Modified: ,g' $dir/discord_report
cat $dir/discord_report | awk '{print $1 " " $2 " " $3}' > $dir/report
cp $dir/report $dir/discord_report
sed -i 's,'"$dir"'/.fresh1/,,g' $dir/discord_report
cat $dir/discord_report | awk -v dir="$dir" '{if (index($3, "/") == 0) print "echo " $1 " " $2 " " $3 "/$(ls " dir "/.fresh1/" $3 "/files)"; else print "echo " $1 " " $2 " " $3}' | sh > $dir/discord_report2
pr -t -d $dir/discord_report2 > $dir/discord_report
sed -i "s/%/ /g" $dir/discord_report
sed -i "s/\^/'/g" $dir/discord_report
$discord "$(jq -Rs . <$dir/discord_report | cut -c 2- | rev | cut -c 2- | rev)"
rm $dir/discord_report
rm -r $dir/new/*
cat $dir/report | awk -v dir="$dir" '{gsub(dir"/.fresh1/",""); print "mkdir -p " dir "/new/$(dirname " $3 ")"}' | sh
cat $dir/report | awk '{copy=$3; gsub(".fresh1","new"); print "cp -r " copy " " $3}' | sh
mv $dir/discord_report2 $dir/report
sed -i "s/%/ /g" $dir/report
sed -i "s/\^/'/g" $dir/report
rm -r $dir/latest/*
cp -r $dir/.fresh1/* $dir/latest/
mv $dir/.fresh1 $dir/$date
rm -r $dir/.fresh2
else
rm -r $dir/.fresh1
rm -r $dir/.fresh2
fi
else
rm -r $dir/.fresh1
rm -r $dir/.fresh2
Expand All @@ -62,11 +78,9 @@ then
rm -r $dir/.fresh1
rm -r $dir/.fresh2
fi
else
else
rm -r $dir/.fresh1
rm -r $dir/.fresh2
fi
else
rm -r $dir/.fresh1
rm -r $dir/.fresh2
fi
sleep 60
done

0 comments on commit 5519db9

Please sign in to comment.