Soluzioni compito del 26/06/2012

Esercizio 1

foo: calcola la cifra massima della stringa $1, la pone in $a, pone in $b il resto della stringa stessa.

bar: usa foo per ordinare le cifre di $1.

Il risultato puo' essere calcolato eseguendo lo script:

#!/bin/bash

function foo (){
local i=0
local j=-1
while (( $i<${#1} )) ; do \
	if test ${1:$i:1} -gt $j ; \
		then j=${1:$i:1} ; \
	fi ; \
	i=$i+1 ; \
done
i=0
while (( $i<${#1} )) ; do \
	if test ${1:$i:1} -eq $j ; \
		then b=${1:0:$i}${1:$i+1} ; \
		break ; \
	fi ; \
	i=$i+1 ; \
done
a=$j
}

a=0
d=""
b=0

function bar(){
local i=0
local c=$1
while (( ${#c} )) ; do \
	foo $c ; \
	c=$b ; \
	d=$d$a ; \
done
}

bar $1
echo $d

Esercizio 2

Input di rpcgen:

struct input_data {
  string text<1024>;
  string delim<16>;
} 

struct output_data {
  int nwords;
  float avg_len;
}

typedef struct input_data input_data;
typedef struct output_data output_data;
typedef string help_data[SIZE_OF_HELP];

program WCPROG {
  version WCVERSION1 {
    output_data wcount(input_data) = 1;
    helpdata help(void) = 2;
  } = 1;
} = 44444;

L'implementazione consiste nell'impiegare strtok per estrarre le parole una alla volta, e calcolarne la lunghezza:

char *curr=strtok(text,delim);
int wc=0;
int tot_len=0;
while(curr) {
  wc++;
  tot_len+=strlen(curr);
  curr=strtok(NULL,delim);
}

Il valore di ritorno va inserito in una struttura analoga a quella dichiarata in XDR.

Esercizio 3

  1. wlan0 e' DOWN; ip link set wlan0 up (oppure ifconfig wlan0 up).
  2. e' disponibile una shell bash con la possibilita' di setuid; chmod a-s, da root.
  3. uccide il processo (l'handler impostato non ha effetto).