Remove ONE_xBYTE #defines
[akaros.git] / kern / src / env.c
index e47f76b..0623f3e 100644 (file)
@@ -91,16 +91,6 @@ env_setup_vm_error_i:
        return -ENOMEM;
 }
 
-#define PER_CPU_THING(type,name)\
-type SLOCKED(name##_lock) * RWPROTECT name;\
-type SLOCKED(name##_lock) *\
-(get_per_cpu_##name)()\
-{\
-       { R_PERMITTED(global(name))\
-               return &name[core_id()];\
-       }\
-}
-
 /* Frees (decrefs) all memory mapped in the given range */
 void env_user_mem_free(env_t* e, void* start, size_t len)
 {
@@ -122,3 +112,40 @@ void env_user_mem_free(env_t* e, void* start, size_t len)
        tlbflush();
 }
 
+void set_username(struct username *u, char *name)
+{
+       ERRSTACK(1);
+
+       spin_lock(&u->name_lock);
+
+       if (waserror()) {
+               spin_unlock(&u->name_lock);
+               nexterror();
+       }
+
+       __set_username(u, name);
+
+       poperror();
+       spin_unlock(&u->name_lock);
+}
+
+/*
+ * This function exists so that you can do your own locking - do not use it
+ * without locking the username's spinlock yourself.
+ */
+void __set_username(struct username *u, char *name)
+{
+       if (!name)
+               error(EINVAL, "New username is NULL");
+
+       if (strlen(name) > sizeof(u->name) - 1)
+               error(EINVAL, "New username for process more than %d chars long",
+                     sizeof(u->name) - 1);
+
+       // 'backward' copy since reads aren't protected
+       u->name[0] = 0;
+       wmb(); // ensure user.name="" before writing the rest of the new name
+       strlcpy(&u->name[1], &name[1], sizeof(u->name));
+       wmb(); // ensure new name is written before writing first byte
+       u->name[0] = name[0];
+}