137 lines
No EOL
2.8 KiB
C
137 lines
No EOL
2.8 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include <stdio.h>
|
|
#include "config.h"
|
|
#include "util.h"
|
|
#include "user.h"
|
|
#include "cart.h"
|
|
#include "universe.h"
|
|
#include "realm.h"
|
|
|
|
Realm* create_realm(UserInfo* table, char* uname, char* name) {
|
|
Realm* self;
|
|
UserInfo* u = find_user(table, uname);
|
|
char cart[32];
|
|
int max = 4;
|
|
char* n = name;
|
|
char path[256] = {0};
|
|
|
|
if (u == nil || u->cart == nil)
|
|
return 0;
|
|
scpy(u->cart->name, cart, 32);
|
|
|
|
while (*n && *n != ' ') {
|
|
n++;
|
|
}
|
|
if (*n) {
|
|
*n = 0;
|
|
n++;
|
|
max = atoi(n);
|
|
}
|
|
|
|
scat(path, DATA_DIR);
|
|
scat(path, cart);
|
|
scat(path, "/realms/");
|
|
if (open(path, OREAD) < 0)
|
|
create(path, OREAD, DMDIR | 0755);
|
|
|
|
scat(path, name);
|
|
fprintf(stderr, "trying to create realm: %s\n", path);
|
|
if (create(path, OREAD, DMDIR | 0755) < 0) {
|
|
fprintf(stderr, "failed to create realm backing store\n");
|
|
return nil;
|
|
} else {
|
|
self = malloc(sizeof(Realm));
|
|
scpy(name, self->name, 32);
|
|
self->max = max;
|
|
self->password = 0;
|
|
self->universe = create_universe();
|
|
scpy(uname, self->master, 32);
|
|
save_realm(cart, self);
|
|
fprintf(stderr, "created realm '%s'\n", name);
|
|
return self;
|
|
}
|
|
}
|
|
|
|
Realm* parse_realm(char* cart, char* name) {
|
|
Realm* self;
|
|
FILE* f;
|
|
char path[256] = {0};
|
|
char file[256] = {0};
|
|
char buf[256] = {0};
|
|
scat(path, DATA_DIR);
|
|
scat(path, cart);
|
|
scat(path, "/realms/");
|
|
scat(path, name);
|
|
scpy(path, file, 256);
|
|
|
|
scat(file, "/realm");
|
|
|
|
fprintf(stderr, "realm path: %s\n", file);
|
|
f = fopen(file, "r");
|
|
if (f != nil) {
|
|
if (fgets(buf, 256, f)) {
|
|
self = malloc(sizeof(Realm));
|
|
sscanf(
|
|
buf,
|
|
"%hu %32s %llu",
|
|
&(self->max),
|
|
self->master,
|
|
&(self->password));
|
|
fclose(f);
|
|
} else {
|
|
return nil;
|
|
}
|
|
} else {
|
|
return nil;
|
|
}
|
|
|
|
scpy(path, file, 256);
|
|
scat(file, "/universe");
|
|
self->universe = parse_universe(cart, name);
|
|
return self;
|
|
}
|
|
|
|
Realm* find_realm(UserInfo* table, char* name) {
|
|
UserInfo* u = table;
|
|
int i;
|
|
|
|
for (i = 0; i < MAX_USERS; i++) {
|
|
if (slen(u->name) > 0 && u->realm != nil && scmp(u->realm->name, name))
|
|
return u->realm;
|
|
u++;
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
void save_realm(char* cart, Realm* self) {
|
|
FILE* f;
|
|
char path[256] = {0};
|
|
char file[256] = {0};
|
|
scat(path, DATA_DIR);
|
|
scat(path, cart);
|
|
scat(path, "/realms/");
|
|
scat(path, self->name);
|
|
scpy(path, file, 256);
|
|
|
|
scat(file, "/realm");
|
|
f = fopen(file, "w");
|
|
if (f != nil) {
|
|
fprintf(f, "%hu %s %llu", self->max, self->master, self->password);
|
|
fclose(f);
|
|
save_universe(cart, self->universe, self->name);
|
|
fprintf(stderr, "saved realm data");
|
|
} else {
|
|
fprintf(stderr, "error saving realm: '%s'", file);
|
|
}
|
|
}
|
|
|
|
void destroy_realm(Realm* self) {
|
|
if (self != nil) {
|
|
if (self->universe != nil) {
|
|
destroy_universe(self->universe);
|
|
}
|
|
free(self);
|
|
self = nil;
|
|
}
|
|
} |