/** * query those files which are downloading from share memory to get status info * generally , conf_name is /etc/shm.conf for CGI , should have a version for Socket query int QueryShmForClient(DownloadFileInfoList *DList ,const char *conf_name , const char *client_ip); **/ int QueryShm(DownloadFileInfoList *DList, const char *conf_name) //etc/shm.conf
{ char ptr[128]; FILE *fp = NULL; int fd = 0; char *seg = NULL; key_t key; int shmid; //share memory ID
int semid; //semaphore ID
void *segptr = NULL; int downloading_num = 0; int rc = 0; assert(DList); fp = fopen(conf_name,"rt"); if(!fp) { fatal_err("can't open /etc/shm.conf\n"); LogMesg("can't open /etc/shm.conf , maybe /etc/shm.conf doesn't exist any longer \n"); return SERVER_CANNOT_OPEN_SHM_CONF; } assert(fp); fd = fileno(fp); //lockf(fd,F_LOCK,0);
readw_lock(fd,0,SEEK_SET,0); while(fgets(ptr,sizeof(ptr),fp)) { //get a line
DownloadFileInfo *doingJob_entry = (DownloadFileInfo *)malloc(sizeof(DownloadFileInfo)); //assert(doingJob_entry);
if(!doingJob_entry) { fatal_err("can't malloc DownloadFileInfo struct entry \n"); continue; } jprintf("ptr = %s\n",ptr); seg = strrchr(ptr,':'); if(seg == NULL) { jprintf("can't find \':\' in %s , maybe this line in shm.conf has problem ,please check %s\n",ptr,SHM_CONF); continue; } *seg = '\0'; //now ptr should be fullpathname ,ie, /harddisk/hd~2/data/public/bob/linux-2.4.21.tar.gz
//---------------------------Start reading share memory----------------------------
key = ftok(ptr,0); // ----------------------------------semaphore mutex lock -------------------------------------
#if 0 semid = open_sem(key); //get a ID of a existing semaphore set
if(semid < 0) { fatal_err("get semaphore failure , job name (%s) \n",ptr); continue; } rc = lock_sem(semid ,0); if(rc < 0) { fatal_err("Sorry ,lock failed for(%s) \n",ptr); continue; } jprintf("haha , you have get the mutex lock , you can read the share memory segment !\n"); #endif // ----------------------------------------------------------------------------------------------
if((shmid = shmget(key, SEGSIZE, 0444)) == -1) { fatal_err("can't get share memory ,key(%s) \n",key); LogMesg("the key (%s) of file (%s) 's share memory looks that has problem(shmget error ) ,please check \n",key,SHM_CONF); //return SERVER_SHMGET_FAIL;
continue; } else { jprintf("shmid = %d\n",shmid); jprintf("has attached memory segment\n"); } /* Attach (map) the shared memory segment into the current process */ if((segptr = shmat(shmid, 0, 0)) == NULL) { fatal_err("can't shmat share memory ,key (%s) \n",key); LogMesg("the key (%s) of file (%s) 's share memory looks that has problem(shmat error ) ,please check \n",key,SHM_CONF); //return SERVER_SHMAT_ERROR;
continue; } //memcpy(doingJob_entry,(DownloadFileInfo *)segptr,sizeof(DownloadFileInfo)); ////fill the doingJob_entry , if problem ,single assign ,bob 2005-12-29 10:51
*doingJob_entry = *((DownloadFileInfo *)segptr); shmdt(segptr); //unlock the mutex lock
#if 0 unlock_sem(semid,0); #endif AddDownloadFileInfoList(DList,doingJob_entry); //add the node into the List
downloading_num++; } //endof while(fgets(ptr,sizeof(ptr),fp))
//lockf(fd,F_ULOCK,0);
un_lock(fd,0,SEEK_SET,0); fclose(fp); if(downloading_num==0) { jprintf("there is no job downloading in share memory \n"); } else { jprintf("there is %d files downloading \n",downloading_num); } return 0; }
|