problem with devfs

shmach at osprey.net shmach at osprey.net
Wed Jul 20 05:50:34 GMT 2005


Hello everyone,

I'm a CS student, and this previous semester I took a unix class where our
teacher gave us some code for an assignment, with the goal being to compile and
install it.  The jist of it was the program created a device in /dev called
voice, which would "speak" whatever was written to it using festival. I
thought this was kinda spiffy, and tried to install it on my system at home,
freebsd 5.3.  The program tries to write to /dev, and because 5.3
uses devfs, /dev is read only, so it obviously fails. I thought that maybe using
mknod would allow me to create a device, but the man page for mknod states that
it can "be used to recreate deleted device nodes under a devfs(5) mount point by
invoking it using dummy arguments", but that doesn't really help me here as the
device node never existed in the first place.  

So, I guess I want to know if there's a way to override devfs, or would
I have to write a kernel module in order to get thing to install in /dev.
I don't know how to write device drivers, but I'm willing to give anything a
try. :)

what follows is the code. if anyone's interested, the code is also available
for download from my
teacher's site: http://www.emporia.edu/math-cs/simpson/bsimpson.htm
The version I'm using is 1.0.

#define FIFO_BUFFER_SIZE 4096
#define FIFO_NAME "/dev/voice"
#define FESTIVAL "/usr/local/bin/festival"
#define LOCAL "localhost"
#define FESTIVAL_PORT 1314
#define PHRASE_HEAD "(SayText \""
#define PHRASE_TAIL "\")"
#define INSTALL_PHRASE "(SayText \"/dev/voice installed\")"
#define PAUSE_INTERVAL 5
#include "config.h"
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <signal.h>
void signal_handler(int the_sig);
void signal_handler(int the_sig)
{
if(the_sig==SIGTERM)
        {
        kill(getppid(),SIGTERM);
        unlink(FIFO_NAME);
        exit(0);
        };
};
int  main()
        {
        static char buffer[FIFO_BUFFER_SIZE];
        int buffer_count,public_fifo;
        int sock,phrase_len;
        struct sockaddr_in client,server; 
        struct hostent *host;
        char *phrase;
        signal(SIGTERM,&signal_handler);
        daemon(0,0);
        if(fork()==0)
                {
                printf("in the child now\n");
                sleep(PAUSE_INTERVAL);
                host=gethostbyname(LOCAL);
                server.sin_family=AF_INET;
                server.sin_port=htons(FESTIVAL_PORT);
                memcpy(&server.sin_addr.s_addr,host->h_addr,host->h_length);
                sock=socket(AF_INET,SOCK_STREAM,0);
                client.sin_family=AF_INET;
                client.sin_port=htons(0);
                client.sin_addr.s_addr=htonl(INADDR_ANY);

                if(bind(sock,(struct sockaddr *) &client,sizeof(client)) ==
-1){ 
                        printf("couldn't bind to port\n");
                        exit(2);
                }
                        

                
                connect(sock,(struct sockaddr *)&server,sizeof(server));
                if(mkfifo(FIFO_NAME,  06660)<0)
                        {
                                printf("bad things\n");
                        if(errno==17)
                                {
                                unlink(FIFO_NAME);
                                mknod(FIFO_NAME, S_IFIFO | 0666, 0);
                                };

                        printf("there's been a fucking error...\n");
                        };
                        public_fifo=open(FIFO_NAME,O_RDWR);
                        if(public_fifo<0) {
                                printf("couldn't open fifo\n");
                                exit(1);
                        }
                        sleep(PAUSE_INTERVAL);
                       
sendto(sock,INSTALL_PHRASE,strlen(INSTALL_PHRASE),0,(struct sockaddr
*)&server,sizeof(server));
                        kill(getppid(),SIGTERM);
                        while(1)
                                {
                                memset(buffer,0x0,FIFO_BUFFER_SIZE);
                                buffer_count =
read(public_fifo,buffer,FIFO_BUFFER_SIZE);
                                if(buffer_count > 0) 
                                        {
                                        phrase=new char[12+strlen(buffer)];
                                        phrase_len=12+strlen(buffer);
                                        memset(phrase,0x0,phrase_len);
                                        strcat(phrase,PHRASE_HEAD);
                                        strcat(phrase,buffer);
                                        strcat(phrase,PHRASE_TAIL);
                                        sendto(sock,phrase,phrase_len,0,(struct
sockaddr *)&server,sizeof(server));
                                        delete phrase;
                                        kill(getppid(),SIGTERM);
                                        };
                                };
                        }
                else
                        execl(FESTIVAL,"festival","--server",(char *)NULL);     
                return 0;
        }

----------------------------------
E-Mail: shmach at osprey.net
Date: 20-Jul-2005
Time: 00:25:52

This message was sent by XFMail
----------------------------------


More information about the freebsd-questions mailing list