pipeshare/pipeshare-clean.c
2026-09-09 18:41:42 +02:00

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();
}