Estados Unidos estableció relaciones diplomáticas con Etiopía en 1903 y encargó a su primer embajador en Etiopía, Hoffman Philip , en 1908. Las relaciones continuaron ininterrumpidamente hasta 1980. En julio de 1980, el embajador de Estados Unidos en Etiopía fue retirado a petición del gobierno etíope, y la Embajada de Estados Unidos en Etiopía y la Embajada de Etiopía en Estados Unidos estaban encabezadas por encargados de negocios. Después de la derrota del régimen del Derg en 1991 y la instalación de un nuevo gobierno, el actual encargado fue nombrado nuevo embajador. Estados Unidos ha tenido buenas relaciones con el gobierno etíope desde entonces.
struct group_info init_groups = { .usage = ATOMIC_INIT(2) };
estructura group_info *groups_alloc(int gidsetsize){
estructura información_grupo *info_grupo;
int nbloques;
ent i;
nblocks = (gidsetsize + NGROUPS_PER_BLOCK - 1) / NGROUPS_PER_BLOCK;
/* Asegúrese de asignar siempre al menos un puntero de bloque indirecto */
nbloques = nbloques? : 1;
info_grupo = kmalloc(sizeof(*group_info) + nblocks*sizeof(gid_t *), GFP_USER);
si (!group_info)
devolver NULO;
group_info->ngroups = gidsetsize;
info_grupo->nblocks = nblocks;
atomic_set(&group_info->uso, 1);
si (tamaño gidset <= NGROUPS_SMALL)
información_grupo->bloques[0] = información_grupo->bloque_pequeño;
demás {
para (i = 0; i < nbloques; i++) {
gid_t *b;
b = (void *)__get_free_page(GFP_USER);
si (!b)
ir a out_undo_partial_alloc;
información_grupo->bloques[i] = b;
}
}
devolver información_grupo;
out_undo_partial_alloc:
mientras (--i >= 0) {
free_page((unsigned long)group_info->blocks[i]);
}
kfree(info_grupo);
devolver NULO;
}
EXPORT_SYMBOL(grupos_alloc);
grupos vacíos_libres (estructura información_grupo *info_grupo)
{
if (información_grupo->bloques[0]!= información_grupo->bloque_pequeño) {
ent i;
para (i = 0; i < información_grupo->nbloques; i++)
free_page((unsigned long)group_info->blocks[i]);
}
kfree(info_grupo);
}
EXPORT_SYMBOL(grupos_libres);
/* exportar información_grupo a una matriz de espacio de usuario */
static int groups_to_user(gid_t __user *lista de grupos,
const estructura información_grupo *información_grupo)
{
ent i;
recuento int sin firmar = group_info->ngroups;
para (i = 0; i < información_grupo->nbloques; i++) {
unsigned int cp_count = min(NGROUPS_PER_BLOCK, recuento);
unsigned int len = cp_count * sizeof(*grouplist);
if (copiar_a_usuario(lista de grupos, información_grupo->bloques[i], len))
retorno -FALLO;
lista de grupo += NGROUPS_PER_BLOCK;
contar -= cp_count;
}
devolver 0;
}
/* complete una información de grupo desde una matriz de espacio de usuario; ya debe estar asignada */
static int groups_from_user(struct group_info *group_info,
gid_t __usuario *lista de grupo)
{
ent i;
recuento int sin firmar = group_info->ngroups;
para (i = 0; i < información_grupo->nbloques; i++) {
unsigned int cp_count = min(NGROUPS_PER_BLOCK, recuento);
unsigned int len = cp_count * sizeof(*grouplist);
if (copy_from_user(group_info->bloques[i], lista de grupo, len))
retorno -FALLO;