#include #include #include typedef struct { char name[64]; char data[128]; int ver; } AFSFile; AFSFile server_files[2]; int num_files = 2; typedef struct { char cached_name[64]; char cached_data[128]; int cached_ver; bool has_callback; bool is_dirty; } VenusCache; void init_server(void) { strcpy(server_files[0].name, "notes.txt"); strcpy(server_files[0].data, "Hello AFS world"); server_files[0].ver = 1; strcpy(server_files[1].name, "data.bin"); strcpy(server_files[1].data, "binary stuff"); server_files[1].ver = 1; } void fetch_file(VenusCache *cache, const char *fname) { for (int i = 0; i < num_files; i++) { if (strcmp(server_files[i].name, fname) == 0) { strcpy(cache->cached_name, fname); strcpy(cache->cached_data, server_files[i].data); cache->cached_ver = server_files[i].ver; cache->has_callback = true; cache->is_dirty = false; printf("FETCH: whole file %s v%d cached locally\n", fname, cache->cached_ver); return; } } } void store_file(VenusCache *cache) { if (!cache->is_dirty) return; for (int i = 0; i < num_files; i++) { if (strcmp(server_files[i].name, cache->cached_name) == 0) { strcpy(server_files[i].data, cache->cached_data); server_files[i].ver++; cache->cached_ver = server_files[i].ver; cache->is_dirty = false; printf("STORE: file %s updated to v%d on server\n", cache->cached_name, server_files[i].ver); printf("CALLBACK: notified other clients of change\n"); return; } } } void local_write(VenusCache *cache, const char *newdata) { strcpy(cache->cached_data, newdata); cache->is_dirty = true; printf("LOCAL WRITE: modified cache of %s\n", cache->cached_name); } int main(void) { init_server(); VenusCache client1 = {0}; VenusCache client2 = {0}; printf("AFS Simulation Start\n"); fetch_file(&client1, "notes.txt"); local_write(&client1, "Updated notes by client1"); store_file(&client1); fetch_file(&client2, "notes.txt"); printf("Client2 reads: %s\n", client2.cached_data); local_write(&client1, "Second update"); store_file(&client1); printf("After callback, client2 cache invalid, would refetch\n"); fetch_file(&client2, "notes.txt"); printf("Client2 now has: %s\n", client2.cached_data); printf("AFS Simulation End\n"); return 0; }