?? usb.c
字號:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// This procedure let us mount the usb device autoly//// 2008-8-13 //// philip/////////////////////////////////////////////////////////////////////////#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <sys/mount.h>#include <unistd.h>#include <pthread.h>#define USB_DISK_MP "/tmp/usbdisk"#define FILE_DEV_CHECK "/proc/scsi/scsi" //用來檢測設備數和類型#define FILE_DISC_PARTS_CHECK "/proc/partitions" //用來檢測設備的分區情況#define FILE_DEV_STATU_TEMPL "/proc/scsi/usb-storage-%d/%d" //用來檢測某一設備是否在插入狀態#define FILE_MOUNT_CHECK "/proc/mounts" //用來檢測設備是否被mount#define MAX_NAME_LEN 64
#define MAX_PART_NUM 6 //最多允許6個分區typedef struct s_scsi_usb_dev
{
int type; /*1 cdrom 2 disk */
int index; /*like host0 host1*/
char file_statu[MAX_NAME_LEN]; /*like "/proc/scsi/usb-storage-%d/%d"*/
char devfile_parts[MAX_PART_NUM][MAX_NAME_LEN]; /*存儲每個分區的設備文件*/
char mount_path[MAX_PART_NUM][MAX_NAME_LEN]; /*與上面對應的mount點*/
int part_num; //分區數
struct s_scsi_usb_dev * next_dev; //指向下一個備
} SCSI_USB_DEV;static SCSI_USB_DEV * f_first_dev = NULL;void CLEAR_DEV(void)
{
SCSI_USB_DEV * cur_dev = f_first_dev;
SCSI_USB_DEV * tmp_dev;
while (cur_dev)
{
tmp_dev = cur_dev;
cur_dev = cur_dev->next_dev;
free(tmp_dev);
}
f_first_dev = NULL;
}int INIT_DEV(SCSI_USB_DEV * dev, int index, char * type)
{
dev->index = index;
sprintf(dev->file_statu, FILE_DEV_STATU_TEMPL, index, index);
dev->type = 2;
dev->part_num = CHECK_PARTS(dev);
return 1;
}int CHECK_PARTS(SCSI_USB_DEV * dev)
{
char buf[1024];
char hoststr[16];
int fd,len;
int part_num = 0;
char * line;
char * delim="\n";
char * strtok_tmp_ptr;
char * seek;
char * part_blocks;
fd = open(FILE_DISC_PARTS_CHECK, O_RDONLY);
if( fd > 0 )
{
len = read(fd, buf, sizeof(buf));
close(fd);
if (len > 0)
{
sprintf(hoststr,"scsi/host%d", dev->index);
line = strtok_r(buf, delim, &strtok_tmp_ptr);
while(line)
{
seek = strstr(line, hoststr);
if (seek)
{
part_blocks = seek - 3;
if (strncmp(part_blocks, " 1 ", 3))
{//not extend part
sprintf(dev->devfile_parts[part_num],"/dev/%s", seek);
sprintf(dev->mount_path[part_num], USB_DISK_MP"/disk%d/part%d",dev->index,part_num); printf("%s\n",dev->mount_path[part_num]);
part_num ++;
if (part_num == MAX_PART_NUM)
{
break;//too many parts ignore
}
}
}
line = strtok_r(NULL, delim, &strtok_tmp_ptr);
}
}
}
else
{
printf("error ! can't find /proc/partitions files\n");
}
return part_num;
}int ADD_DEV(SCSI_USB_DEV * dev)
{
if(f_first_dev)
{
dev->next_dev = f_first_dev;
f_first_dev = dev;
}
else
{
f_first_dev = dev;
dev->next_dev = NULL;
}
return 1;
}void find_device(){ char buf[1024];
int fd;
int len;
int dev_num = 0;
char * seek = NULL;
SCSI_USB_DEV * new_dev;
CLEAR_DEV();
fd = open(FILE_DEV_CHECK, O_RDONLY); if(fd > 0) { len = read(fd, buf, sizeof(buf));
close(fd);
if ( len > 0 )
{
seek = buf;
while(seek)
{
seek = strstr(seek, "Host: scsi");
if (seek)
{
seek += strlen( "Host: scsi");
seek = strstr(seek, "Type:");
if (seek)
{
seek += strlen("Type:");
while(*seek == ' ') seek++;
new_dev = malloc(sizeof(SCSI_USB_DEV));
INIT_DEV(new_dev, dev_num, seek);
ADD_DEV(new_dev);
dev_num ++;
}
}
}//while
printf("dev_num = %d\n", dev_num);
} } else{ printf("error ! can't find /proc/scsi/scis file!\n"); }}int check_attach(SCSI_USB_DEV * dev)
{//檢測設備是否連接
//linux中只要設備被插入過就會記住該設備
//只能通過Attached來判斷是否連接
char buf[512];
int fd;
int len;
char * seek;
fd = open(dev->file_statu, O_RDONLY);
if( fd > 0 )
{
len = read(fd, buf, sizeof(buf));
close(fd);
if ( len > 0 )
{
seek = strstr(buf, "Attached:");
if (seek)
{
seek += strlen( "Attached:");
while(*seek == ' ') seek++;
return *seek=='Y';
}
}
}
else
{
perror(dev->file_statu);
}
return 0;
}int do_mount(SCSI_USB_DEV * dev)
{
int i = 0;
char fstype[10];
unsigned long mountflags=0;
char mount_data[30];
char tmpdir[50];
if (dev->type == 2)
{
sprintf(tmpdir, USB_DISK_MP"/disk%d", dev->index);
mkdir(tmpdir, 0777);
strcpy(fstype, "vfat");
mountflags= 0xc0ed0000;
strcpy(mount_data,"codepage=936,iocharset=gb2312");
if (dev->part_num > 1)
i ++; /*if disk ignore first part disc*/
for(; i<dev->part_num; i++) /*if disk ignore first part disc*/
{
mkdir(dev->mount_path[i], 0777);
if (mount(dev->devfile_parts[i], dev->mount_path[i], fstype ,mountflags, mount_data)== 0)
{
printf("mount %s %s success\n", dev->devfile_parts[i], dev->mount_path[i]);
//Do_USB_Disk_Update(dev->mount_path[i]);
}
else
{
rmdir(dev->mount_path[i]);
printf("mount %s %s failed\n", dev->devfile_parts[i], dev->mount_path[i]);
}
}
}
else
{
return 0;
}
return 1;
}
static int do_umount(SCSI_USB_DEV * dev)
{
int i = 0;
char tmpdir[50];
if(dev->type == 2)
{
if (dev->part_num > 1)
i ++; /*if disk ignore first part disc*/
for(; i<dev->part_num; i++)
{
if (umount(dev->mount_path[i]) == 0)
{
printf("umount %s success\n", dev->devfile_parts[i]);
remove(dev->mount_path[i]);
}
else
{
printf("umount %s failed\n", dev->devfile_parts[i]);
}
}
sprintf(tmpdir, USB_DISK_MP"/disk%d", dev->index);
remove(tmpdir);
}
return 1;
}
int check_mount(SCSI_USB_DEV * dev)
{
char buf[1024];
int fd;
int len;
char * seek;
int i = 0;
fd = open(FILE_MOUNT_CHECK, O_RDONLY);
if( fd > 0 )
{
len = read(fd, buf, sizeof(buf));
close(fd);
if ( len > 0 )
{
buf[len] = '\0';
if(dev->type == 2 && dev->part_num > 1) i ++; /*if disk ignore first part disc*/
for(; i<dev->part_num; i++)
{
seek = strstr(buf, dev->devfile_parts[i]);
if (seek!=NULL) return 1;/*have one part mounted return 1*/
}
}
}
else
{
printf("error ! can't find /proc/mounts file!\n");
}
return 0;
}int process_dev(SCSI_USB_DEV * dev)
{
if (check_attach(dev))//檢測設備是否插上
{
if (!check_mount(dev))//檢測設備是否mount上了
{
do_mount(dev);
}
}
else
{
if (check_mount(dev))
{
do_umount(dev);
}
}
return 1;
}int main(int argc , char **argv){ SCSI_USB_DEV * cur_dev = NULL; mkdir(USB_DISK_MP, 0777); while( 1 ) { find_device(); cur_dev = f_first_dev;
while (cur_dev)
{
process_dev(cur_dev);//對每個設備進行處理
cur_dev = cur_dev->next_dev;
} sleep(10); } return 0 ;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -