#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <malloc.h>

int statfile(int fd)
{
    struct stat info;

    if (fstat(fd,&info)) {
    	perror("stat");
    	return(-1);
    }
    return(info.st_nlink);
}

void printnlink(int fd)
{
    int nlink;

    if ((nlink=statfile(fd))<0) {
	exit(1);
    }
    printf("Number of hard links:\t%u\n",nlink);  
}

int main(int argc, char *argv[])
{
    int fd,nlink;
    char *name,*newname;
    struct stat info;

    
    if (argc<2) {
	fprintf(stderr,"Usage\n\t%s <file>\n",argv[0]);
	exit(1);
    }
    name=argv[1];

    if ((fd=open(name,O_RDONLY))<0) {
	fprintf(stderr,"%s:",name);
	perror("open");
	exit(1);
    }

    printnlink(fd);
    printf("Creating new (hard) link to file %s\n",name);
    if (!(newname=malloc(strlen(name)+3))) {
	perror("malloc");
	exit(1);
    }

    strcpy(newname,name);
    strcat(newname,"-1");

    if (link(name,newname)<0) {
	perror("link");
	exit(1);
    }

    printnlink(fd);

    printf("Removing (hard) link to file %s\n",name);
    unlink(name);
    printnlink(fd);

    if (close(fd)) perror("close");

    if (rename(newname,name)<0) {
	perror("rename");
	exit(1);
    }

}