Se você examinar a saída do dmesg, poderá ver exatamente quando está tocando a campainha, usando o caractere BEL ASCII \a
:
$ dmesg | grep -C1 $'\a'
[ 5.706427] usb 1-2: Manufacturer: HD WebCam
[ 5.706434] usb 1-2: SerialNumber: NC2141103Q533020AALM03
[ 5.798439] Unsafe core_pattern used with suid_dumpable=2. Pipe handler or fully qualified core dump path required.
--
[13843.531106] usb 1-2: Manufacturer: HD WebCam
[13843.531115] usb 1-2: SerialNumber: NC2141103Q533020AALM03
[13843.546586] uvcvideo: Found UVC 1.00 device HD WebCam (0bda:57cf)
Curiosamente, o toque do sino parece estar acontecendo na metade da inicialização da webcam. Podemos verificar exatamente onde na linha a BEL está sendo impressa, passando por od:
$ dmesg | grep $'\a' | head -n 1 | od -c
0000000 [ 5 . 7 0 6 4 3 4 ] u
0000020 s b 1 - 2 : S e r i a l N u
0000040 m b e r : \a N C 2 1 4 1 1 0 3
0000060 Q 5 3 3 0 2 0 A A L M 0 3 \n
0000076
O BEL é representado aqui como \a
e está sendo impresso logo antes do número de série ( SerialNumber: ␇NC214...
). Parece improvável que o dmesg insira um BEL no meio de uma linha, então talvez seja o kernel que está registrando o arquivo.
Vamos verificar o código-fonte. Talvez o driver USB esteja imprimindo uma campainha quando registra o número de série. Podemos usar livegrep rapidamente pesquise a origem do Linux 4.12 e descubra que o arquivo relevante provavelmente é drivers/usb/core/hub.c
. Então, podemos voltar para a fonte do Linux 3.10.18 usando Elixir , e encontre a função relevante:
static void announce_device(struct usb_device *udev)
{
dev_info(&udev->dev, "New USB device found, idVendor=%04x, idProduct=%04x\n",
le16_to_cpu(udev->descriptor.idVendor),
le16_to_cpu(udev->descriptor.idProduct));
dev_info(&udev->dev,
"New USB device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
udev->descriptor.iManufacturer,
udev->descriptor.iProduct,
udev->descriptor.iSerialNumber);
show_string(udev, "Product", udev->product);
show_string(udev, "Manufacturer", udev->manufacturer);
show_string(udev, "SerialNumber", udev->serial);
}
show_string
é uma função muito simples, definida acima de announce_device
, que praticamente imprime seus argumentos separados por dois pontos e um espaço:
static void show_string(struct usb_device *udev, char *id, char *string)
{
if (!string)
return;
dev_info(&udev->dev, "%s: %s\n", id, string);
}
Então não é o kernel que está adicionando o sino.
Qual é o número de série do dispositivo USB?
Podemos verificar com o lsusb:
$ lsusb -vd 0bda:57cf | grep iSerial
iSerial 2 NC2141103Q533020AALM03
OK, agora vamos direcioná-lo por od:
$ lsusb -vd 0bda:57cf | grep iSerial | od -c
0000000 i S e r i a l
0000020 2 \a N C 2
0000040 1 4 1 1 0 3 Q 5 3 3 0 2 0 A A L
0000060 M 0 3 \n
0000064
que sugere que, de fato, o número de série da webcam contém uma ASCII BEL.