fp = fopen (fname, "r");
fp = fopen (fname, FOPEN_BINARY_READ);
fileattr_read (){    char *fname;    FILE *fp;    char *line = NULL;    size_t line_len = 0;    /* If there are no attributes, don't waste time repeatedly looking       for the CVSREP_FILEATTR file.  */    if (attr_read_attempted)	return;    /* If NULL was passed to fileattr_startdir, then it isn't kosher to look       at attributes.  */    assert (fileattr_stored_repos != NULL);    fname = xmalloc (strlen (fileattr_stored_repos)		     + 1		     + sizeof (CVSREP_FILEATTR)		     + 1);    strcpy (fname, fileattr_stored_repos);    strcat (fname, "/");    strcat (fname, CVSREP_FILEATTR);    attr_read_attempted = 1;    fp = fopen (fname, "r");    if (fp == NULL)    {	if (!existence_error (errno))	    error (0, errno, "cannot read %s", fname);	free (fname);	return;    }    attrlist = getlist ();    while (1) {	int nread;	nread = getline (&line, &line_len, fp);	if (nread < 0)	    break;	/* Remove trailing newline.  */	line[nread - 1] = '\0';	if (line[0] == 'F')	{	    char *p;	    Node *newnode;	    p = strchr (line, '\t');	    *p++ = '\0';	    newnode = getnode ();	    newnode->type = FILEATTR;	    newnode->delproc = fileattr_delproc;	    newnode->key = xstrdup (line + 1);	    newnode->data = xstrdup (p);	    addnode (attrlist, newnode);	}	else if (line[0] == 'D')	{	    char *p;	    /* Currently nothing to skip here, but for future expansion,	       ignore anything located here.  */	    p = strchr (line, '\t');	    ++p;	    fileattr_default_attrs = xstrdup (p);	}	/* else just ignore the line, for future expansion.  */    }    if (ferror (fp))	error (0, errno, "cannot read %s", fname);    if (line != NULL)	free (line);    if (fclose (fp) < 0)	error (0, errno, "cannot close %s", fname);    attrs_modified = 0;    free (fname);}