| delorie.com/archives/browse.cgi | search |
| X-Authentication-Warning: | delorie.com: mail set sender to djgpp-bounces using -f |
| X-Received: | by 10.224.172.200 with SMTP id m8mr8380600qaz.0.1364320776978; |
| Tue, 26 Mar 2013 10:59:36 -0700 (PDT) | |
| X-Received: | by 10.49.30.100 with SMTP id r4mr1120857qeh.32.1364320776942; Tue, |
| 26 Mar 2013 10:59:36 -0700 (PDT) | |
| Newsgroups: | comp.os.msdos.djgpp |
| Date: | Tue, 26 Mar 2013 10:59:36 -0700 (PDT) |
| In-Reply-To: | <D85EE936F5F24E8E8E2EA7C8C3FB79C5@dev.null> |
| Complaints-To: | groups-abuse AT google DOT com |
| Injection-Info: | glegroupsg2000goo.googlegroups.com; posting-host=2.173.27.66; posting-account=v5xbdQoAAAAOGc9Ccc-kLZyobvPlN3Qr |
| NNTP-Posting-Host: | 2.173.27.66 |
| References: | <261476b1-c137-495d-95df-a92075cd9960 AT googlegroups DOT com> |
| <2245ebea-be44-4a40-8b2f-7ef5e0e67157 AT googlegroups DOT com> <D85EE936F5F24E8E8E2EA7C8C3FB79C5 AT dev DOT null> | |
| User-Agent: | G2/1.0 |
| MIME-Version: | 1.0 |
| Message-ID: | <5f806b56-af98-4f72-8984-a944be9348a4@googlegroups.com> |
| Subject: | Re: DJGPP scandir and alphasort example code |
| From: | Georg Potthast <dosusb AT googlemail DOT com> |
| Cc: | djgpp AT delorie DOT com |
| Injection-Date: | Tue, 26 Mar 2013 17:59:36 +0000 |
| Bytes: | 3859 |
| Lines: | 99 |
| To: | djgpp AT delorie DOT com |
| DJ-Gateway: | from newsgroup comp.os.msdos.djgpp |
| X-MIME-Autoconverted: | from quoted-printable to 8bit by delorie.com id r2QIF241015697 |
| Reply-To: | djgpp AT delorie DOT com |
| Errors-To: | nobody AT delorie DOT com |
| X-Mailing-List: | djgpp AT delorie DOT com |
| X-Unsubscribes-To: | listserv AT delorie DOT com |
Am Dienstag, 26. März 2013 16:46:34 UTC+1 schrieb Gisle Vanem:
> "RayeR" <glaux AT centrum DOT cz> wrote:
>
>
>
> > App stack: [0009d688..0001d68c] Exceptn stack: [0001d59c..0001b65c]
>
> >
>
> > Call frame traceback EIPs:
>
> > 0x00004254
>
> > 0x00001ffb
>
> > 0x00003cd4
>
> >
>
> > C:\1sc>
>
> >
>
> > All directory from root was listed, it crashed after...
>
>
>
> I can verify this. Lookng at the code, it seems the author
>
> got really confused about his own use of pointers :-). The
>
> code around "struct dirent *(*namelist[])" in scandir() is rather
>
> messy even for a C-expert.
>
>
>
> Anyway, the last free in scandirtest.c should IMHO be:
>
> free(*namelist);
>
>
>
> and not 'free(namelist)' .
>
>
>
> --gv
I doubt that this is required. I took the code from the Linux man page:
http://linux.die.net/man/3/alphasort
On my PC I cannot reproduce the crash, even on the C: drive. But I do believe that the crash occurs on your PCs.
I would suspect the use of glob() to find the amount of entries in the directory to be the cause of the problem. Try using a fixed number instead to verify that:
DIR *dirptr;
struct dirent *dir_entry;
int tdirsize = sizeof(struct dirent);
register int i=0;
int si=0;
#if 0
size_t cnt;
glob_t glob_results;
char *wildcard;
char *wildcardpos;
wildcard=calloc(_POSIX_PATH_MAX,sizeof(char));
if ((dirptr = opendir(dirname)) == NULL)
return -1;
//read number of entries in directory
strcpy(wildcard,dirname);
//remove trailing slash
wildcardpos=strrchr(wildcard,'\\');
if (strlen(wildcardpos)==strlen(wildcard)) wildcard[strlen(wildcard)-1]='\0'; //printf("hier");
//add * for all entries
strcat(wildcard,"\\*");
if(glob(wildcard, GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_NOSORT, NULL, &glob_results) == 0)
cnt = glob_results.gl_pathc +2; //add two for . and ..
globfree(&glob_results);
free(wildcard);
//dynamic tdir array allocation
static struct dirent *tdir;
tdir = (struct dirent*) calloc(cnt,sizeof(struct dirent));
#else
static struct dirent *tdir[2048];
if ((dirp = opendir(dirname)) == NULL)
return -1;
#endif
if ((*namelist = (struct dirent **) calloc(cnt, sizeof(struct dirent *)))
== NULL)
return -1;
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |