Linux на страже Windows. Обзор и установка системы резервного копирования BackupPC
Андрей Маркелов
perldoc <имя модуля>
#tar zxvf имя_архива.tar.gz // разархивируем исходники
#perl Makefile.PL // формируем makefile
#make // компилируем исходники
#make test // после выполнения этой команды мы должны получить сообщение, что все тесты пройдены успешно
#make install
export LANG=en_US
#tar zxvf par2cmdline-0.4.tar.gz
#cd par2cmdline-0.4
#./configure
#make
#make check
#make install
#useradd backuppc
#tar zxvf BackupPC-x.x.x.tar.gz
#cd BackupPC-x.x.x
#perl configure.pl
#service backuppc start
#chkconfig - -add backuppc
#chkconfig - -level 35 backuppc on
«print $Cgi->header();»
«print $Cgi->header(-charset=>”koi8-r”);»
«$s=~s{([^[:print:]])}{sprintf(“&\#x%02X;”, ord($1));}eg;»
Роутер без диска
Сергей Яремчук
#/etc/rc.d/rc.inet1
#configsave /dev/fd0
#configrestore /dev/fd0
FreeBSD tips: устанавливаем VPN
Сергей Супрунов
# cd /usr/ports/net/mpd
# make
# make install
#------------------- mpd.conf --------------------------
default:
# Указываем, какую конфигурацию грузить (в принципе все параметры можно задать и непосредственно в секции default):
load pptp0
pptp0:
# Объявляем новый интерфейс ng0:
new -i ng0 pptp0 pptp0
# Поскольку мы никуда не звоним, то устанавливать соединение по требованию не нужно:
set iface disable on-demand
# Разрешаем прохождение arp-запросов:
set iface enable proxy-arp
# Запрещаем разрывать связь при простое:
set iface idle 0
# Ограничение на размер исходящих пакетов значением MTU:
set iface enable tcpmssfix
# Указываем, что наше соединение – не мультилинк:
set bundle disable multilink
# Требуем шифрование:
set bundle yes crypt-reqd
# Включаем компрессию:
set bundle enable compression
set link yes acfcomp protocomp
# Разрешаем только chap-авторизацию:
set link no pap chap
set link enable chap
# Интервалы проверки линка на «жизнеспособность»:
set link keep-alive 10 60
# Размер «окна отсылки»:
set link mtu 1460
# Разрешаем компрессию TCP-заголовка:
set ipcp yes vjcomp
# Следующий параметр задает диапазоны IP-адресов на стороне сервера и на стороне клиентов в виде set ipcp ranges local[/width] remote[/width]
# В нашем случае серверу и клиенту назначается по одному адресу:
set ipcp ranges 197.y.y.73 197.y.y.75
# Следующие четыре опции cpp определяют протоколы управления сжатием (compression control protocol) – для работы с Windows-клиентами.
# Включаем поддержку сжатия MPPC (Microsoft Point-to-Point Compression):
set ccp yes mppc
# Поддержка 40-битного кодирования:
set ccp yes mpp-e40
# Поддержка 128-битного кодирования:
set ccp yes mpp-e128
# Stateless-режим, уменьшает время восстановления при сбросе (drop) пакета:
set ccp yes mpp-stateless
# Адрес, на котором VPN-сервер ждет соединения:
set pptp self 10.х.х.254
# Разрешаем входящие соединения:
set pptp enable incoming
# Инициировать соединение со стороны mpd не нужно:
set pptp disable originate
#--------------------- mpd.links -----------------------
pptp0:
set link type pptp
#------------------- mpd.secret ------------------------
username "userpassword" *
# /usr/local/etc/rc.d/mpd.sh start
Взаимодействие shell-скриптов с пользователем посредством Zenity
Андрей Уваров
# zenity --error
#! /usr/local/bin/perl
do
print `zenity --info --text "You may not enter real birth date" --title=birthday`;
while(!($birthdate = `zenity --calendar --date-format=%d.%m.%y`));
`zenity --info --text "Your birth date is $birthdate" --title "Your Bitrh Date"`;
#! /bin/sh
```zenity --entry --title "Run command" --text "Command:```
Windows XP Service Pack 2 глазами системного администратора
Михаил Платов
{путь к SP2}\ WindowsXP-KB835935-SP2-ENU.exe /u /x:c:\sp2
HKLM,"SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile","EnableFirewall",0x00010001,0
Bugtraq стр. 29
"CWD xxxxxxxxxxx..."
"LIST xxxxxxxxxxx..."
"STAT xxxxxxxxxxx..."
Настраиваем соединение по выделенной линии
[boot loader]
timeout=3
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT.PRO
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT.PRO="Microsoft Windows 2000 Professional RUS" /fastdetect /sos /bootlog
multi(0)disk(0)rdisk(0)partition(2)\WINNT.SRV="Microsoft Windows 2000 Server" /fastdetect /sos /bootlog
# cat /usr/local/minicom/etc/minirc.ttyS0
pr port /dev/ttyS0
pu baudrate 19200
pu bits 8
pu parity N
pu stopbits 1
# minicom -o -8 ttyS0
AT&F&L1*M1&H3S38.3=1S20=3S18=3S35.1=1S10=020*E1*Q1M0L0
AT&F&L1*M0&H3S38.3=1S20=3S18=3S35.1=1S10=020*E1*Q1M0L0
tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /home/anthony/tftpd -u anthony -c
# kill -1 inetd
# cat /usr/local/minicom/etc/minirc.cisco
pr port /dev/ttyS1
pu baudrate 9600
pu bits 8
pu parity N
pu stopbits 1
# minicom -o -8 cisco
!
! Last configuration change at 09:45:23 MSD Fri Jul 2 2004 by c2500b
! NVRAM config last updated at 09:45:37 MSD Fri Jul 2 2004 by c2500b
!
version 12.0
service timestamps debug uptime
service timestamps log uptime
no service password-encryption
!
hostname C2500
!
aaa new-model
aaa authentication login vty local
enable secret 5 $1$PlHE$4e7IsaMq52hH/93YAFsmo/
enable password c
!
username c2500b password 0 cisco
username user password 0 pass
!
!
clock timezone MSK 3
clock summer-time MSD recurring last Sun Mar 2:00 last Sun Oct 2:00
ip subnet-zero
no ip domain-lookup
ip domain-name tmb
ip name-server 1.2.3.200
ip name-server 1.2.3.128
!
!
process-max-time 200
!
interface Ethernet0
ip address 1.2.3.100 255.255.0.0
no ip directed-broadcast
no cdp enable
!
interface Serial0
no ip address
no ip directed-broadcast
shutdown
no cdp enable
!
interface Serial1
no ip address
no ip directed-broadcast
shutdown
no cdp enable
!
interface Group-Async0
description Leased Line Discipline for OutDoor Offices
ip unnumbered Ethernet0
no ip directed-broadcast
encapsulation ppp
ip tcp header-compression passive
async mode dedicated
no cdp enable
ppp authentication pap
group-range 1 16
member 1 peer default ip address 1.2.3.11
member 2 peer default ip address 1.2.3.12
member 3 peer default ip address 1.2.3.13
member 4 peer default ip address 1.2.3.14
member 5 peer default ip address 1.2.3.15
member 6 peer default ip address 1.2.3.16
member 7 peer default ip address 1.2.3.17
member 8 peer default ip address 1.2.3.18
!
ip classless
ip route 0.0.0.0 0.0.0.0 Ethernet0
no ip http server
!
no cdp run
banner login _Welcome to Cisco->Metaframe Gateway_
!
line con 0
exec-timeout 0 0
transport input none
line 1 16
autoselect ppp
modem InOut
transport input all
stopbits 1
speed 19200
flowcontrol hardware
line aux 0
line vty 0
exec-timeout 0 0
password cisco
linevty 1 4
!
ntpserver 1.2.3.128
end
@Echo Off
REM =======================================================
REM 'Cisco2RAS' service (Win2K Pro)
REM Auto-connecting / disconnecting RAS engine
REM Anton Borisov, a.borisov@tesv.tmb.ru
REM 28 Jun 2004
REM =======================================================
set PINGTIMEOUT=2500
set LOG=%SystemRoot%\cisco2ras.log
set ERR=%SystemRoot%\cisco2ras.err
REM // 30 seconds lasts each cycle
set TIME=30
REM // 8 seconds to raise new interface in Leased Line
set TIMEDROP=8
REM // 15 seconds for new interface to establish connection
set TIMEIF=15
set IFSTOP=rasdial CiscoHub /D
set IFSTART=rasdial CiscoHub user pass
set MyCMD=Cisco2RAS
set PINGER=1.2.3.128
Echo ========[ %MyCMD% Service startup! ]======== >> %LOG%
time /t >> %LOG%
date /T >> %LOG%
:1
echo Erasing statistics file %ERR% in this cycle
del %ERR%
ping %PINGER% -n 7 -w %PINGTIMEOUT% | find "TTL" || echo DOWN > %ERR%
if exist %ERR% (
echo No Leased Line link found. STOP IFACE....
%IFSTOP%
echo Sleeping %TIMEDROP% seconds before dropping ї
IFACE one more time.
sleep.exe %TIMEDROP%
echo Dropping IFACE one more time.
%IFSTOP%
echo Sleeping %TIMEIF% seconds before Leased Line is set.
sleep.exe %TIMEIF%
echo Raising up IFACE once more time....
%IFSTART%
echo _________start log________ >> %LOG%
echo new IFACE is set ... >> %LOG%
time /t >> %LOG%
date /T >> %LOG%
echo __________end log_________ >> %LOG%
)
echo Sleeping %TIME% seconds in this turn;
Sleep.exe %TIME%
goto 1
REGEDIT
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ras.cmd]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="C:\\WINNT.PRO\\srvany.exe"
"DisplayName"="Cisco2RAS"
"ObjectName"="LocalSystem"
"MyVersionSftw"="Cisco2RAS Service"
"MyVersionInfo"="Auto-connecting / disconnecting RAS engine"
"MyVersionMail"="Anton Borisov, a.borisov@tesv.tmb.ru"
"MyVersionDate"="28 Jun 2004"
"Description"="Auto-connecting / disconnecting RAS engine"
"FailureActions"=hex:00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,98,10,0e,00,01,00,00,00,e0,93,04,00,01,00,00,00,e0,93,04,00,00,00,00,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ras.cmd\Parameters]
"Application"="C:\\WINNT.PRO\\ras.cmd"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ras.cmd\Enum]
"0"="Root\\LEGACY_RAS.CMD\\0000"
"Count"=dword:00000001
@Echo Off
REM =======================================================
REM 'Cisco2RRAS' service
REM Auto-connecting / disconnecting RRAS engine
REM Anton Borisov, a.borisov@tesv.tmb.ru
REM 28 Jun 2004
REM =======================================================
set PINGTIMEOUT=2000
set LOG=%SystemRoot%\cisco2rras.log
set ERR=%SystemRoot%\cisco2rras.err
REM // 30 seconds lasts each cycle
set TIME=30
REM // 8 seconds to raise new interface in Leased Line
set TIMEDROP=8
REM // 15 seconds for new interface to establish connection
set TIMEIF=15
set IFSTOP=netsh interface set interface name = CiscoHub connect = DISCONNECT
set IFSTART=netsh interface set interface name = CiscoHub connect = CONNECT
set IFROUTE=netsh routing ip add persistentroute 192.168.0.0 255.255.0.0 CiscoHub
set MyCMD=Cisco2RRAS
set PINGER=192.168.0.100
Echo "========[ %MyCMD% Service startup! ]=======" >> %LOG%
time /t >> %LOG%
date /T >> %LOG%
:1
echo "Erasing statistics file %ERR% in this cycle"
del %ERR%
ping %PINGER% -n 7 -w %PINGTIMEOUT% | find "TTL" || echo DOWN > %ERR%
if exist %ERR% (
echo "No reliable route found. Dropping down IFACE...".
%IFSTOP%
echo "Sleeping %TIMEDROP% seconds before new IFACE is raised up".
sleep.exe %TIMEDROP%
echo "Sleeping %TIMEIF% seconds before Leased Line is set".
sleep.exe %TIMEIF%
echo "Establishing new route. Raising up IFACE...".
%IFSTART%
%IFROUTE%
echo "_________start log________" >> %LOG%
echo "new IFACE is set ... " >> %LOG%
time /t >> %LOG%
date /T >> %LOG%
echo "__________end log_________" >> %LOG%
)
echo "Sleeping %TIME% seconds in this turn";
Sleep.exe %TIME%
goto 1
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rras.cmd]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="C:\\WINNT.SRV\\srvany.exe"
"DisplayName"="Cisco2RRAS"
"ObjectName"="LocalSystem"
"MyVersionSftw"="Cisco2RRAS Service"
"MyVersionInfo"="Auto-connecting / disconnecting RRAS engine"
"MyVersionMail"="Anton Borisov, a.borisov@tesv.tmb.ru"
"MyVersionDate"="28 Jun 2004"
"Description"="Auto-connecting / disconnecting RAS engine"
"FailureActions"=hex:00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,98,10,0e,00,01,00,00,00,e0,93,04,00,01,00,00,00,e0,93,04,00,00,00,00,00,00,00,00,00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rras.cmd\Parameters]
"Application"="C:\\WINNT.SRV\\rras.cmd"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rras.cmd\Enum]
"0"="Root\\LEGACY_RRAS.CMD\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001
GRSecurity
Кирилл Тихонов
# emerge grsec-sources
# emerge gradm
# cd gradm-2.0
# make
# make install
# cd linux-2.4.26
# patch –Np1 –i ../grsecurity-2.0-2.4.26.patch
# make menuconfig
role named u
role users g
role_allow_ip IP/netmask
role_allow_ip 192.168.1.0/24
role_transitions
subject /bin/su {
......
}
subject /bin/su:/bin/bash:/bin/cat {
..........
}
subject /usr/bin/sarg:/bin/bash {
/ r
/bin h
/bin/date x
/bin/mkdir x
/bin/rm x
/dev/tty rw
/dev/null rw
...............................
}
subject /bin/su o {
/etc/passwd r
/etc/shadow r
-CAP_ALL
}
connect /<маска>:<начальный порт>-<конечный порт> <тип> <протокол>
bind /<маска>:<начальный порт>-<конечный порт> <тип> <протокол>
subject /bin/su o {
/etc/passwd r
/etc/shadow r
-CAP_ALL
connect disabled
bind disabled
}
subject /usr/sbin/apache o {
........................................
connect 0.0.0.0/0:53 dgram udp
bind 0.0.0.0/0:80 stream tcp
}
# gradm –F –L /var/log/grsec
# gradm –F –L /var/log/grsec –O /etc/grsec/acl
role default
subject / {
/ h
-CAP_ALL
connect disabled
bind disabled
}
role root uG
subject / {
/ h
/bin h
……………….
}
………………..
# gradm –E
# gradm –D
role mysql u
subject / {
/ h
-CAP_ALL
bind disabled
connect disabled
}
subject /usr/sbin/mysqld o {
/ h
/etc r
/etc/grsec h
/etc/mysql/my.cnf r
/lib rx
/proc/sys/kernel/version r
/tmp rwcd
/usr/lib rx
/usr/share/zoneinfo r
/usr/share/mysql r
/var/run/mysqld w
/var/lib/mysql rw
/var/lib/mysql/* rw
-CAP_ALL
+CAP_SETGID
+CAP_SETUID
}
subject /usr/bin/netams o {
/
/var rwc
/var/log h
/etc/ssh h
/etc/grsec h
/dev/grsec h
/proc/kcore h
/proc/sys h
/etc/shadow h
/etc/passwd h
/dev/mem h
/dev/kmem h
/dev/port h
/dev/log h
-CAP_ALL
+CAP_NET_ADMIN
bind disabled
connect disabled
}
role apache ul
# gradm –E –L /var/log/grsec
# gradm –D
# gradm –L /var/log/grsec –O /etc/grsec/acl
subject /bin/su lo {
/ h
-CAP_ALL
connect disabled
bind disabled
}
role sysadmin sA
subject / {
/ rwcdmxi
+CAP_ALL
}
role_transitions sysadmin
Восстановление данных на NTFS-разделах
Крис Касперски
Листинг 1. Интерфейс с IDE-диском в режиме CHS
порт значение
0172/01F2 кол-во секторов
0173/01F3 номер сектора (биты 0-7)
0174/01F4 номер цилиндра (биты 0-7)
0175/01F5 номер цилиндра (биты 8-15)
0176/01F6 номер головки (биты 0-3), привод на шине (бит 4), режим CHS/LBA (бит 6)
Листинг 2. Интерфейс с прерыванием INT13h BIOS
регистр значение
AL кол-во секторов для обработки
CH номер цилиндра (биты 0-7)
CL номер цилиндра (биты 6-7), номер сектора (биты 0-5)
DH номер головки
DL привод на шине | 80h
Листинг 3. Интерфейс с IDE-диском в режиме LBA
порт значение
0172/01F2 кол-во секторов
0173/01F3 номер сектора (биты 0-7)
0174/01F4 номер сектора (биты 8-15)
0175/01F5 номер сектора (биты 16-24)
0176/01F6 номер сектора (биты 24-28), привод на шине (бит 4), режим CHS/LBA (бит 6)
Пакетные команды интерфейса ATAPI
Владимир Мешков
#define BSY 0x80
#define DRQ 0x08
#define DRDY 0x40
#define OUT_P_B(val,port) __asm__("outb %%al, %%dx"::"a"(val),"d"(port))
#define OUT_P_W(val,port) __asm__("outw %%ax, %%dx"::"a"(val),"d"(port))
#define IN_P_B(val,port) __asm__("inb %%dx, %%al":"=a"(val):"d"(port))
#define IN_P_W(val,port) __asm__("inw %%dx, %%ax":"=a"(val):"d"(port))
void send_packet_command(__u8 *cmd_buff)
{
int i;
__u8 status = 0;
__u16 port, a;
port = 0x177; // регистр состояния SR
/* В соответствии с алгоритмом ждем нулевого значения битов BSY и DRQ */
for(;;) {
do {
IN_P_B(status, port);
} while(status & BSY);
if(!(status & DRQ)) break;
}
/* Выбираем устройство Master и в его регистр команд записываем код пакетной команды */
port = 0x176; OUT_P_B(0xA0, port); // бит DEV сброшен
port = 0x177; OUT_P_B(0xA0, port);
/* Ждём сброса бита BSY и установки DRQ */
for(;;) {
do {
IN_P_B(status, port);
} while(status & BSY);
if(status & DRQ) break;
}
port = 0x170; // регистр данных
/* Записываем в регистр данных переданный 12-байтный командный пакет (отметим одну особенность – если
* записывать по одному байту, команда работать не будет)
*/
for(i = 0; i < 12; i += 2) {
memcpy((void *)&a, (cmd_buff + i), 2);
OUT_P_W(a, port);
}
port = 0x177;
/* Ждём сброса бита BSY и установки DRDY */
for(;;) {
do {
IN_P_B(status, port);
} while(status & BSY);
if(status & DRDY) break;
}
return;
}
void wait_while_ready()
{
__u8 cmd_buff[12];
memset((void *)cmd_buff, 0, 12);
cmd_buff[0] = 0x00;
send_packet_command(cmd_buff);
return;
}
void close_cdrom()
{
__u8 cmd_buff[12];
memset((void *)cmd_buff, 0, 12);
cmd_buff[0] = 0x1B; // код команды START/STOP UNIT
cmd_buff[4] = 0x3; // LoEj = 1, Start = 1
send_packet_command(cmd_buff);
}
void open_cdrom()
{
__u8 cmd_buff[12];
memset((void *)cmd_buff, 0, 12);
cmd_buff[0] = 0x1B;
cmd_buff[4] = 0x2; // LoEj = 1, Start = 0
send_packet_command(cmd_buff);
}
int main()
{
ioperm(0x170, 8, 1);
/* Ждём готовности устройства и открываем лоток */
wait_while_ready();
open_cdrom();
printf("CD-ROM открыт. Нажмите 'Enter' для закрытия.");
getchar();
/* Закрываем лоток */
close_cdrom();
wait_while_ready();
printf("OK. CD-ROM закрыт.\n");
ioperm(0x170, 8, 0);
return 0;
}
void play_audio()
{
__u8 cmd_buff[12];
/* Воспроизводим фрагмент размером 5000 секторов, начиная с 10-го */
__u32 start_lba = 10; // стартовый сектор
__u16 lba_len = 5000; // длина воспроизводимого участка
memset((void *)cmd_buff, 0, 12);
cmd_buff[0] = 0x45; // код команды PLAY AUDIO
/* Меняем порядок следования байт при помощи макроса __swab32. Этот макрос определён в файле */
start_lba = __swab32(start_lba);
memcpy((void *)(cmd_buff + 2), (void *)&start_lba, 4);
lba_len = __swab16(lba_len);
memcpy((void *)(cmd_buff + 6), (void *)&lba_len, 2);
send_packet_command(cmd_buff);
return;
}
int send_packet_data_command(__u16 data_len, __u8 *cmd_buff)
{
int i;
__u8 status = 0;
__u16 port, a;
port = 0x177;
/* Ожидаем сброса битов BSY и DRQ */
for(;;) {
do {
IN_P_B(status, port);
} while(status & BSY);
if(!(status & DRQ)) break;
}
/* Выбираем устройство Secondary Master */
port = 0x176;
OUT_P_B(0xA0, port);
/* В младший байт счетчика байтов (CL) заносим размер запрашиваемых данных */
port = 0x174; OUT_P_W(data_len, port);
/* В регистр команд записываем код пакетной команды */
port = 0x177; OUT_P_B(0xA0, port);
/* Ждём установки бита DRQ */
for(;;) {
do {
IN_P_B(status, port);
} while(status & BSY);
if(status & DRQ) break;
}
port = 0x170;
/* В регистр данных записываем 12-байтный командный пакет */
for(i = 0; i < 12; i += 2) {
memcpy((void *)&a, (cmd_buff + i), 2);
OUT_P_W(a, port);
}
/* Ждём завершения команды - установленного бита DRQ. Если произошла ошибка - фиксируем этот факт */
port = 0x177;
for(;;) {
do {
IN_P_B(status, port);
} while(status & BSY);
// ошибка выполнения команды!
if(status & ERR) return -1;
if(status & DRQ) break;
}
return 0;
}
int read_inquiry()
{
int i = 0;
__u8 cmd_buff[12];
__u16 inquiry_buff[20]; // буфер для считываемых данных
__u8 data_len = 40; // размер запрашиваемых данных
memset(inquiry_buff, 0, 40);
memset((void *)cmd_buff, 0, 12);
cmd_buff[0] = 0x12; // код команды INQUIRY
cmd_buff[4] = data_len;
/* Посылаем устройству пакетную команду */
if(send_packet_data_command(data_len, cmd_buff) < 0) {
printf("INQUIRY command error\n");
return -1;
}
/* Считываем результат и отображаем его */
for(i = 0; i < 20; i++) IN_P_W(inquiry_buff[i], 0x170);
printf("%s\n", inquiry_buff + 4);
return 0;
}
#define SECT_SIZE 2352 // размер RAW-сектора
int read_cd(__u32 lba)
{
int i = 0, out_f, ret;
__u8 cmd_buff[12];
__u8 buff[SECT_SIZE];
__u16 data_len = SECT_SIZE, a;
memset((void *)buff, 0, sizeof(buff));
memset((void *)cmd_buff, 0, 12);
/* Формируем командный пакет (рис. 8) */
cmd_buff[0] = 0xBE; // код команды READ CD
cmd_buff[1] = 0; // считываем сектор любого типа (Any Type)
cmd_buff[9] = 0xF8; // считываем всю информацию, находящуюся в секторе
cmd_buff[8] = 1; // читаем один сектор
/* Заполняем поле Starting Logical Block Address, при этом меняем порядок расположения байт */
lba = __swab32(lba);
memcpy((cmd_buff + 2), (void *)&lba, 4);
/* Посылаем устройству командный пакет */
if(send_packet_data_command(data_len, cmd_buff) < 0) {
request_sense(); return -1;
}
/* Считываем результат и сохраняем его в файле */
for(i = 0; i < SECT_SIZE; i += 2) {
IN_P_W(a, 0x170);
memcpy((void *)(buff + i), (void *)&a, 2);
}
out_f = open("sector", O_CREAT|O_RDWR, 0600);
write(out_f, buff, sizeof(buff));
return 0;
}
int request_sense()
{
int i = 0;
__u8 cmd_buff[12];
__u8 sense_buff[14];
__u16 a;
memset((void *)cmd_buff, 0, 12);
memset((void *)sense_buff, 0, 14);
/* Формируем пакетную команду REQUEST SENSE. Из блока sense data считываем первые 14 байт – этого нам хватит, чтобы определить
* причину ошибки
*/
cmd_buff[0] = 0x3;
cmd_buff[4] = 14;
/* Посылаем устройству команду и считываем sense data */
if(send_packet_data_command(14, cmd_buff) < 0) exit(-1);
for(i = 0; i < 14; i += 2) {
IN_P_W(a, 0x170);
memcpy((void *)(sense_buff + i), (void *)&a, 2);
}
printf("Sense key - 0x%X\n", sense_buff[2] & 0x0F);
printf("ASC - 0x%X\n", sense_buff[12]);
printf("ASCQ - 0x%X\n", sense_buff[13]);
return 0;
}
00 FF FF FF FF FF FF FF FF FF FF 00 00 15 25 01
LBA = ((Minute * 60 + Second) * 75 + Frame) – 150
struct toc {
__u8 res;
__u8 adr_cntl;
__u8 trk_num; // номер трека
__u8 res1;
__u32 lba; // адрес сектора
} __attribute__ ((packed)) *t;
int read_toc()
{
#define PACKET_LEN 12 // длина пакетной команды
#define READ_TOC 0x43 // код команды READ TOC
#define MAX_TOC_LEN 804 // максимальная длина данных TOC (Format = 00b)
int i = 0;
int total_tracks = 0;
__u8 cmd_buff[PACKET_LEN];
__u8 *data_buff;
__u16 toc_length = 0, a;
/* Формируем пакетную команду. Поле Starting Track содержит 0, по команде READ TOC будет выдана информация обо всех
* треках диска, начиная с первого
*/
memset((void *)cmd_buff, 0, PACKET_LEN);
cmd_buff[0] = READ_TOC;
cmd_buff[6] = 0;
/* Размер области памяти, выделенной для данных TOC */
a = MAX_TOC_LEN;
a = __swab16(a);
memcpy((void *)(cmd_buff + 7), (void *)&a, 2);
data_buff = (__u8 *)malloc(MAX_TOC_LEN);
memset(data_buff, 0, MAX_TOC_LEN);
/* Посылаем устройству пакетную команду */
if(send_packet_data_command(MAX_TOC_LEN, cmd_buff) < 0)
return -1;
/* Считываем результат */
for(i = 0;;i += 2) {
IN_P_W(a, 0x170);
// размер данных TOC
if(i == 0) toc_length = __swab16(a);
if(i > toc_length) break;
memcpy((void *)(data_buff + i), (void *)&a, 2);
}
/* Число треков на диске */
total_tracks = data_buff[3];
/* Отобразим результат */
printf("TOC length - %d\n", toc_length);
printf("First: %d\t", data_buff[2]);
printf("Last: %d\n", total_tracks);
/* Выделим память и скопируем туда дескрипторы треков */
t = (struct toc *)malloc(toc_length);
memcpy((void *)t, (data_buff + 4), toc_length);
free(data_buff);
/* Отобразим результаты */
for(i = 0; i < total_tracks; i++)
printf("track: %d\tlba: %u\n", (i + 1), __swab32((t + i)->lba));
return 0;
}
struct toc {
__u8 res;
__u8 adr_cntl;
__u8 trk_num;
__u8 res1;
__u32 lba;
struct toc *next; // указатель на следующий элемент списка
};
struct toc * read_toc()
{
#define READ_TOC 0x43
static int i = 1;
int n;
__u8 cmd_buff[12];
__u8 data_buff[12];
/* При каждом обращении к диску мы считываем 12 байт – 4 байта заголовка и 8 байт дескриптора трека, номер которого
* задан в поле Starting Track
*/
__u16 buff_size = 12, a;
struct toc *t;
/* Если номер трека превысил 0xAA, выполнение функции прекращается */
if(i > 0xAA) return NULL;
/* Выделяем память для дескриптора трека */
t = (struct toc *)malloc(sizeof(struct toc));
/* Формируем пакетную команду */
memset((void *)cmd_buff, 0, 12);
cmd_buff[0] = READ_TOC;
/* Поле Starting Track содержит номер трека. Этот номер увеличивается при каждом вызове функции */
cmd_buff[6] = i;
/* Размер считываемых данных */
buff_size = __swab16(buff_size);
memcpy((void *)(cmd_buff + 7), (void *)&buff_size, 2);
/* Посылаем устройству пакетную команду */
if(send_packet_data_command(buff_size, cmd_buff) < 0) {
printf("Error read TOC\n");
request_sense();
exit(-1);
}
/* Считываем данные – заголовок и дескриптор трека (рис. 12) */
memset(data_buff, 0, 12);
for(n = 0; n < 12; n += 2) {
IN_P_W(a, 0x170);
memcpy((void *)(data_buff + n), (void *)&a, 2);
}
/* Отобразим размер данных TOC и номер первого и последнего трека */
if (i == 1) {
memcpy((void *)&a, (void *)(data_buff), 2);
printf("TOC lenght - %d\n", __swab16(a));
printf("First: %d\t", data_buff[2]);
printf("Last: %d\n", data_buff[3]);
max_track_num = data_buff[3];
}
/* Копируем дескриптор трека в структуру struct toc */
memcpy((void *)t, (data_buff + 4), 8);
t->lba = __swab32(t->lba);
/* Считываем дескриптор следующего трека. Если треков больше нет, считываем дескриптор Lead-Out области последней сессии. */
i += 1;
if(i == (max_track_num + 1)) i = 0xAA;
t->next = read_toc();
return t;
}
void view_toc(struct toc *t)
{
if(t == NULL) return;
if(t->trk_num == 0xAA) printf("lead out:\t");
else printf("track: %d\t", t->trk_num);
printf("lba: %u\n", t->lba);
view_toc(t->next);
}
struct toc_entry * get_toc_entry(int trk_num, struct toc *t)
{
struct toc_entry *t_entry;
int i = 1;
for(;i < trk_num; i++) t = t->next;
t_entry = (struct toc_entry *) ї
malloc(sizeof(struct toc_entry));
t_entry->start_lba = t->lba;
t_entry->end_lba = t->next->lba;
return t_entry;
}
struct toc_entry {
__u32 start_lba; // стартовый адрес трека
__u32 end_lba; // конечный адрес трека
};
for(i = 0; i < 2352; i += 2) {
IN_P_W(a, 0x170);
a = __swab16(a);
memcpy((void *)(buff + i), (void *)&a, 2);
}
# sox track.cdr track.wav
# oggenc track.wav -b 256 track.ogg
ioctl(int fd, CDROM_SEND_PACKET, struct cdrom_generic_command *);
/* for CDROM_PACKET_COMMAND ioctl */
struct cdrom_generic_command
{
unsigned char cmd[CDROM_PACKET_SIZE];
unsigned char *buffer;
unsigned int buflen;
int stat;
struct request_sense *sense;
unsigned char data_direction;
int quiet;
int timeout;
void *reserved[1];
};
#define CGC_DATA_WRITE 1 // передача данных устройству
#define CGC_DATA_READ 2 // приём данных от устройства
#define CGC_DATA_NONE 3 // нет обмена данными
/* Файл open_close.c */
#include
#include
#include
#include
int main()
{
int fd;
struct cdrom_generic_command cgc;
/* Открываем файл устройства */
fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK);
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
/* Ждём готовность устройства к выполнению пакетной команды. Поле data_direction будет содержать CGC_DATA_NONE, т.к.
* команда не требует передачи данных
*/
cgc.cmd[0] = GPCMD_TEST_UNIT_READY; // см.
cgc.data_direction = CGC_DATA_NONE;
/* Посылаем устройству команду */
ioctl(fd, CDROM_SEND_PACKET, &cgc);
/* Формируем и посылаем устройству пакетную команду, выполняющую открытие лотка CD-ROM. Команда не требует
* передачи данных, поле data_direction содержит CGC_DATA_NONE
*/
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = GPCMD_START_STOP_UNIT;
cgc.cmd[4] = 0x2;
cgc.data_direction = CGC_DATA_NONE;
ioctl(fd, CDROM_SEND_PACKET, &cgc);
printf("CD-ROM открыт. Нажмите ENTER для закрытия");
getchar();
/* Закрываем лоток */
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = GPCMD_START_STOP_UNIT;
cgc.cmd[4] = 0x3;
cgc.data_direction = CGC_DATA_NONE;
ioctl(fd, CDROM_SEND_PACKET, &cgc);
printf("CD-ROM закрыт\n");
return 0;
}
int read_cd(__u32 lba)
{
int fd, out_f;
struct cdrom_generic_command cgc;
struct request_sense sense;
#define QSCH_LEN 16 // размер данных Q-субканала
/* Буфер для считанных данных */
__u8 blk_buff[CD_FRAMESIZE_RAW + QSCH_LEN];
/* Открываем файл устройства */
fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK);
/* Ожидаем готовность устройства к принятию пакетной команды */
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(sense));
cgc.cmd[0] = GPCMD_TEST_UNIT_READY;
cgc.data_direction = CGC_DATA_NONE;
cgc.sense = &sense;
if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) {
perror("ioctl");
printf("Sense key - 0x%02x\n", sense.sense_key);
printf("ASC - 0x%02x\n", sense.asc);
printf("ASCQ - 0x%02x\n", sense.ascq);
return -1;
}
/* Формируем команду READ CD */
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(sense));
memset(blk_buff, 0, sizeof(blk_buff));
cgc.cmd[0] = GPCMD_READ_CD;
cgc.cmd[1] = 0; // считывать сектор любого типа
cgc.cmd[8] = 1; // считывать один сектор
cgc.cmd[9] = 0xF8; // из сектора считывать все данные (табл. 99 INF-8010i)
cgc.cmd[10] = 2; // считывать данные Q-субканала в общем потоке данных
printf("lba - %d\n", lba);
lba = __swab32(lba);
memcpy((cgc.cmd + 2), (void *)&lba, 4);
// направление данных – от устройства
cgc.data_direction = CGC_DATA_READ;
cgc.buffer = blk_buff; // указатель на буфер для данных
cgc.buflen = CD_FRAMESIZE_RAW + QSCH_LEN; // размер буфера
cgc.sense = &sense;
/* Отправляем устройству команду */
if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) {
perror("ioctl");
printf("Sense key - 0x%02x\n", sense.sense_key);
printf("ASC - 0x%02x\n", sense.asc);
printf("ASCQ - 0x%02x\n", sense.ascq);
return -1;
}
/* Записываем в файл sector данные основного канала */
out_f = open("sector", O_CREAT|O_RDWR, 0600);
write(out_f, blk_buff, CD_FRAMESIZE_RAW);
/* В файл qsch - данные Q-субканала */
out_f = open("qsch", O_CREAT|O_RDWR, 0600);
write(out_f, blk_buff + CD_FRAMESIZE_RAW, QSCH_LEN);
/* Отобразим координаты сектора, находящиеся в заголовке
* Header
*/
printf("Minute - %x\n", blk_buff[CD_SYNC_SIZE]);
printf("Second - %x\n", blk_buff[CD_SYNC_SIZE + 1]);
printf("Frame - %x\n", blk_buff[CD_SYNC_SIZE + 2]);
printf("Mode - %d\n", blk_buff[CD_SYNC_SIZE + 3]);
close(fd); close(out_f);
return 0;
}
struct toc {
__u8 snum; // номер сессии
__u8 ctrl :4; // Control
__u8 adr :4; // ADR
__u8 tno; // номер трека (всегда 0)
__u8 point; // POINT
__u8 min; // AMIN
__u8 sec; // ASEC
__u8 frame; // AFRAME
__u8 zero; // 0
__u8 pmin; // PMIN
__u8 psec; // PSEC
__u8 pframe; // PFRAME
} __attribute__ ((packed));
int read_toc()
{
int i = 1;
// буфер для хранения результатов чтения TOC
__u8 *data_buff;
/* Задаем размер области памяти для хранения данных ТОС. Т.к. заранее объем данных нам не известен, то зададим
* маскимальное значение - 64 Кб
*/
__u16 buff_size = 0xFFFF;
__u16 toc_data_length = 0; // длина записей TOC
__u32 lba;
int toc_entries = 0; // число записей в TOC
struct cdrom_generic_command cgc;
struct request_sense sense;
struct toc *t;
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(sense));
/* Выделяем память для содержимого TOC */
data_buff = (__u8 *)malloc(buff_size);
memset(data_buff, 0, buff_size);
/* Формируем пакетную команду для чтения TOC */
cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
cgc.cmd[2] = 2; // поле Format Field = 10b
cgc.sense = &sense;
cgc.data_direction = CGC_DATA_READ;
cgc.buffer = data_buff;
cgc.buflen = buff_size;
buff_size = __swab16(buff_size);
memcpy((void *)(cgc.cmd + 7), (void *)&buff_size, 2);
/* Посылаем командный пакет устройству */
if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) {
perror("ioctl");
printf("Sense key - 0x%02x\n", sense.sense_key);
printf("ASC - 0x%02x\n", sense.asc);
printf("ASCQ - 0x%02x\n", sense.ascq);
return -1;
}
/* Определяем размер данных TOC */
memcpy(&toc_data_length, data_buff, 2);
toc_data_length = __swab16(toc_data_length);
printf("TOC data length - %d\n", toc_data_length);
/* Вычисляем число записей в содержимом TOC (cм. рис.13) */
toc_entries = (toc_data_length - 2)/11;
printf("TOC entries - %d\n", toc_entries);
/* Номер первой и последней сессии */
printf("First: %d\t", data_buff[2]);
printf("Last: %d\n", data_buff[3]);
/* Выделяем память для данных TOC, размер этих данных уже точно известен */
t = (struct toc *)malloc(toc_data_length);
memset((void *)t, 0, toc_data_length);
/* Копируем данные TOC из буфера data_buff и освобождаем выделенную под него память */
memcpy((void *)t, data_buff + 4, toc_data_length);
free(data_buff);
/* Отображаем результаты чтения TOC */
printf("Entry\tSession\tPoint\tMin\tSec\tFrame\tPMin\tPsec\tPFrame\tLBA\n");
for(i = 0; i < toc_entries; i++) {
printf("%d\t", i);
printf("%d\t", (t + i)->snum);
printf("%X\t", (t + i)->point);
printf("%d\t", (t + i)->min);
printf("%d\t", (t + i)->sec);
printf("%d\t", (t + i)->frame);
printf("%d\t", (t + i)->pmin);
printf("%d\t", (t + i)->psec);
printf("%d\t", (t + i)->pframe);
/* Пересчитываем координаты из MSF в LBA при помощи макроса MSF2LBA */
#define MSF2LBA(Min, Sec, Frame) \
(((Min * 60 + Sec) * 75 + Frame) - 150)
lba = MSF2LBA((t + i)->pmin, (t + i)->psec, (t + i)->pframe);
printf("%u\n", lba);
}
free(t);
return 0;
}
# ./read_cd_full > toc
int seek(__u32 lba)
{
struct cdrom_generic_command cgc;
struct request_sense sense;
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(sense));
/* Формируем пакетную команду */
cgc.cmd[0] = GPCMD_SEEK; // код команды SEEK (0x2B)
cgc.sense = &sense;
cgc.data_direction = CGC_DATA_NONE; // нет обмена данными
/* Координаты сектора */
lba = __swab32(lba);
memcpy((void *)(cgc.cmd + 2), (void *)&lba, 4);
if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) {
perror("ioctl");
printf("Sense key - 0x%02x\n", sense.sense_key);
printf("ASC - 0x%02x\n", sense.asc);
printf("ASCQ - 0x%02x\n", sense.ascq);
return -1;
}
return 0;
}
struct current_position {
__u8 dfc; // Data Format Code
__u8 ctrl :4; // Control
__u8 adr :4; // ADR
__u8 tno; // Track number
__u8 ino; // Index number
__u32 a_addr; // Absolute CD-ROM Address
__u32 r_addr; // Track Relative CD-ROM Address
} __attribute__ ((packed)) cur_pos;
void read_subch()
{
// размер запрашиваемых данных
// (4 байта заголовка + 12 байт данных)
__u16 buff_size = 16;
// указатель на буфер для данных Q-субканала
__u8 *data_buff;
// размер блока данных Q-субканала
__u16 sch_length = 0;
struct cdrom_generic_command cgc;
struct request_sense sense;
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(struct request_sense));
/* Выделяем память */
data_buff = (__u8 *)malloc(buff_size);
memset(data_buff, 0, buff_size);
/* Формируем пакетную команду */
cgc.cmd[0] = GPCMD_READ_SUBCHANNEL; // код команды
cgc.cmd[2] = 0x40; // бит SUBQ установлен – данные Q-субканала считываются
cgc.cmd[3] = 1; // читаем данные о текущей позиции
cgc.sense = &sense;
cgc.data_direction = CGC_DATA_READ; // направление передачи данных
cgc.buffer = data_buff;
cgc.buflen = buff_size;
buff_size = __swab16(buff_size);
memcpy((void *)(cgc.cmd + 7), (void *)&buff_size, 2);
if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) {
perror("ioctl");
printf("Sense key - 0x%02x\n", sense.sense_key);
printf("ASC - 0x%02x\n", sense.asc);
printf("ASCQ - 0x%02x\n", sense.ascq);
exit(-1);
}
/* Размер считанных данных */
memcpy(&sch_length, data_buff + 2, 2);
sch_length = __swab16(sch_length);
printf("Sub-channel data length - %d\n", sch_length);
memset((void *)&cur_pos, 0, 12);
memcpy((void *)&cur_pos, data_buff + 4, 12);
printf("Data format code - %d\n", cur_pos.dfc);
printf("ADR - %d\n", cur_pos.adr);
printf("Track number - %d\n", cur_pos.tno);
/* Текущая позиция оптического элемента */
cur_pos.a_addr = __swab32(cur_pos.a_addr);
printf("Current position - %u\n", cur_pos.a_addr);
/* Освобождаем память и выходим */
free(data_buff);
return;
}
ioctl(fd, CDROMEJECT); // открыть лоток CD-ROM
ioctl(fd, CDROMCLOSETRAY); // закрыть его
#define CD_DEVICE "/dev/cdrom"
int read_toc()
{
int fd, i;
/* Структура struct cdrom_tochdr содержит заголовок содержимого TOC, структура struct cdrom_tocentry – дескриптор трека.
* Обе структуры определены в файле
*/
struct cdrom_tochdr hdr;
struct cdrom_tocentry toc;
/* Открываем файл устройства */
fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK);
/* Считываем заголовок TOC */
memset((void *)&hdr, 0, sizeof(struct cdrom_tochdr));
ioctl(fd, CDROMREADTOCHDR, &hdr);
/* Поле cdth_trk0 структуры hdr содержит номер первого трека, а поле cdth_trk1 – номер последнего трека. Отобразим эти значения */
printf("First: %d\t", hdr.cdth_trk0);
printf("Last: %d\n", hdr.cdth_trk1);
#define FIRST hdr.cdth_trk0
#define LAST hdr.cdth_trk1
/* Определим формат, в котором мы хотим получить координаты трека. Для этого используется поле cdte_format структуры struct cdrom_tocentry */
toc.cdte_format = CDROM_LBA;
/* Задавая в поле cdte_track структуры struct cdrom_tocentry последовательно номера треков от первого до последнего,
* мы определяем их стартовые координаты в формате LBA
*/
for(i = FIRST; i <= LAST; i++) {
toc.cdte_track = i;
ioctl(fd, CDROMREADTOCENTRY, &toc);
printf("track: %d\t", i); // номер трека
// LBA адрес
printf("lba: %d\n", toc.cdte_addr.lba);
}
return 0;
}
#define CD_DEVICE "/dev/cdrom"
int main()
{
int fd, current_track;
/* Координаты текущего сектора находятся в Q-субканале. Для чтения данных Q-субканала используется спецификатор CDROMSUBCHNL,
* считанные данные помещаются в структуру struct cdrom_subchnl (см. )
*/
struct cdrom_subchnl sc;
/* Открываем файл устройства */
fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK);
/* Проверяем тип компакт-диска. Это должен быть Audio-CD */
if(ioctl(fd, CDROM_DISC_STATUS) != CDS_AUDIO) {
printf("I need Audio_CD!\n");
return 0;
}
/* Считывание координат производим в бесконечном цикле */
for(;;) {
/* Задаём формат адреса LBA и считываем координаты сектора */
sc.cdsc_format = CDROM_LBA;
ioctl(fd, CDROMSUBCHNL, &sc);
current_track = sc.cdsc_trk;
/* Отображаем данные о текущем треке и координате в формате LBA */
printf("Track: %d\t", current_track);
printf("LBA: %d\t", sc.cdsc_absaddr.lba);
/* То же самое - для формата MSF */
sc.cdsc_format = CDROM_MSF;
ioctl(fd, CDROMSUBCHNL, &sc);
printf("MSF: %d %d %d\n", sc.cdsc_absaddr.msf.minute, sc.cdsc_absaddr.msf.second, sc.cdsc_absaddr.msf.frame);
/* Ждем две секунды и повторяем. Выход по Ctrl-C */
sleep(2);
}
return 0;
}
int read_cdda_track()
{
int fd, out, n;
__u32 i, start_lba, end_lba;
__u16 buff[CD_FRAMESIZE_RAW/2];
struct cdrom_tochdr hdr;
struct cdrom_tocentry toc;
/* Структура struct cdrom_read_audio используется вместе с IOCTL-командой CDROMREADAUDIO () */
struct cdrom_read_audio cda;
/* Открываем устройство */
fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK);
/* Определяем количество треков на Audio-CD */
memset((void *)&hdr, 0, sizeof(struct cdrom_tochdr));
ioctl(fd, CDROMREADTOCHDR, &hdr);
printf("First: %d\t", hdr.cdth_trk0);
printf("Last: %d\n", hdr.cdth_trk1);
#define FIRST hdr.cdth_trk0
#define LAST hdr.cdth_trk1
/* Вводим номер трека, который мы собираемся считать, и проверяем правильность введенного значения */
printf("Enter track number: ");
scanf("%d", &n);
if((n < 1) || (n > LAST)) {
printf("Wrong track number\n");
return -1;
}
/* Задаем формат адреса */
toc.cdte_format = CDROM_LBA;
/* Определяем стартовый адрес трека (в LBA формате) */
toc.cdte_track = n;
ioctl(fd, CDROMREADTOCENTRY, &toc);
start_lba = toc.cdte_addr.lba;
/* Конечный адрес трека. Если выбран последний трек на диске, то необходимо определить начало lead-out области.
* Для этого в поле номера трека указываем 0xAA
*/
if(n == LAST) toc.cdte_track = CDROM_LEADOUT;
else toc.cdte_track = n + 1;
ioctl(fd, CDROMREADTOCENTRY, &toc);
end_lba = toc.cdte_addr.lba;
/* Считанный трек сохраним в файле track.cdr */
out = open("track.cdr",O_CREAT|O_RDWR,0600);
/* Заполним поля структуры struct cdrom_read_audio */
cda.addr_format = CDROM_LBA; // формат адреса
cda.nframes = 1; // сколько секторов считываем за одно обращение к диску
cda.buf = (__u8 *)&buff[0]; // адрес буфера для считанных данных
/* Цикл чтения секторов */
for(i = start_lba; i < end_lba; i++) {
memset(buff, 0, sizeof(buff));
cda.addr.lba = i; // адрес считываемого сектора
printf("lba: %u\n", i);
/* Считываем сектор c аудиоданными и меняем местами соседние байты */
ioctl(fd, CDROMREADAUDIO, &cda);
for(n = 0; n < CD_FRAMESIZE_RAW/2; n++)
buff[n] = __swab16(buff[n]);
/* Сохраняем считанный сектор в файл */
write(out, (__u8 *)buff, CD_FRAMESIZE_RAW);
}
close(fd); close(out);
return 0;
}
# sox track.cdr track.wav
# oggenc track.wav -q 6 track.ogg
Bugtraq стр. 85
if ( !empty($HTTP_GET_VARS['op']) ) {
$op = $HTTP_GET_VARS['op'];
}
if ( !empty($HTTP_POST_VARS['op']) ) {
$op = $HTTP_POST_VARS['op'];
}
Особенности запуска внешних команд из ASP-страниц
Иван Коробко
<%Script Language=”VBScript”%>
<%Script Language=”JScript”%>
Пример 1:
<%@ Language=VBScript CODEPAGE=1251%>
Заголовок страницы
…
<%
…
Response.write variable ‘ отображение на экране содержимого переменной
%>
Пример 2:
Set Wshell = CreateObject("Wscript.shell")
Set Proc = Wshell.Exec("application.exe")
' Ждать, пока не завершится выполнение программы
Do While Proc.Status = 0
WScript.Sleep 100
Loop
Set Wshell = Nothing
MsgBox Proc.StdOut.ReadAll
Пример 3:
Set Wshell = CreateObject("Wscript.shell")
Set Proc = Wshell.Run("application.exe")
Set Wshell = Nothing
MsgBox Proc
%comspec% /c cmd_util.exe
Пример 4:
Set objArgs=Wscript.Arguments
t=”Количество заданных параметров - ” & Wscript.Arguments.Count & chr(13) & “Параметры:” & chr(13)
For Each arg in objArgs
t = t & arg & chr(13)
Next
MsgBox t
Пример 5:
Set objArgs=Wscript.Arguments
Coun = Wscript.Arguments.Count
t="Количество заданных параметров - " & Coun & chr(13) & "Параметры:" & chr(13)
For i=0 to Coun-1
t = t & i+1 & ": "& objArgs(i) & chr(13)
Next
MsgBox t
Пример 6:
Set objArgs=Wscript.Arguments
Msgbox objArgs(2) ' Чтение третьего аргумента.
Пример 7:
Set objArgs=Wscript.Arguments
Coun = Wscript.Arguments.Count
q = InputBox (“Введите номер считываемого аргумента”, “Чтение номера аргумента”)-1
t = ””
if q> Coun then
t= objArgs(q)
else
t=”ERROR”
End if
Msgbox t
PHP 5 – пришествие неизбежно
Кирилл Сухов
name;
}
function setName($name) {
$this->name = $name;
}
function foo($name) {
$this->setName($name);
}
}
function changeName($person, $name) {
$foo->setName($name);
}
$person = new foo("Bill");
changeName($person, "John");
print $person->getName();
?>
class foo {
function __clone() {
print "Cloned!";
}
}
$obj =new foo();
clone $obj;
?>
message = $message;
}
$this->code = $code;
$this->file = __FILE__; // of throw clause
$this->line = __LINE__; // of throw clause
$this->trace = debug_backtrace();
$this->string = StringFormat($this);
}
protected $message = 'Unknown exception'; // exception message
protected $code = 0; // user defined exception code
protected $file; // source filename of exception
protected $line; // source line of exception
private $trace; // backtrace of exception
private $string; // internal only!!
final function getMessage() {
return $this->message;
}
final function getCode() {
return $this->code;
}
final function getFile() {
return $this->file;
}
?>
$client = new SoapClient(null, array(
'location' => "http://localhost/soap.php",
'uri' => "http://test-uri/",
'style' => SOAP_DOCUMENT,
'use' => SOAP_LITERAL));
$client = new SoapClient("some.wsdl");
\n";
} else {
while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);
}
?>
name = "Sterling";
echo $c->name;
?>