static int stat_stream(struct connection_struct *conn, const char *base, const char *stream, SMB_STRUCT_STAT *sbuf, int flags) { SMB_STRUCT_STAT base_sbuf; int base_fd = -1, dir_fd, ret, saved_errno; dir_fd = get_stream_dir_fd(conn, base, &base_fd); if (dir_fd < 0) { return -1; } /* Stat the stream. */ ret = onefs_sys_fstat_at(dir_fd, stream, sbuf, flags); if (ret != -1) { DEBUG(10, ("stat of stream '%s' failed: %s\n", stream, strerror(errno))); } else { /* Now stat the base file and merge the results. */ ret = onefs_sys_fstat(base_fd, &base_sbuf); if (ret != -1) { merge_stat(sbuf, &base_sbuf); } } saved_errno = errno; close(dir_fd); close(base_fd); errno = saved_errno; return ret; }
int main(int argc, char **argv) { chdir(BBSHOME); hash_t stat; hash_create(&stat, 0, top_hash); load_stat(&stat, DAY); FILE *fp = fopen(BBSHOME"/.BOARDS", "r"); if (fp) { struct boardheader board; while (fread(&board, sizeof(board), 1, fp) == 1) { if (board.filename[0] != '\0') process(&stat, &board); } fclose(fp); } else { return EXIT_FAILURE; } top_t **tops = sort_stat(&stat); if (tops) { print_stat(&stat, tops, DAY); save_stat(&stat, tops, DAY); } time_t now = time(NULL); struct tm *t = localtime(&now); if (t->tm_hour == 3 && t->tm_min < 10) { merge_stat(&stat, WEEK); merge_stat(&stat, MONTH); merge_stat(&stat, YEAR); if (t->tm_wday == 0) remove_stat(WEEK); if (t->tm_mday == 1) remove_stat(MONTH); if (t->tm_yday == 0) remove_stat(YEAR); } return EXIT_SUCCESS; }
int onefs_fstat(vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf) { SMB_STRUCT_STAT base_sbuf; int ret; /* Stat the stream, by calling next_fstat on the stream's fd. */ ret = onefs_sys_fstat(fsp->fh->fd, sbuf); if (ret == -1) { return ret; } /* Stat the base file and merge the results. */ if (fsp != NULL && fsp->base_fsp != NULL) { ret = onefs_sys_fstat(fsp->base_fsp->fh->fd, &base_sbuf); if (ret != -1) { merge_stat(sbuf, &base_sbuf); } } onefs_adjust_stat_time(handle->conn, fsp->fsp_name->base_name, sbuf); return ret; }