#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

void recurse(char *dir);

int count;

int main (int argc, char* argv[]) {

  if (argc != 2) {
    fprintf(stderr, "%s <directory>\n", argv[0]);
    return 1;
  }

  count = 0;
  recurse(argv[1]);
  printf ("%d\n", count);

  return 0;

}

void recurse(char *dir) {

  DIR *a;
  struct dirent* b;
  struct stat s;
  int dirlen, fnlen;
  char* newpath;

  /* printf("%s\n", dir); */

  dirlen = strlen(dir);

  a = opendir(dir);

  if (a == NULL) {
    fprintf(stderr, "Unable to read directory %s: %s\n", dir, strerror(errno));
  } else {
    
    for (b = readdir(a); b != NULL; b = readdir(a)) {
      fnlen = strlen(b->d_name);
      if ((fnlen == 1) && (strcmp(b->d_name, ".") == 0)){
	continue;
      }
      if ((fnlen == 2) && (strcmp(b->d_name, "..") == 0)) {
	continue;
      }
      newpath = malloc(dirlen + 2 + fnlen);
      strcpy(newpath, dir);
      strcpy(newpath + dirlen, "/");
      strcpy(newpath + dirlen + 1, b->d_name);
      newpath[dirlen + fnlen + 1] = '\0';
      if (stat(newpath, &s) < 0) {
	fprintf(stderr, "Unable to stat %s: %s\n", b->d_name, strerror(errno));
	free(newpath);
	continue;
      } else {
	if (S_ISDIR(s.st_mode)) {
	  recurse(newpath);
	} else {
	  count++;
	}
      }
      free(newpath);
    }
  }
  closedir(a);
}

