Enkelt shell skrivet i C

Tänkte snabbt lägga upp koden som vi gjorde i en skoluppgift. Uppgiften gick ut på att skapa en del i ett shell-script, närmare bestämt den delen där kommandon som skrivs i shellet ”pipas”.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
 
#include <sys/types.h>
#include <sys/wait.h>
 
/* The array below will hold the arguments: args[0] is the command. */
static char* args[512];
pid_t pid;
int command_pipe[2];
 
#define READ  0
#define WRITE 1
 
/*
 * Handle commands separatly
 * input: return value from previous command (useful for pipe file descriptor)
 * first: 1 if first command in pipe-sequence (no input from previous pipe)
 * last: 1 if last command in pipe-sequence (no input from previous pipe)
 *
 * EXAMPLE: If you type "ls | grep shell | wc" in your shell:
 *    fd1 = command(0, 1, 0), with args[0] = "ls"
 *    fd2 = command(fd1, 0, 0), with args[0] = "grep" and args[1] = "shell"
 *    fd3 = command(fd2, 0, 1), with args[0] = "wc"
 *
 * So if 'command' returns a file descriptor, the next 'command' has this
 * descriptor as its 'input'.
 */
static int command(int input, int first, int last)
{
	int pipettes[2];
 
	/* Invoke pipe */
	pipe( pipettes );	
	pid = fork();
 
	/*
	 SCHEME:
	 	STDIN --> O --> O --> O --> STDOUT
	*/
 
	if (pid == 0) {
		if (first == 1 && last == 0 && input == 0) {
			// First command
			dup2( pipettes[WRITE], STDOUT_FILENO );
		} else if (first == 0 && last == 0 && input != 0) {
			// Middle command
			dup2(input, STDIN_FILENO);
			dup2(pipettes[WRITE], STDOUT_FILENO);
		} else {
			// Last command
			dup2( input, STDIN_FILENO );
		}
 
		if (execvp( args[0], args) == -1)
			_exit(EXIT_FAILURE); // If child fails
	}
 
	if (input != 0) 
		close(input);
 
	// Nothing more needs to be written
	close(pipettes[WRITE]);
 
	// If it's the last command, nothing more needs to be read
	if (last == 1)
		close(pipettes[READ]);
 
	return pipettes[READ];
}
 
/* Final cleanup, 'wait' for processes to terminate.
 *  n : Number of times 'command' was invoked.
 */
static void cleanup(int n)
{
	int i;
	for (i = 0; i < n; ++i) 
		wait(NULL); 
}
 
static int run(char* cmd, int input, int first, int last);
static char line[1024];
static int n = 0; /* number of calls to 'command' */
 
int main()
{
	printf("SIMPLE SHELL: Type 'exit' or send EOF to exit.\n");
	while (1) {
		/* Print the command prompt */
		printf("$> ");
		fflush(NULL);
 
		/* Read a command line */
		if (!fgets(line, 1024, stdin)) 
			return 0;
 
		int input = 0;
		int first = 1;
 
		char* cmd = line;
		char* next = strchr(cmd, '|'); /* Find first '|' */
 
		while (next != NULL) {
			/* 'next' points to '|' */
			*next = '\0';
			input = run(cmd, input, first, 0);
 
			cmd = next + 1;
			next = strchr(cmd, '|'); /* Find next '|' */
			first = 0;
		}
		input = run(cmd, input, first, 1);
		cleanup(n);
		n = 0;
	}
	return 0;
}
 
static void split(char* cmd);
 
static int run(char* cmd, int input, int first, int last)
{
	split(cmd);
	if (args[0] != NULL) {
		if (strcmp(args[0], "exit") == 0) 
			exit(0);
		n += 1;
		return command(input, first, last);
	}
	return 0;
}
 
static char* skipwhite(char* s)
{
	while (isspace(*s)) ++s;
	return s;
}
 
static void split(char* cmd)
{
	cmd = skipwhite(cmd);
	char* next = strchr(cmd, ' ');
	int i = 0;
 
	while(next != NULL) {
		next[0] = '\0';
		args[i] = cmd;
		++i;
		cmd = skipwhite(next + 1);
		next = strchr(cmd, ' ');
	}
 
	if (cmd[0] != '\0') {
		args[i] = cmd;
		next = strchr(cmd, '\n');
		next[0] = '\0';
		++i; 
	}
 
	args[i] = NULL;
}

Byte till Mozilla Weave

Förra måndagen var jag i Stockholm på Geek Meet hos Creuna och lyssnade på Christopher Blizzard. Christophers föredrag handlade först och främst om HTML5, men med stora inslag om hur Mozilla som organisation fungerade samt vilka produkter de utvecklar.

Något som ligger Mozilla och mig varmt om hjärtat är integritet och öppen källkod. Alla Mozillas produkter är öppen källkod som jag förstått det, och i alla deras produkter så står integritet högt i priolistan.

För att lösa synkroniseringen av data mellan flera datorer så har jag tidigare använt Xmarks, men för någon vecka sedan släpptes Mozilla Weave. När det släpptes så tänkte jag låta det mogna lite innan jag provade det, men efter Christophers föredrag och hans entusiasm över det så tänkte jag att det var lika bra att göra slag i sak och testa det så fort jag kom hem.

Christopher bekräftade mina misstankar att Xmarks läser av datan som sparas hos dem, och jag har känt en längre tid att jag inte alls gillade det. Weave å andra sidan sparar allt hos dem som en enda stor blob som inte ens de kan läsa av (inte utan min nyckel).

Weave gör följande:

  • Synkroniserar dina tabbar, så du kan fortsätta det du gör på en annan dator
  • Synkroniserar bokmärken, lösenord och Personas,

I kommande versioner är det meningen att Weave ska synkronisera dina tillägg också, något jag verkligen ser fram emot.

Jag har läst på forum att Weave buggar för många, men jag har inte märkt av några problem än så länge. Om någon vecka kan jag nog gå in och ta bort mitt konto hos Xmarks.

Så ett hett tips är: Mozilla Weave!

Blandad information om Shopp

Jag får ganska mycket frågor om Wordpress-tillägget Shopp som jag är inblandad i, så jag tänkte ta tillfället i akt och skriva om det.

Payson-betalningsmodul

Det finns en betalningsmodul för Payson att köpa som tillägg i Shopp. Jag är inte ansvarig för utvecklingen av den, det sköter Ingenesis Ltd (företaget bakom Shopp), däremot så har jag hjälpt till i utvecklingen.

Det har även kommit till min kännedom att det finns ex. rabatter inte fungerar fullt ut, vi får se ifall Ingenesis Ltd väljer att åtgärda dessa innan 1.1 (se mer nedan).

Svenska översättningen

Jag underhåller och uppdaterar för närvarande den svenska översättningen av Shopp. Hittar ni någon översättning som inte stämmer eller någon som saknas någonstans i systemet, kontakta mig så ska jag försöka ordna det.

Shopp 1.1

Jag är med i beta-teamet för Shopp, det innebär att jag hjälper till att hitta buggar och kan lägga in förslag på nya funktioner. Det var tänkt att det skulle bli en 1.0.18 av Shopp,  men den idén har slopats och de kommer att satsa på 1.1 Jag vet inte när 1.0.18 kommer. Förhoppningsvis dyker en alpha-version upp ganska kort (~1 vecka).

Några av nyheterna i 1.1

  • Ny hantering av betalningsmoduler/fraktmoduler
    Systemet som finns just nu för att skriva egna betalningslösningar/fraktmoduler är rent ut sagt obegripligt. Det kommer att ändras till det bättre och förhoppningsvis bli riktigt bra!
  • Moms
    Just nu finns det inga möjligheter att sätta specifik moms på vissa produkter, det kommer förhoppningsvis att komma med i 1.1
  • Sessionshantering
    I dagsläget är det ganska rörigt att hålla koll på sessioner som skapas i Shopp och Wordpress. Drömmen vore ifall Wordpress implementerade ett eget system som andra tillägg kan ”hooka” in sig på, men jag har inte sett något om det på deras tidsplan.

Ni kan läsa tidsplanen i sin helhet på Shopps webbplats: Beta_Team:Roadmap

© Copyright 2002 - 2010 Anders Hassis

Byggt på Notes Blog Core