in speakup/kobjects.c [332:366]
static ssize_t silent_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t count)
{
int len;
struct vc_data *vc = vc_cons[fg_console].d;
char ch = 0;
char shut;
unsigned long flags;
len = strlen(buf);
if (len > 0 && len < 3) {
ch = buf[0];
if (ch == '\n')
ch = '0';
}
if (ch < '0' || ch > '7') {
pr_warn("silent value '%c' not in range (0,7)\n", ch);
return -EINVAL;
}
spin_lock_irqsave(&speakup_info.spinlock, flags);
if (ch & 2) {
shut = 1;
spk_do_flush();
} else {
shut = 0;
}
if (ch & 4)
shut |= 0x40;
if (ch & 1)
spk_shut_up |= shut;
else
spk_shut_up &= ~shut;
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
return count;
}