grub_err_t grub_auth_authenticate (const char *user) { struct grub_auth_user *cur; cur = grub_named_list_find (GRUB_AS_NAMED_LIST (users), user); if (!cur) cur = grub_zalloc (sizeof (*cur)); if (!cur) return grub_errno; cur->authenticated = 1; if (! cur->name) { cur->name = grub_strdup (user); if (!cur->name) { grub_free (cur); return grub_errno; } grub_list_push (GRUB_AS_LIST_P (&users), GRUB_AS_LIST (cur)); } return GRUB_ERR_NONE; }
grub_err_t grub_auth_register_authentication (const char *user, grub_auth_callback_t callback, void *arg) { struct grub_auth_user *cur; cur = grub_named_list_find (GRUB_AS_NAMED_LIST (users), user); if (!cur) cur = grub_zalloc (sizeof (*cur)); if (!cur) return grub_errno; cur->callback = callback; cur->arg = arg; if (! cur->name) { cur->name = grub_strdup (user); if (!cur->name) { grub_free (cur); return grub_errno; } grub_list_push (GRUB_AS_LIST_P (&users), GRUB_AS_LIST (cur)); } return GRUB_ERR_NONE; }
grub_err_t grub_auth_deauthenticate (const char *user) { struct grub_auth_user *cur; cur = grub_named_list_find (GRUB_AS_NAMED_LIST (users), user); if (!cur) return grub_error (GRUB_ERR_BAD_ARGUMENT, "user '%s' not found", user); if (!cur->callback) { grub_free (cur->name); grub_list_remove (GRUB_AS_LIST_P (&users), GRUB_AS_LIST (cur)); grub_free (cur); } else cur->authenticated = 0; return GRUB_ERR_NONE; }
/* Check if DEVICE can be read. Skip any DEVICE that we have already seen. If an error occurs, return zero, otherwise return non-zero. */ static int check_device_readable_unique (const char *device) { char *real_device; char buf[512]; FILE *fp; struct seen_device *seen_elt; /* If DEVICE is empty, just return error. */ if (*device == 0) return 0; /* Have we seen this device already? */ real_device = canonicalize_file_name (device); if (! real_device) return 0; if (grub_named_list_find (GRUB_AS_NAMED_LIST (seen), real_device)) { grub_dprintf ("deviceiter", "Already seen %s (%s)\n", device, real_device); goto fail; } fp = fopen (device, "r"); if (! fp) { switch (errno) { #ifdef ENOMEDIUM case ENOMEDIUM: # if 0 /* At the moment, this finds only CDROMs, which can't be read anyway, so leave it out. Code should be reactivated if `removable disks' and CDROMs are supported. */ /* Accept it, it may be inserted. */ return 1; # endif break; #endif /* ENOMEDIUM */ default: /* Break case and leave. */ break; } /* Error opening the device. */ goto fail; } /* Make sure CD-ROMs don't get assigned a BIOS disk number before SCSI disks! */ #ifdef __linux__ # ifdef CDROM_GET_CAPABILITY if (ioctl (fileno (fp), CDROM_GET_CAPABILITY, 0) >= 0) goto fail; # else /* ! CDROM_GET_CAPABILITY */ /* Check if DEVICE is a CD-ROM drive by the HDIO_GETGEO ioctl. */ { struct hd_geometry hdg; struct stat st; if (fstat (fileno (fp), &st)) goto fail; /* If it is a block device and isn't a floppy, check if HDIO_GETGEO succeeds. */ if (S_ISBLK (st.st_mode) && MAJOR (st.st_rdev) != FLOPPY_MAJOR && ioctl (fileno (fp), HDIO_GETGEO, &hdg)) goto fail; } # endif /* ! CDROM_GET_CAPABILITY */ #endif /* __linux__ */ #if defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) # ifdef CDIOCCLRDEBUG if (ioctl (fileno (fp), CDIOCCLRDEBUG, 0) >= 0) goto fail; # endif /* CDIOCCLRDEBUG */ #endif /* __FreeBSD_kernel__ || __NetBSD__ || __OpenBSD__ */ /* Attempt to read the first sector. */ if (fread (buf, 1, 512, fp) != 512) { fclose (fp); goto fail; } /* Remember that we've seen this device. */ seen_elt = xmalloc (sizeof (*seen_elt)); seen_elt->name = real_device; /* steal memory */ grub_list_push (GRUB_AS_LIST_P (&seen), GRUB_AS_LIST (seen_elt)); fclose (fp); return 1; fail: free (real_device); return 0; }
static const char * grub_gettext_translate (const char *orig) { char *current_string; const char *ret; int min, max, current; int found = 0; struct grub_gettext_msg *cur; /* Make sure we can use grub_gettext_translate for error messages. Push active error message to error stack and reset error message. */ grub_error_push (); cur = grub_named_list_find (GRUB_AS_NAMED_LIST (grub_gettext_msg_list), orig); if (cur) { grub_error_pop (); return cur->translated; } if (fd_mo == 0) { grub_error_pop (); return orig; } min = 0; max = grub_gettext_max; current = (max + min) / 2; while (current != min && current != max && found == 0) { current_string = grub_gettext_getstring_from_position (current); /* Search by bisection. */ if (grub_strcmp (current_string, orig) < 0) { grub_free (current_string); min = current; } else if (grub_strcmp (current_string, orig) > 0) { grub_free (current_string); max = current; } else if (grub_strcmp (current_string, orig) == 0) { grub_free (current_string); found = 1; } current = (max + min) / 2; } ret = found ? grub_gettext_gettranslation_from_position (current) : orig; if (found) { cur = grub_zalloc (sizeof (*cur)); if (cur) { cur->name = grub_strdup (orig); if (cur->name) { cur->translated = ret; grub_list_push (GRUB_AS_LIST_P (&grub_gettext_msg_list), GRUB_AS_LIST (cur)); } } else grub_errno = GRUB_ERR_NONE; } grub_error_pop (); return ret; }