From: "Thorsten Erdmann" Newsgroups: comp.os.msdos.djgpp Subject: DJGPP's filesystem extension Date: Thu, 20 Jul 2000 18:33:41 +0200 Organization: AddCom AG Lines: 131 Message-ID: <8l7agq$t7f$1@riker.addcom.de> NNTP-Posting-Host: 62.96.142.165 X-Trace: riker.addcom.de 964111706 29935 62.96.142.165 (20 Jul 2000 16:48:26 GMT) X-Complaints-To: news AT news DOT addcom DOT de NNTP-Posting-Date: 20 Jul 2000 16:48:26 GMT X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.00.2014.211 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2014.211 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Hi, I have some problems hooking an own filesystem driver to DJGPPs filesystem extension. All works fine except the close function. It works for a few times but after a while the program crashes on a file close. I stepped through my tiny close routine and it runs until the return statement. But after that return there is the crash, so that the calling program never gets control back. I think the crash happens when I open a file for a second time. My fs driver is a Joliet driver for an MP3 player. When I read all the ID3 tags from all files on the CD it works fine. If I rescan the same files, e.g. because I had opened and closed the CD drive, the crash happens at the first file read. In the following you see the open and close functions. Maybe you see whats wrong. I think it has something to do with that DOS file handle. Please help. bye Thorsten /**********************************************************************/ /* lfn_fopen : open file */ /**------------------------------------------------------------------**/ /* input : pathname - search pattern, may include path */ /* attrib - file mode */ /* output: file descriptor */ /**********************************************************************/ int lfn_open(char *pathname, int attrib) { _MYFILE *f; int drive,fd; char *p,*pa,*fname,ch; long lbn; /* is there a drive letter? */ if (pathname[1]==':') { if (!isalpha(pathname[0])) return 0; drive=toupper(pathname[0])-'A'; pa=pathname+2; } else { pa=pathname; drive=currdrive; } if (isDriveCD(drive)<0) return -2; /* drive is not CD, so let DOS do the rest */ /* Get a file descriptor we can use */ if ((fd = __FSEXT_alloc_fd(lfn_handler))<0) return -1; /* here comes some initialization stuff */ /* [...]*/ /* store file descriptor so we can lookup it up quickly later. */ __FSEXT_set_data(fd, f); return fd; } /**********************************************************************/ /* lfn_fclose : close file */ /**------------------------------------------------------------------**/ /* input : fd - file descriptor */ /* output: zero if ok, else feof */ /**********************************************************************/ int lfn_close(int fd) { _MYFILE *f; if (!(f=__FSEXT_get_data(fd))) return -2; free(f->sector); free(f); _dos_close(fd); return 0; } int lfn_handler(__FSEXT_Fnumber op, int *rv, va_list args) { char* path; int attrib; void* buffer; long size; int fd; _MYFILE* f; switch (op) { case __FSEXT_open: /* open file */ path = va_arg(args, char*); attrib = va_arg(args, int); *rv = lfn_open(path,attrib); if (*rv==-2) return 0; return 1; case __FSEXT_read: /* Read from file. */ fd = va_arg(args, int); buffer = va_arg(args, void*); size = va_arg(args, size_t); *rv = lfn_read(fd,buffer,size); if (*rv == -2) return 0; return 1; case __FSEXT_close: /* close file */ fd = va_arg(args, int); *rv = lfn_close(fd); if (*rv == -2) return 0; return 1; case __FSEXT_lseek: /* seek file */ fd = va_arg(args, int); size = va_arg(args, long); attrib = va_arg(args, int); *rv = lfn_lseek(fd,size,attrib); if (*rv == -2) return 0; return 1; } return 0; }