89 lines
1.9 KiB
C
89 lines
1.9 KiB
C
#include <sys/stat.h>
|
|
#include <dirent.h>
|
|
#include <unistd.h>
|
|
#include <libowfat/errmsg.h>
|
|
#include <libowfat/array.h>
|
|
#include <limits.h>
|
|
#include <libowfat/str.h>
|
|
#include <libowfat/buffer.h>
|
|
#include <time.h>
|
|
|
|
#define dieusage() die(100,argv0," [-C dir]")
|
|
#define dienoarg(OPT) \
|
|
do { \
|
|
carp("missing argument for -"OPT); \
|
|
dieusage(); \
|
|
} while(0)
|
|
|
|
static time_t now,expiration;
|
|
|
|
static int prompt_confirm(char *file)
|
|
{
|
|
char c;
|
|
buffer_puts(buffer_1,"remove ");
|
|
buffer_puts(buffer_1,file);
|
|
buffer_putsflush(buffer_1,"? [y/N]");
|
|
if (read(0,&c,1)<=0) return 0;
|
|
return c=='y' || c=='Y';
|
|
}
|
|
|
|
static void delete_shared(char *id)
|
|
{
|
|
DIR *dir;
|
|
struct dirent *ent;
|
|
dir=opendir(".");
|
|
if (!dir) diesys(111,"opendir");
|
|
while ((ent=readdir(dir)))
|
|
if (str_start(ent->d_name,id))
|
|
unlink(ent->d_name);
|
|
closedir(dir);
|
|
}
|
|
|
|
static void run(void)
|
|
{
|
|
DIR *dir;
|
|
struct dirent *ent;
|
|
struct stat st;
|
|
dir=opendir(".");
|
|
if (!dir) diesys(111,"opendir");
|
|
while ((ent=readdir(dir))) {
|
|
if (str_chr(ent->d_name,'.')!=str_len(ent->d_name))
|
|
continue;
|
|
if (stat(ent->d_name,&st)<0)
|
|
diesys(111,"stat ",ent->d_name);
|
|
/* ignore alias */
|
|
if (now-st.st_mtime > expiration) {
|
|
if (!prompt_confirm(ent->d_name))
|
|
continue;
|
|
buffer_putsflush(buffer_1,"\n");
|
|
delete_shared(ent->d_name);
|
|
}
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int i;
|
|
char *dir=".";
|
|
errmsg_iam(*argv);
|
|
for (i=1;i<argc;i++) {
|
|
if (argv[i][0]!='-') break;
|
|
if (argv[i][1]=='-' && !argv[i][2]) break;
|
|
switch (argv[i][1]) {
|
|
case 'C':
|
|
if(!argv[++i]) dienoarg("C");
|
|
dir=argv[i];
|
|
break;
|
|
default: dieusage();
|
|
}
|
|
}
|
|
argc-=i; argv+=i;
|
|
|
|
if (chdir(dir)<0)
|
|
diesys(100,"chdir ",dir);
|
|
|
|
time(&now);
|
|
/* 14 days */
|
|
expiration = 14*60*60*24;
|
|
run();
|
|
}
|