100 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* 
							 | 
						||
| 
								 | 
							
								 * (c) 2005 Nico Schottelius (nico-linux at schottelius.org)
							 | 
						||
| 
								 | 
							
								 * run_svc
							 | 
						||
| 
								 | 
							
								 * part of cinit
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <errno.h>
							 | 
						||
| 
								 | 
							
								#include <fcntl.h>
							 | 
						||
| 
								 | 
							
								#include <limits.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <sys/stat.h>
							 | 
						||
| 
								 | 
							
								#include <sys/types.h>
							 | 
						||
| 
								 | 
							
								#include <sys/wait.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <unistd.h>
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "cinit.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/***********************************************************************
							 | 
						||
| 
								 | 
							
								 * read_file: return file content, each line a char*
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								char **read_file(char *file)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   int tmp;
							 | 
						||
| 
								 | 
							
								   int fd, argc;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   char buf[BUFSIZE];
							 | 
						||
| 
								 | 
							
								   char *p, *sbuf = NULL;
							 | 
						||
| 
								 | 
							
								   char  **nargv = NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   struct stat stbuf;
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   D_PRINTF("Lese Datei");
							 | 
						||
| 
								 | 
							
								   D_PRINTF(file);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   if( !stat(file,&stbuf) ) {
							 | 
						||
| 
								 | 
							
								      fd = open(file,O_RDONLY);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if(fd == -1) {
							 | 
						||
| 
								 | 
							
								         LOG("params exists, but open params failed");
							 | 
						||
| 
								 | 
							
								         return NULL;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      D_PRINTF("open ist ok");
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								      argc   = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      /* most likely one round */
							 | 
						||
| 
								 | 
							
								      while ( (tmp = read(fd,buf,BUFSIZE) ) != 0 ) {
							 | 
						||
| 
								 | 
							
								         if(tmp == -1) { 
							 | 
						||
| 
								 | 
							
								            perror("read");
							 | 
						||
| 
								 | 
							
								            return NULL;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         sbuf = realloc(sbuf,argc + tmp + 1);
							 | 
						||
| 
								 | 
							
								         strncpy(&sbuf[argc],buf,tmp);
							 | 
						||
| 
								 | 
							
								         argc += tmp;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      close(fd);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   sbuf[argc] = '\0';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   /************** build string **************/
							 | 
						||
| 
								 | 
							
								   /* The idea is to reuse the allocated memory. We'll simply
							 | 
						||
| 
								 | 
							
								   * replace the \n with \0 and set a char* to it.
							 | 
						||
| 
								 | 
							
								   * We'll lose the last byte (the initial \0), but we
							 | 
						||
| 
								 | 
							
								   * don't care, as we die some seconds later with execv() */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   argc = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   while( (p = strchr(sbuf,'\n')) ) {
							 | 
						||
| 
								 | 
							
								      nargv = realloc(nargv, sizeof(char *) * (argc + 1));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if(nargv == NULL) {
							 | 
						||
| 
								 | 
							
								            LOG("realloc failed");
							 | 
						||
| 
								 | 
							
								            return NULL;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      nargv[argc] = sbuf;
							 | 
						||
| 
								 | 
							
								      *p = '\0';
							 | 
						||
| 
								 | 
							
								      sbuf = p+1; /* is ok, as behind the last \n is a \0 */
							 | 
						||
| 
								 | 
							
								      argc++;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   /************ close argv list **************/
							 | 
						||
| 
								 | 
							
								   nargv = realloc(nargv, sizeof(char *) * (argc + 1));
							 | 
						||
| 
								 | 
							
								   if(nargv == NULL) {
							 | 
						||
| 
								 | 
							
								      LOG("realloc failed");
							 | 
						||
| 
								 | 
							
								      return NULL;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   nargv[argc] = NULL;  /* terminate argv list */
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   return nargv;
							 | 
						||
| 
								 | 
							
								}
							 |