예제 #1
0
파일: test.c 프로젝트: ramon-ga/ccp
int send_command(char *command) {
    
//int send_command(char *command) {
    //sleep(10);
    int connection;
    connection = con_open(3000);
    if (!connection) {
        perror("ERROR, Verbindungsfehler\n");
        return -1;
    }
    debug("Open Stream");

/*
    stream = fdopen(connection, "w");
    if (stream == NULL) {
        perror("ERROR, Write Stream Fehler\n");
        return -1;
    }
*/
    
    debug("Write data to stream");
    debug(command);
    // extern size_t fwrite (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s);
    //if (fwrite(command, 1, sizeof(command), stream) <= 0) {
    if( send(connection , command , strlen(command) , 0) < 0){
        perror("ERROR, Ungültiges Packet.");
        return -1;
    }
    
    char server_reply[512];
    //Receive a reply from the server
    int b = recv(connection, server_reply , 6000 , 0);
    if(b < 0)
    {
        puts("recv failed");
    }
    puts("Reply received\n");
    puts(server_reply);
    
/*
    char buffer[512];
    ssize_t nBytes;
    nBytes = recv(stream, buffer, sizeof (buffer) - 1, 0);
    if (nBytes <= 0) {
        perror("ERROR, Ungültiges Packet.");
        return -1;
    }
    printf("Response: %s\n", buffer);
*/
    debug("Finished, closing..");
    //fflush(stream);
    //fclose(stream);
    close(connection);
    
    pthread_mutex_lock(&running_mutex);
    running_threads--;
    pthread_mutex_unlock(&running_mutex);
    
    return 0;
}
예제 #2
0
파일: con.c 프로젝트: dancrossnyc/harvey
void
cmd_checkuser(void)
{
	uint8_t buf[DIRREC], *p;
	static char utime[4];

	if(con_clone(FID1, FID2)
	|| con_path(FID2, "/adm/users")
	|| con_open(FID2, 0)
	|| con_stat(FID2, (char*)buf))
		return;
	p = buf + 3*NAMELEN + 4*4;
	if(memcmp(utime, p, 4) == 0)
		return;
	memmove(utime, p, 4);
	cmd_user();
}
예제 #3
0
int main(int nArgc,char *apszArgv[])
{
	int nConsole;
	int fd_tty;
	int fd_my_tty_in;
	int fd_my_tty_out;
	char szTTY[32];
	struct console_state_t console_state;
	char cAnswer;
	key_t key;
	int nShmID;
	tSharedMem * prSharedMem;

	//
	// Завершение родительского процесса
	//
	if(fork())
	{
		goto out;
	}

	//
	// Проверить наличие уже запущенного процесса
	//
	if((key = ftok(apszArgv[0],'A'))<0)
	{
		goto out;
	}
	if( (nShmID=shmget(key,sizeof(tSharedMem),0))>=0 )
	{
		//
		// Запущенная копия найдена
		//
		if( (prSharedMem=(tSharedMem*)shmat(nShmID,0,0))<0 )
		{
			goto out2;
		}
		if(prSharedMem->nMagic != MAGIC_NUMBER)
		{
			goto out_mem2;
		}
		fd_tty = con_open(O_RDONLY);
		if(fd_tty<0)
		{
			goto out_mem2;
		}
		ioctl(fd_tty,VT_ACTIVATE,prSharedMem->nConsole);
		close(fd_tty);
out_mem2:
		shmdt(prSharedMem);
out2:
		return 0;
	}
	//
	// Процесс еще не запущен
	//
	if((nShmID=shmget(key,sizeof(tSharedMem),IPC_CREAT | PERM))<0)
	{
		goto out;
	}
	if( (prSharedMem=(tSharedMem*)shmat(nShmID,0,0))<0 )
	{
		goto out_mem_id;
	}
	prSharedMem->nMagic = MAGIC_NUMBER;

	setsid();

	//
	// Получение информации о консолях
	//
	fd_tty = con_open(O_RDONLY);
	if(fd_tty<0)
	{
		goto out_mem;
	}

	if(ioctl(fd_tty,VT_OPENQRY,&nConsole)<0)
	{
		goto out_console;
	}
	prSharedMem->nConsole = nConsole;

	if(ioctl(fd_tty,VT_GETSTATE,&console_state)<0)
	{
		goto out_console;
	}

	if(ioctl(fd_tty,VT_ACTIVATE,nConsole)<0)
	{
		goto out_console;
	}

	//
	// Открытие свободной консоли
	//
	sprintf(szTTY,"/dev/tty%d",nConsole);
	fd_my_tty_in = open(szTTY,O_RDONLY);
	fd_my_tty_out = open(szTTY,O_WRONLY);

	close(0);
	close(1);
	close(2);

	dup2(fd_my_tty_in,0);
	dup2(fd_my_tty_out,1);
	dup2(fd_my_tty_out,2);

	//
	// Работа ...
	//
	initscr();
	cbreak();
	noecho();
	nonl();
	intrflush(stdscr,FALSE);
	keypad(stdscr,TRUE);

	cAnswer = ShowMessage();

	clear();
	refresh();
	doupdate();

	endwin();

	switch(cAnswer)
	{
		case 'R':
		case 'r':
		case 'К':
		case 'к':
			printf("Rebooting NOW\n\n");
			system("/sbin/shutdown -t3 -r now");
			goto out_console;
		case 'H':
		case 'h':
		case 'Р':
		case 'р':
			printf("Shuting down NOW\n\n");
			system("/sbin/shutdown -t3 -h now");
			goto out_console;
		case 'C':
		case 'c':
		case 'С':
		case 'с':
			printf("Shutdown Canceled\n\n");
			break;
		default:
			printf("Shutdown Canceled via invalid input\n\n");
			break;
	}
	//
	// ////////////////////////////////////////////////////////////////////////
	//

	//
	// Закрытие консоли
	//
	close(fd_my_tty_out);
	close(fd_my_tty_in);
	close(0);
	close(1);
	close(2);

	//
	// Возвратить на место старую консоль
	//
	ioctl(fd_tty,VT_ACTIVATE,(int)console_state.v_active);
	//
	// Удалить консоль
	//
	ioctl(fd_tty,VT_DISALLOCATE,nConsole);

out_console:
	close(fd_tty);
out_mem:
	shmdt(prSharedMem);
out_mem_id:
	shmctl(nShmID, IPC_RMID, 0);
out:
	return 0;
}
예제 #4
0
void
cmd_users(int argc, char *argv[])
{
	Uid *ui;
	int u, g, o, line;
	char *file, *p, *uname, *ulead, *unext;

	file = "/adm/users";
	if(argc > 1)
		file = argv[1];

	if(strcmp(file, "default") == 0) {
		setminusers();
		return;
	}

	uidgc.uidbuf = getbuf(devnone, Cuidbuf, 0);
	if(walkto(file) || con_open(FID2, 0)) {
		print("cmd_users: cannot access %s\n", file);
		putbuf(uidgc.uidbuf);
		return;
	}

	uidgc.flen = 0;
	uidgc.find = 0;
	cons.offset = 0;
	cons.nuid = 0;

	u = 0;
	line = 0;
	while(readln(buf, sizeof buf) != 0) {
		line++;
		p = getword(buf, L':', "no : after number", line);
		if(p == nil)
			continue;
		ulead = getword(p, L':', "no : after name", line);
		if(ulead == nil)
			continue;

		if(strlen(p) > NAMELEN-1) {
			print("%s: name too long\n", p);
			continue;
		}
		strcpy(uid[u].name, p);
		uid[u].uid = number(buf, 0, 10);
		uid[u].lead = 0;
		uid[u].ngrp = 0;
		u++;
		if(u >= conf.nuid) {
			print("conf.nuid too small (%ld)\n", conf.nuid);
			break;
		}
	}

	/* Sorted by uid for use in uidtostr */
	wlock(&uidgc.uidlock);
	qsort(uid, u, sizeof(uid[0]), byuid);
	cons.nuid = u;
	wunlock(&uidgc.uidlock);

	/* Parse group table */
	uidgc.flen = 0;
	uidgc.find = 0;
	cons.offset = 0;
	cons.ngid = 0;

	g = 0;
	line = 0;
	while(readln(buf, sizeof buf) != 0) {
		line++;
		uname = getword(buf, L':', 0, 0);	/* skip number */
		if(uname == nil)
			continue;

		ulead = getword(uname, L':', 0, 0);	/* skip name */
		if(ulead == nil)
			continue;

		p = getword(ulead, L':', "no : after leader", line);
		if(p == nil)
			continue;

		ui = uidpstr(uname);
		if(ui == nil)
			continue;

		/* set to owner if name not known */
		ui->lead = 0;
		if(ulead[0]) {
			o = strtouid(ulead);
			if(o >= 0)
				ui->lead = o;
			else
				ui->lead = ui->uid;
		}
		ui->gtab = &gidspace[g];
		ui->ngrp = 0;
		while (p != nil) {
			unext = getword(p, L',', 0, 0);
			o = strtouid(p);
			if(o >= 0) {
				gidspace[g++] = o;
				ui->ngrp++;
			}
			p = unext;
		}
	}

	cons.ngid = g;

	putbuf(uidgc.uidbuf);
	print("%d uids read, %d groups used\n", cons.nuid, cons.ngid);
}
예제 #5
0
void
do_newuser(int argc, char *argv[])
{
	int i, l, n, nuid;
	char *p, *md, *q;
	Rune *r;
	Userid *s;
	Uid *ui, *u2;

	nuid = 10000;
	md = 0;
	if(argc == 2) {
		nuid = 1;
		argv[2] = ":";
	}

	for(r = ichar; *r; r++)
		if(utfrune(argv[1], *r)) {
			print("illegal character in name\n");
			return;
		}
	if(strlen(argv[1]) > NAMELEN-1) {
		print("name %s too long\n", argv[1]);
		return;
	}

	p = argv[2];
	switch(*p) {
	case '?':
		ui = chkuid(argv[1], 1);
		if(ui == 0)
			return;
		pentry(buf, ui);
		n = strlen(buf);
		p = buf;
		while(n > PRINTSIZE-5) {
			q = p;
			p += PRINTSIZE-5;
			n -= PRINTSIZE-5;
			i = *p;
			*p = 0;
			print("%s", q);
			*p = i;
		}
		print("%s\n", p);
		return;

	case ':':
		if(chkuid(argv[1], 0))
			return;
		while(uidtop(nuid) != 0)
			nuid++;
		if(cons.nuid >= conf.nuid) {
			print("conf.nuid too small (%ld)\n", conf.nuid);
			return;
		}

		wlock(&uidgc.uidlock);
		ui = &uid[cons.nuid++];
		ui->uid = nuid;
		ui->lead = 0;
		if(nuid < 10000) {
			ui->lead = ui->uid;
			md = argv[1];
		}
		strcpy(ui->name, argv[1]);
		ui->ngrp = 0;
		qsort(uid, cons.nuid, sizeof(uid[0]), byuid);
		wunlock(&uidgc.uidlock);
		break;

	case '=':
		ui = chkuid(argv[1], 1);
		if(ui == 0)
			return;
		p++;
		if(*p == '\0') {
			ui->lead = 0;
			break;
		}
		u2 = chkuid(p, 1);
		if(u2 == 0)
			return;
		ui->lead = u2->uid;
		break;

	case '+':
		ui = chkuid(argv[1], 1);
		if(ui == 0)
			return;
		p++;
		u2 = chkuid(p, 1);
		if(u2 == 0)
			return;
		if(u2->uid == ui->uid)
			return;
		if(cons.ngid+ui->ngrp+1 >= conf.gidspace) {
			print("conf.gidspace too small (%ld)\n", conf.gidspace);
			return;
		}
		for(i = 0; i < ui->ngrp; i++) {
			if(ui->gtab[i] == u2->uid) {
				print("member already in group\n");
				return;
			}
		}

		wlock(&uidgc.uidlock);
		s = gidspace+cons.ngid;
		memmove(s, ui->gtab, ui->ngrp*sizeof(*s));
		ui->gtab = s;
		s[ui->ngrp++] = u2->uid;
		cons.ngid += ui->ngrp+1;
		wunlock(&uidgc.uidlock);
		break;

	case '-':
		ui = chkuid(argv[1], 1);
		if(ui == 0)
			return;
		p++;
		u2 = chkuid(p, 1);
		if(u2 == 0)
			return;
		for(i = 0; i < ui->ngrp; i++)
			if(ui->gtab[i] == u2->uid)
				break;

		if(i == ui->ngrp) {
			print("%s not in group\n", p);
			return;
		}

		wlock(&uidgc.uidlock);
		s = ui->gtab+i;
		ui->ngrp--;
		memmove(s, s+1, (ui->ngrp-i)*sizeof(*s));
		wunlock(&uidgc.uidlock);
		break;

	default:
		if(chkuid(argv[2], 0))
			return;

		for(r = ichar; *r; r++)
			if(utfrune(argv[2], *r)) {
				print("illegal character in name\n");
				return;
			}

		ui = chkuid(argv[1], 1);
		if(ui == 0)
			return;

		if(strlen(argv[2]) > NAMELEN-1) {
			print("name %s too long\n", argv[2]);
			return;
		}

		wlock(&uidgc.uidlock);
		strcpy(ui->name, argv[2]);
		wunlock(&uidgc.uidlock);
		break;
	}


	if(walkto("/adm/users") || con_open(FID2, OWRITE|OTRUNC)) {
		print("can't open /adm/users for write\n");
		return;
	}

	cons.offset = 0;
	for(i = 0; i < cons.nuid; i++) {
		pentry(buf, &uid[i]);
		l = strlen(buf);
		n = con_write(FID2, buf, cons.offset, l);
		if(l != n)
			print("short write on /adm/users\n");
		cons.offset += n;
	}

	if(md != 0) {
		sprint(buf, "create /usr/%s %s %s 755 d", md, md, md);
		print("%s\n", buf);
		cmd_exec(buf);
	}
}
예제 #6
0
파일: con.c 프로젝트: dancrossnyc/harvey
int
adduser(char *user, int isgroup)
{
	char stat[DIRREC];
	char msg[100];
	Uid *u;
	int i, c, nu;

	/*
	 * check uniq of name
	 * and get next uid
	 */
	cmd_exec("cfs");
	cmd_exec("user");
	if(isgroup)
		nu = 9000;
	else
		nu = 0;
	for(i=0, u=uid; i<conf.nuid; i++,u++) {
		c = u->uid;
		if(c == 0)
			break;
		if(strcmp(uidspace+u->offset, user) == 0)
			return 1;
		if(c >= 9000 && !isgroup)
			continue;
		if(c > nu)
			nu = c;
	}
	nu++;
	if(isgroup){
		if(nu >= 0x10000) {
			cprint("out of group ids\n");
			return 0;
		}
	} else {
		if(nu >= 9000) {
			cprint("out of user ids\n");
			return 0;
		}
	}

	/*
	 * write onto adm/users
	 */
	if(con_clone(FID1, FID2)
	|| con_path(FID2, "/adm/users")
	|| con_open(FID2, 1)) {
		cprint("can't open /adm/users\n");
		return 0;
	}

	sprint(msg, "%d:%s:%s:\n", nu, user, user);
	cprint("add user %s", msg);
	c = strlen(msg);
	i = con_stat(FID2, stat);
	if(i){
		cprint("can't stat /adm/users: %s\n", errstring[i]);
		return 0;
	}
	i = con_write(FID2, msg, statlen(stat), c);
	if(i != c){
		cprint("short write on /adm/users: %d %d\n", c, i);
		return 0;
	}
	return 1;
}