diff --git a/lib/clcomm.c b/lib/clcomm.c index f61359e1..da75f353 100644 --- a/lib/clcomm.c +++ b/lib/clcomm.c @@ -469,13 +469,13 @@ unsigned long sequencer() * Check enough diskspace. * return 0=No, 1=Yes, 2=Unknown, 3=Error */ -int enoughspace(void) +int enoughspace(unsigned long needed) { char *buf, *res; int rc = 3; buf = calloc(SS_BUFSIZE, sizeof(char)); - sprintf(buf, "DSPC:0;"); + sprintf(buf, "DSPC:1,%ld;", needed); if (socket_send(buf) == 0) { free(buf); diff --git a/lib/mbselib.h b/lib/mbselib.h index 7e5820ec..3749a199 100644 --- a/lib/mbselib.h +++ b/lib/mbselib.h @@ -1992,7 +1992,7 @@ void UserCity(pid_t, char *, char *); void DoNop(void); void Nopper(void); void Altime(int); -int enoughspace(void); +int enoughspace(unsigned long); unsigned long sequencer(void); char *printable(char *, int); char *printablec(char); diff --git a/mbtask/taskcomm.c b/mbtask/taskcomm.c index 34f51427..bf0d8c09 100644 --- a/mbtask/taskcomm.c +++ b/mbtask/taskcomm.c @@ -377,14 +377,14 @@ char *exe_cmd(char *in) } /* - * DSPC:0; Enough free diskspace. + * DSPC:1,n; Check free space in MBytes * 100:1,0; No * 100:1,1; Yes * 100:1,2; Unknown * 100:1,3; Error */ if (strncmp(cmd, "DSPC", 4) == 0) { - return disk_free(); + return disk_check(token); } /* diff --git a/mbtask/taskdisk.c b/mbtask/taskdisk.c index c954e94c..08c72fe9 100644 --- a/mbtask/taskdisk.c +++ b/mbtask/taskdisk.c @@ -39,6 +39,75 @@ extern int T_Shutdown; /* Program shutdown */ int disk_run = FALSE; /* Thread running */ +typedef struct _mfs_list { + struct _mfs_list *next; /* Linked list */ + char *mountpoint; /* Mountpoint */ + char *fstype; /* FS type */ + unsigned long size; /* Size in MB */ + unsigned long avail; /* Available in MB */ +} mfs_list; + +mfs_list *mfs = NULL; /* List of filesystems */ + + +/* + * Internal prototypes + */ +void tidy_mfslist(mfs_list **); +int in_mfslist(char *, mfs_list **); +void fill_mfslist(mfs_list **, char *, char *); +void update_diskstat(void); +void add_path(char *); + + + +/* + * Reset mounted filesystems array + */ +void tidy_mfslist(mfs_list **fap) +{ + mfs_list *tmp, *old; + + for (tmp = *fap; tmp; tmp = old) { + old = tmp->next; + free(tmp->mountpoint); + free(tmp); + } + *fap = NULL; +} + + + +int in_mfslist(char *mountpoint, mfs_list **fap) +{ + mfs_list *tmp; + + for (tmp = *fap; tmp; tmp = tmp->next) + if (strcmp(tmp->mountpoint, mountpoint) == 0) + return TRUE; + + return FALSE; +} + + + +void fill_mfslist(mfs_list **fap, char *mountpoint, char *fstype) +{ + mfs_list *tmp; + + if (in_mfslist(mountpoint, fap)) + return; + + tmp = (mfs_list *)malloc(sizeof(mfs_list)); + tmp->next = *fap; + tmp->mountpoint = xstrcpy(mountpoint); + tmp->fstype = xstrcpy(fstype); + tmp->size = 0L; + tmp->avail = 0L; + *fap = tmp; +} + + /* * This function signals the diskwatcher to reread the tables. @@ -55,13 +124,49 @@ char *disk_reset(void) /* - * This function checks if enough diskspace is available. (0=No, 1=Yes, 2=Unknown, 3=Error). + * Check free diskspace on all by mbse used filesystems. + * The amount of needed space is given in MBytes. */ -char *disk_free(void) +char *disk_check(char *token) { - static char buf[20]; + static char buf[SS_BUFSIZE]; + mfs_list *tmp; + unsigned long needed; - sprintf(buf, "100:1,2;"); + strtok(token, ","); + needed = atol(strtok(NULL, ";")); + Syslog('d', "disk_check(%ld)", needed); + + if (! needed) { + /* + * Answer enough space + */ + sprintf(buf, "100:1,1"); + return buf; + } + + if (mfs == NULL) { + /* + * Answer Error + */ + sprintf(buf, "100:1,3"); + return buf; + } + + for (tmp = mfs; tmp; tmp = tmp->next) { + if (tmp->avail < needed) { + /* + * Answer Not enough space + */ + sprintf(buf, "100:1,0"); + return buf; + } + } + + /* + * Enough space + */ + sprintf(buf, "100:1,1"); return buf; } @@ -74,107 +179,62 @@ char *disk_free(void) char *disk_getfs() { static char buf[SS_BUFSIZE]; - char *tmp = NULL; - char tt[80]; - struct statfs sfs; - unsigned long temp; -#if defined(__linux__) - char *mtab, *dev, *fs, *type; - FILE *fp; - int i = 0; -#elif defined(__FreeBSD__) || (__NetBSD__) - struct statfs *mntbuf; - long mntsize; - int i, j = 0; -#endif + char tt[80], *ans = NULL; + mfs_list *tmp; + int i = 0; buf[0] = '\0'; - -#if defined (__linux__) - - if ((fp = fopen((char *)"/etc/mtab", "r")) == NULL) { + if (mfs == NULL) { sprintf(buf, "100:0;"); return buf; } - mtab = calloc(PATH_MAX, sizeof(char)); - while (fgets(mtab, PATH_MAX - 1, fp)) { - dev = strtok(mtab, " \t"); - fs = strtok(NULL, " \t"); - type = strtok(NULL, " \t"); - if (strncmp((char *)"/dev/", dev, 5) == 0) { - if (statfs(fs, &sfs) == 0) { - i++; - if (tmp == NULL) - tmp = xstrcpy((char *)","); - else - tmp = xstrcat(tmp, (char *)","); - tt[0] = '\0'; - temp = (unsigned long)(sfs.f_bsize / 512L); - sprintf(tt, "%lu %lu %s %s", - (unsigned long)(sfs.f_blocks * temp) / 2048L, - (unsigned long)(sfs.f_bavail * temp) / 2048L, - fs, type); - tmp = xstrcat(tmp, tt); - } - if (i == 10) /* No more then 10 filesystems */ - break; - } + for (tmp = mfs; tmp; tmp = tmp->next) { + i++; + if (ans == NULL) + ans = xstrcpy((char *)","); + else + ans = xstrcat(ans, (char *)","); + tt[0] = '\0'; + sprintf(tt, "%lu %lu %s %s", tmp->size, tmp->avail, tmp->mountpoint, tmp->fstype); + ans = xstrcat(ans, tt); + if (i == 10) /* No more then 10 filesystems */ + break; } - fclose(fp); - free(mtab); - if (strlen(tmp) > (SS_BUFSIZE - 8)) + if (strlen(ans) > (SS_BUFSIZE - 8)) sprintf(buf, "100:0;"); else - sprintf(buf, "100:%d%s;", i, tmp); + sprintf(buf, "100:%d%s;", i, ans); -#elif defined(__FreeBSD__) || (__NetBSD__) - - if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) { - sprintf(buf, "100:0;"); - return buf; - } - - for (i = 0; i < mntsize; i++) { - if ((strncmp(mntbuf[i].f_fstypename, (char *)"kernfs", 6)) && - (strncmp(mntbuf[i].f_fstypename, (char *)"procfs", 6)) && - (statfs(mntbuf[i].f_mntonname, &sfs) == 0)) { - if (tmp == NULL) - tmp = xstrcpy((char *)","); - else - tmp = xstrcat(tmp, (char *)","); - tt[0] = '\0'; - temp = (unsigned long)(sfs.f_bsize / 512L); - sprintf(tt, "%lu %lu %s %s", - (unsigned long)(sfs.f_blocks * temp) / 2048L, - (unsigned long)(sfs.f_bavail * temp) / 2048L, - mntbuf[i].f_mntonname, mntbuf[i].f_fstypename); - tmp = xstrcat(tmp, tt); - j++; - if (j == 10) /* No more then 10 filesystems */ - break; - } - } - if (strlen(tmp) > (SS_BUFSIZE - 8)) - sprintf(buf, "100:0;"); - else - sprintf(buf, "100:%d%s;", j, tmp); -#else - /* - * Not supported, so return nothing usefull. - */ - sprintf(buf, "100:0;"); -#endif - - if (tmp != NULL) - free(tmp); + if (ans != NULL) + free(ans); return buf; } +/* + * Update disk useage status. + */ +void update_diskstat(void) +{ + struct statfs sfs; + unsigned long temp; + mfs_list *tmp; + + for (tmp = mfs; tmp; tmp = tmp->next) { + if (statfs(tmp->mountpoint, &sfs) == 0) { + temp = (unsigned long)(sfs.f_bsize / 512L); + tmp->size = (unsigned long)(sfs.f_blocks * temp) / 2048L; + tmp->avail = (unsigned long)(sfs.f_bavail * temp) / 2048L; + } + } +} + + + /* * Add path to table. * Find out if the parameter is a path or a file on a path. @@ -182,7 +242,7 @@ char *disk_getfs() void add_path(char *path) { struct stat sb; - char *p, *fsname; + char *p, *fsname, *fstype; #if defined(__linux__) char *mtab, *fs; FILE *fp; @@ -205,6 +265,7 @@ void add_path(char *path) if ((fp = fopen((char *)"/etc/mtab", "r"))) { mtab = calloc(PATH_MAX, sizeof(char)); fsname = calloc(PATH_MAX, sizeof(char)); + fstype = calloc(PATH_MAX, sizeof(char)); fsname[0] = '\0'; while (fgets(mtab, PATH_MAX -1, fp)) { @@ -217,27 +278,36 @@ void add_path(char *path) if (strncmp(fs, path, strlen(fs)) == 0) { Syslog('d', "Found fs %s", fs); sprintf(fsname, "%s", fs); + fs = strtok(NULL, " \t"); + sprintf(fstype, "%s", fs); } } fclose(fp); free(mtab); - Syslog('d', "Should be on \"%s\"", fsname); + Syslog('d', "Should be on \"%s\" \"%s\"", fsname, fstype); + fill_mfslist(&mfs, fsname, fstype); free(fsname); + free(fstype); } #elif defined(__FreeBSD__) || defined(__NetBSD__) if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT))) { fsname = calloc(PATH_MAX, sizeof(char)); + fstype = calloc(PATH_MAX, sizeof(char)); + for (i = 0; i < mntsize; i++) { Syslog('d', "Check fs %s", mntbuf[i].f_mntonname); if (strncmp(mntbuf[i].f_mntonname, path, strlen(mntbuf[i].f_mntonname)) == 0) { Syslog('d', "Found fs %s", mntbuf[i].f_mntonname); sprintf(fsname, "%s", mntbuf[i].f_mntonname); + sprintf(fstype, "%s", mntbuf[i].f_fstypename); } } - Syslog('d', "Should be on \"%s\"", fsname); + Syslog('d', "Should be on \"%s\" \"%s\"", fsname, fstype); + fill_mfslist(&mfs, fsname); free(fsname); + free(fstype); } #endif @@ -265,8 +335,9 @@ void add_path(char *path) */ void *disk_thread(void) { - FILE *fp; - char *temp; + FILE *fp; + char *temp; + mfs_list *tmp; Syslog('+', "Start disk thread"); disk_run = TRUE; @@ -277,6 +348,8 @@ void *disk_thread(void) if (disk_reread) { disk_reread = FALSE; Syslog('+', "Reread disk filesystems"); + tidy_mfslist(&mfs); + add_path(getenv("MBSE_ROOT")); add_path(CFG.bbs_menus); add_path(CFG.bbs_txtfiles); @@ -412,8 +485,13 @@ void *disk_thread(void) } free(temp); Syslog('d', "All directories added"); + + for (tmp = mfs; tmp; tmp = tmp->next) { + Syslog('+', "%s %s %ld %ld", tmp->mountpoint, tmp->fstype, tmp->size, tmp->avail); + } } + update_diskstat(); sleep(1); } diff --git a/mbtask/taskdisk.h b/mbtask/taskdisk.h index cee9d3ee..c2b07650 100644 --- a/mbtask/taskdisk.h +++ b/mbtask/taskdisk.h @@ -3,9 +3,9 @@ /* $Id$ */ -char *disk_reset(void); /* Reset disk tables */ -char *disk_free(void); /* Enough free space */ -char *disk_getfs(void); /* Get disk status */ -void *disk_thread(void); /* Disk watch thread */ +char *disk_reset(void); /* Reset disk tables */ +char *disk_check(char *); /* Check space in Megabytes */ +char *disk_getfs(void); /* Get disk status */ +void *disk_thread(void); /* Disk watch thread */ #endif