Name: Anonymous 2007-04-21 19:19 ID:KrXJSEPw
stderr always yells me a 4096 error, wtf?
try
{
1;
}
except( ... )
{
}
int main(int argc, char **argv) {
char PATH[200];
int i, n;
if(argc != 2) {
fprintf(stderr, "usage: %s [dir]\n", argv[0]);
return 1;
}
n = scandir(argv[1], &namelist, 0, alphasort);
if(n < 0) {
fprintf(stderr, "Invalid directory %s\n", argv[1]);
return 2;
}
for(i = 0; i < n; i++) {
sprintf(PATH, "%s/%s", argv[1], namelist[i]->d_name);
stat(PATH, &filestatus);
puts(namelist[i]->d_name);
free(namelist[i]);
}
free(namelist);
}
#define MAXNAME 25
typedef struct
{
long ino;
char name[MAXNAME+1];
} Ent_dir;
typedef struct
{
int fd;
Ent_dir e;
} dir;
dir *open_dir(char *namedir);
Ent_dir *read_dir(dir *fdr);
void close_dir(dir *fdr);#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "ls.h"
#include <stdlib.h>
#define S_IFMT 0170000
#define S_IFDIR 0040000
void sizef(char *);
int
main(int argc, char **argv)
{
char current = '.';
if (argc == 1)
sizef(¤t);
else
while (--argc > 0)
sizef(*++argv);
return 0;
}
void scan_dir(char *, void (*fcn) (char *));
void
sizef(char *name)
{
struct stat sttamp;
if (stat(name, &sttamp) == -1)
{
fprintf(stderr, "sizef : no access to %s\n", name);
return;
}
if ((sttamp.st_mode & S_IFMT) == S_IFDIR)
scan_dir(name, sizef);
printf("%8ld %s\n", sttamp.st_size, name);
}
#define MAXNAMES 1024
void close_dir(dir *);
void
scan_dir(char *dir, void (*fcn) (char *))
{
char name[MAXNAMES];
Ent_dir *pr;
dir *fdr;
if ((fdr = ouvrir_dir(dir)) == NULL)
{
fprintf(stderr, "scan_dir : can't open %s\n", dir);
return;
}
while ((pr = read_dir(fdr)) != NULL)
{
if (strcmp(pr->name, ".") == 0 || strcmp(pr->name, "..") == 0)
continue;
if (strlen(dir) + strlen(pr->name) + 2 > sizeof(name))
fprintf(stderr, "scan_dir : name %s%s too long", dir, pr->name);
else
{
sprintf(name, "%s%s", dir, pr->name);
(*fcn) (name);
}
close_dir(fdr);
}
}
#include <sys/dir.h>
dir *
ouvrir_dir(char *namedir)
{
int fd;
struct stat sttamp;
dir *pr;
if ((fd = open(namedir, O_RDONLY, 0) == -1 || fstat(fd, &sttamp) == -1
|| (sttamp.st_mode & S_IFMT) != S_IFDIR)
|| (pr = (dir *) malloc(sizeof(dir))) == NULL)
return NULL;
pr->fd = fd;
return pr;
}
void
close_dir(dir * pr)
{
if (pr)
{
close(pr->fd);
free(pr);
}
}
#ifndef DIRSIZ
# define DIRSIZ 14
#endif
Ent_dir *
read_dir(dir * pr)
{
struct direct tamp_dir;
static Ent_dir r;
while (read(pr->fd, (char *) &tamp_dir, sizeof(tamp_dir)) ==
sizeof(tamp_dir))
{
if (tamp_dir.d_ino == 0)
continue;
r.ino = tamp_dir.d_ino;
strncpy(r.ino, tamp_dir.d_name, DIRSIZ);
r.name[DIRSIZ] = '\0';
return &r;
}
return NULL;
}