You don't allocate space for the file names; you should. You're writing over indeterminate memory. This would probably work better:
void backupf(char *namelist, char *dirname)
{
char in_filename[MAXPATHLEN];
char out_filename[MAXPATHLEN];
char line[MAXPATHLEN];
FILE *filenames = fopen(namelist, "r");
if (filenames == NULL)
{
fprintf(stderr, "Cannot Open File\n");
exit(EXIT_FAILURE);
}
while (fgets(line, sizeof(line), filenames) != NULL)
{
snprintf(in_filename, sizeof(in_filename)"./%s\n", line);
snprintf(out_filename, sizeof(out_filename), "%s/%s\n", dirname, line);
backup(dirname, in_filename, out_filename);
}
fclose(filenames);
}