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; }
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(); }
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; }
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); }
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); } }
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; }